ADCn visar spänning fast pinnen är jordad. Nybörjare. AVR

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
tokfan
Inlägg: 694
Blev medlem: 10 juni 2010, 14:05:13

ADCn visar spänning fast pinnen är jordad. Nybörjare. AVR

Inlägg av tokfan »

Hej!
Jag nöter på och klurar så jag blir tokig här men fattar inte vad jag missat denna gången.
Det gäller min XLR-kabeltestare igen.

Jag tar gärna emot alla tips som finns hur jag löser detta och hur jag får koden mer lättläslig.
Det borde ju kanske gå att klumpa ihop allt i funktioner men jag har inte så bra koll på det än.

Huvudproblemet är just nu att lysdioden som ska signalera att SHIELD_ADC får ADC-värde över 409 blir att lysa fast jag till och med
jordar den pinnen. Jag måste ha missat något.

Tanken är att en signal sänds på SEND_PIN_1 och läses av på SHIELD_ADC
sedan signal på SEND_SHIELD för att sedan läsas av på XLR1_ADC
Detta görs för att kolla att man inte missat att sätta bygel mellan dessa två i någon ände av kabeln.

Jag lägger upp koden och en skiss hur jag kopplat.
Det kan även vara kopplat fel men jag tycker jag extrakollat hundra gånger. Kanske brist i tankarna där också.

Kod: Markera allt

#include <avr/io.h>
#include <util/delay.h>
#include "xlr_tester.h"

static inline void initADC(void)
{
	ADMUX |= (1<< REFS0);
	ADCSRA |= (1<< ADPS1) | (1<< ADPS0);
	ADCSRA |= (1<< ADEN);
}

uint16_t readADC(uint8_t channel)
{
	ADMUX = (0xF0 & ADMUX) | channel;
	ADCSRA |= (1<< ADSC);
	loop_until_bit_is_clear(ADCSRA, ADSC);
	return(ADC);
}

int main(void)
{
	uint16_t adc_value_Pin1;
	uint16_t adc_value_shield;
	uint8_t result1, result2, result3, result4;
	
	initADC();
	
	TEST_DDR = 0x0F;
	BLUE_LEDS_DDR = 0xDF; 
	LED_ADC_DDR	 = 0x07;
	
	
	
	while (1) 
    {
		ADC =0;
		adc_value_shield =0;
		adc_value_Pin1=0;
		
		BLUE_LEDS_PORT = 0;
		LED_ADC_PORT &= ~(RED_LED|GREEN_LED);
		_delay_ms(500);
		//--------------- send/read signal pin 1 ---------------------------------------------
		
		
		
		TESTPORT|= SEND_PIN_1;
		
		
		adc_value_shield= readADC(SHIELD_ADC);
		
		if(adc_value_shield > 409 )
		{
			BLUE_LEDS_PORT|=	OK_LED_1;			// DETTA STEGET FUNKAR SOM DET SKA
			result1 = 1;
			
		}
		else
		{
			BLUE_LEDS_PORT &= ~OK_LED_1;
			result1 = 0;
		}
		_delay_ms(500);
		TESTPORT &= ~SEND_PIN_1;
		//----------------- send/ read shield signal--------------------------------------
		
		
		BLUE_LEDS_PORT |= SEND_SHIELD;
		
		adc_value_Pin1 = readADC(XLR1_ADC);
				
		if(adc_value_Pin1 > 409)
		{
			BLUE_LEDS_PORT|=	OK_LED_2;         // FEL!!!!  OK_LED_2 TÄNDS FAST PINNEN XLR1_ADC ÄR JORDAD
			result2 = 1;
			
		}
		else
		{
			BLUE_LEDS_PORT &= ~OK_LED_2;
			result2 = 0;
		}
		
		_delay_ms(500); 
		BLUE_LEDS_PORT &= ~SEND_SHIELD;
		
		//------------------send/ read pin2 signal----------------------------------------
		
		
		TESTPORT |= SEND_PIN_2;
		_delay_ms(20);
		
		
		
		if (TESTPIN == (SEND_PIN_2|RETURN_PIN_2))
		{
			BLUE_LEDS_PORT|= OK_LED_3;
			result3 = 1;
			
		}
		else
		{
			BLUE_LEDS_PORT &= ~OK_LED_3;
			result3 = 0;
		}
		_delay_ms(500);
		TESTPORT &= ~SEND_PIN_2;
   
	
	//----------------------send/read pin3 signal----------------------------------
	
		TESTPORT |= SEND_PIN_3;
		_delay_ms(20);
	
	
	
		if(TESTPIN == (SEND_PIN_3|RETURN_PIN_3))
		{
			BLUE_LEDS_PORT |=	OK_LED_4;
			result4 = 1;
		
		}
		else
		{
			BLUE_LEDS_PORT &= ~OK_LED_4;
			result4 = 0;
		}
		_delay_ms(500);
		TESTPORT &= ~SEND_PIN_3;
		
		if(result1 & result2 & result3 & result4)
		{
			LED_ADC_PORT |= GREEN_LED;
		}
		else
		{
			LED_ADC_PORT|= RED_LED;
		}
	
	_delay_ms(700);
	
	}
return(0);
}


Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
tokfan
Inlägg: 694
Blev medlem: 10 juni 2010, 14:05:13

