Sida 2 av 2

Postat: 20 maj 2007, 22:44:45
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)

Såhär gjorde jag

Postat: 20 maj 2007, 22:48:14
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
	}

 	
}



Postat: 20 maj 2007, 22:54:41
av sodjan
Jaha? Och?

Postat: 21 maj 2007, 00:29:02
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.

Re: Såhär gjorde jag

Postat: 21 maj 2007, 00:36:58
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"?

Postat: 21 maj 2007, 11:08:42
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...

Det fungerar

Postat: 21 maj 2007, 17:01:32
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.

Postat: 21 maj 2007, 17:20:11
av sodjan
Fint.
Om 8 bitar är tillräckligt så kan man göra så...

Postat: 21 maj 2007, 18:40:29
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.

Postat: 21 maj 2007, 19:45:27
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.

Postat: 21 maj 2007, 20:04:47
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 ?

Postat: 21 maj 2007, 21:04:16
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... :-)

Postat: 21 maj 2007, 21:47:01
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.

Postat: 22 maj 2007, 18:25:01
av sodjan
OK, du rellaterade till koden, jag talade ur ett generellt perspektiv.
Då är vi (sannolikt) överens... :-)

Postat: 22 maj 2007, 18:28:20
av bos
Ja, jag har relaterat till koden hela tiden.