Problem med att använda Analog ingång på PIC

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Japp, punkterna 1-7 på sidan 244 är ju inte *helt* otydliga... :-)
Speciellt punkt 4 :

4. Start conversion:
• Set GO/DONE bit (ADCON0)
fruce
Inlägg: 13
Blev medlem: 19 maj 2007, 17:50:38
Ort: Saltsjö-Boo

Såhär gjorde jag

Inlägg av fruce »

Kod: Markera allt

//ADCON0 Kontrollerar operationerna i AD-Modulen
//ADCON1 Configurerar funktionerna för portarna

void InitBatteryCheck(void)
{
ADCON0=11000001; //AD CONVERT POWERED UP
ADCON1=01001110; //AN1=ANALOG IN
}

Void BatteryCheck(void)
{
	static int Counter=0, Value=0, Temp;		//Räknare resultat och tempfil för behandling av resultat
	static char FirstPart=0, SecondPart=0;		//Variabler för att behandla första och andra delen av resultatet i registrena
	
	if(Counter<1000)
	counter++;					//Räknare räknas upp
	else if(Counter==1)
	ADCON0.GO=1;
	else
	Counter=0; 
	
	if(!Counter) 					//För att inte fylla upp bufferten måste vi vänta, dessutom måste en kondensator hinna laddas upp för att kunna läsa av ingången
	{

		if(ADCON0 & 0b00000000)			//Kolla GO-bit ifall den är redå att läsa av från analog ingång
		{
			FirstPart=ADRESH;		//Första 5 bitarna är ADRESH
			SecondPart=ADRESL;		//Sista 5 bitarna är ADRESL
	
			Temp=FirstPart;			//Första 5 bitarna läggs i Temp
			Temp<<=8;			//Temp skiftas 5 åt vänster

			Value=(Temp|SecondPart);	//Temp pollas med SecondPart som tillsammans läggs in i ByteValue
		}
		printNumber(Value,0,0,NEW_NUMBER);	//Skriv ut ByteValue som ett nummer på Column 0, Rad 0, egen funktion för displayen... funkar
	}

 	
}


sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Jaha? Och?
bos
Inlägg: 2314
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Inlägg av bos »

fruce skrev: counter++; //Räknare räknas upp
Ta det inte personligt, men den här typen av kodkommentar är inte särskilt meningsfull eftersom det inte är så svårt att lista ut vad som händer. Det brukar vara mer vettigt att spendera tid på att kommentera kod som inte är helt uppenbar, som du t.ex skrivit i koden: "Första fem bitarna är ADRESH".

Jag har alldeles för många gånger fått korrekturläsa meningslösa kommentarer i stil med det här:

Kod: Markera allt

   i := 5;            // tilldela variabeln i 5
   i := i + 4;       // öka i med 4
   writeln(i - 1);  // minska i med 2 och skriv ut
Kodskrivaren i fråga har lyssnat på folk som sagt "glöm inte kommentera din kod", men sen struntat i att tänka ut vad som är värt att skriva kommentarer till och inte. Det är förstås inget man lär sig över en natt, utan det är en träningssak som kommer allt eftersom.

Bara ett tips.
bos
Inlägg: 2314
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: Såhär gjorde jag

Inlägg av bos »

fruce skrev:

Kod: Markera allt

	if(Counter<1000)
	counter++;					//Räknare räknas upp
	else if(Counter==1)
	ADCON0.GO=1;
	else
	Counter=0; 
Varför har du en variabel som heter "counter" och en som heter "Counter"?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

[Retorisk fråga] Varför använder någon *överhuvudtaget* utvecklingsverktyg som är "case sensitive" ??? :-)

"counter" och "Counter" ska naturligtsvis vara exakt samma sak...

Sen tycker jag personligen att variablen borde heta "loop_counter",
"delay_counter", "wait_counter" eller något annat rellevant som talar
om *vad* räknaren räknar.

Det om det... :-)

Jag är fortfarande nyfiken på om det fungerar nu...
fruce
Inlägg: 13
Blev medlem: 19 maj 2007, 17:50:38
Ort: Saltsjö-Boo

Det fungerar

Inlägg av fruce »

Nu fungerar det iaf, använde bara ADRESH och left justified så kapade den bara bort två av de minst signifikanta bitarna, så man bara körde ett register.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Fint.
Om 8 bitar är tillräckligt så kan man göra så...
bos
Inlägg: 2314
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Inlägg av bos »

sodjan skrev:"counter" och "Counter" ska naturligtsvis vara exakt samma sak...
Isåfall är koden jag citerade ofungerande, för andra if-satsen (counter == 1) kommer aldrig att exekveras.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

För mig fungerar det ypperligt med case-sensitive compiler men att ha en variabel med namnet 'counter' och en annan med namnet 'Counter' kommer ALDRIG på tal, det är på tok för vilseledande!

Då hittar man på bra namn eller döper dom till 'Counter_1' och 'Counter_2' om de är så pass ospecifika.

Och ja, jag har även case-sensivity aktiverat i MPLAB, det hjälper med att hålla skärpan och ordning tycker jag.
Användarvisningsbild
BER
Inlägg: 399
Blev medlem: 9 mars 2005, 00:02:10
Ort: Östergötland

Inlägg av BER »

ADCON0 och ADCON1 är initierade med decimala tal de skall väll vara binära, har inte lus läst alla inlägg så någon annan kanske redan har sett det ?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Isåfall är koden jag citerade ofungerande,...

Jag är inte helt säker på vad du menar.
Det *jag* menar är att i ett utvecklingsverktyg *vilket som helst*,
så bör "case" inte vara signifikativt för att åtskillja variabler.

Att de som skrev C från början fick hjärnsläpp och gjorde
språket case-sensitive, gör ju inte det i sig till något som är bra...

> men att ha en variabel med namnet 'counter' och en annan med namnet 'Counter' kommer ALDRIG på tal,...

Självklart inte. Problemet uppstår när det sker av misstag.
Kan ge väldigt skumma buggar... :-)

För övrigt har BER en bra punkt... :-)
bos
Inlägg: 2314
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Inlägg av bos »

sodjan skrev:Jag är inte helt säker på vad du menar.
Se det kodblock jag citerade (dvs if(Counter<1000)... ). Författaren vill att ADCON.GO sätts till "1" om counter är "1", men den if-satsen (som handahåller infon om att counter är 1) kommer aldrig att exekveras, och därför gör inte koden det den är tänkt att göra.

Det är det jag menar. Hade väskkänsligheten varit gällande så hade det varit en annan femma, eftersom det är då två olika variabler som undersöks. Så länge det är samma variabel (vilket det nu alltså förefaller vara) så kommer - återigen - den andra if-satsen aldrig att evalueras till sant.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK, du rellaterade till koden, jag talade ur ett generellt perspektiv.
Då är vi (sannolikt) överens... :-)
bos
Inlägg: 2314
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Inlägg av bos »

Ja, jag har relaterat till koden hela tiden.
Skriv svar