Re: ADCn visar spänning fast pinnen är jordad. Nybörjare. AV

Inlägg av tokfan »

För att förtydliga: XLR kabeln har tre runda stift man löder sladdarna i.
kontakterna man kopplar in ändarna i har fyra stift på baksidan. Den lillar fyrkanten (shield) på sladden jag ritade har ett eget stift på kontakten.
Det är där jag löder fast SEND_SHIELD och SHIELD_ADC.
(kanske bara blev rörigare av denna text)

Tror det är koden det är fel på.
kan det ligga kvar något värde i adc_value_Pin1 variabeln eller något sådant?

När jag byglar ändarna som det ska vara och loopar programmet så blir kablarna godkända ca 3 gånger i rad för att sedan underkänna pin1 en gång och sedan godkänt igen.
Ostabilt skit!

någon som orkar klura?
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: ADCn visar spänning fast pinnen är jordad. Nybörjare. AV

Inlägg av Icecap »

Standardfelen är:
* fel pinne används så att mätningen är rätt men inte den önskade pinne.
* pinnen inte satt i rätt läge (står som digital och/eller utgång)
* rätt vänttid från kanalval till omvandling inte uppfylld.
tokfan
Inlägg: 694
Blev medlem: 10 juni 2010, 14:05:13

Re: ADCn visar spänning fast pinnen är jordad. Nybörjare. AV

Inlägg av tokfan »

Äntligen hittade det!!!

Har klurat i timmar nu!!!!

felet var i headerfilen bland mina hemmasnickrade defines.

Jag fattar inte skillnaden mellan att skriva t.ex PC3 och 0b00001000?
Har någon en förklaring på det?
Det funkar ju t.ex inte att skriva PORTD|= PD0 istället för PORTD|= 0b00000001?

Jag har ju använt binära 0b00000001 osv för de andra pinnarna.
Det funkade nu när jag döpte om de tre nedre till PC3, PC4,PC5.



Kod: Markera allt

//-------------PORTC--------------------------------
#define LED_ADC_DDR		DDRC
#define LED_ADC_PORT		PORTC
#define GREEN_LED			0b00000001
#define RED_LED			0b00000010
#define SPEAKER			0b00000100
#define XLR1_ADC			PC3
#define XLR4_ADC			PC4
#define SHIELD_ADC			PC5
Har det något att göra med att channel är en int i ADCread funktionen?

Kod: Markera allt

uint16_t readADC(uint8_t channel)
{
	ADMUX = (0xF0 & ADMUX) | channel;
	ADCSRA |= (1<< ADSC);
	loop_until_bit_is_clear(ADCSRA, ADSC);
	
	return(ADC);
}
Findecanor
Inlägg: 982
Blev medlem: 2 juli 2010, 23:04:07

Re: ADCn visar spänning fast pinnen är jordad. Nybörjare. AV

Inlägg av Findecanor »

Du får hålla tungan rätt i mun när det gäller bit-nummer visavi bit-mask. ( mask = (1<<nummer) ).
tokfan
Inlägg: 694
Blev medlem: 10 juni 2010, 14:05:13

Re: ADCn visar spänning fast pinnen är jordad. Nybörjare. AV

Inlägg av tokfan »

Findecanor skrev:Du får hålla tungan rätt i mun när det gäller bit-nummer visavi bit-mask. ( mask = (1<<nummer) ).
Är PC3 alltså ett macro som läses som 3 när man använder det?
Vad kallas det så jag vet vad jag ska googla?

Hur skriver ett proffs defines?

#define LED 0x04
(PORTD|= LED)

eller

#define LED 2
(PORTD|= (1<< LED)

Eller

#define LED PC2
(???????????). (fattar inte hur man använder denna)

Eller något smartare vis?
Skriv svar