10bit AD:n ger 1278 och inte 1024!!

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
fatpo83
Inlägg: 282
Blev medlem: 21 april 2004, 22:42:28
Ort: Sthlm

10bit AD:n ger 1278 och inte 1024!!

Inlägg av fatpo83 »

När jag matar kanalerna tilll 5V får jag inte 1024 utan 1278! Är det inte konstigt...har jag maskat ADRES bitarna fel eller? (pic 18f2455, C18)

Kod: Markera allt

int pic_ad_read(unsigned char channel)
{
	char i;
	int tal;
	ADCON0 = 0x01; 	 //reset channels

	ADCON0 |= (channel<<2);

	for(i=0;i<50;i++);
	ADCON0bits.GO = 1;	 //start the conversion
	while(ADCON0bits.GO == 1);
	tal	= ADRESH;										 
	tal	+= (tal<<2)+(ADRESL>>6);
	return(tal);
}
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Kan du förklara på Svenska (inte i C) vad du gör med ADRESH och ADRESL ;

Det är lite lustigt att du har satt en kommentar "start the conversion" när du sätter GO=1 (det är ju uppenbart !), men inga kommentarer alls där du shiftar runt resultatet på ett (för mig) inte helt uppenbart sätt... :-)

Sen så går detta inte att svara på i alla fall eftersom det inte framgår hur ADFM är satt. Kom igen med all rellevant info, så får vi se.

Hur vet du att du får 1278 ?
Det kan ju vara något fel i den rutin som anropar pic_ad_read också !?
Användarvisningsbild
simon78
Inlägg: 1091
Blev medlem: 8 juni 2004, 11:05:51
Ort: Vinninga/Lidköping
Kontakt:

Inlägg av simon78 »

Byt ut det ADC-registret mot konstanter och se om du får ut rätt. Det är ett bra sätt att debugga koden. Alltså att köra med kontrollerade värden så kan du se var felet ligger.
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Inlägg av cyr »

Dessa borde bli rätt...

Om du kör högerjusterat:

tal = (ADRESH<<8) | ADRESL;

Om du kör vänsterjusterat:

tal = (ADRESH<<2) | (ADRESL>>6);

Ej testat...

tal += (tal<<2)+(ADRESL>>6);

Kanske funkar om du ändrar += till = ...
fatpo83
Inlägg: 282
Blev medlem: 21 april 2004, 22:42:28
Ort: Sthlm

Inlägg av fatpo83 »

tjenare. Problemet är löst. Använder högerjustering och sätter tal = ADRES. Även tal = (ADRESH <<8) | ADRESL; fugnerar precis som cyr nämnde.

Jag kan väl också passa på o kommentera lite i koden:

Kod: Markera allt

int pic_ad_read(unsigned char channel) 
{ 
   char i; 
   int tal; 
   ADCON0 = 0x01;     //reset channels 

   ADCON0 |= (channel<<2); //select the channel desired

   for(i=0;i<50;i++);     
   ADCON0bits.GO = 1;    //start the conversion 
   while(ADCON0bits.GO == 1);  //AD busy?
//   tal   = ADRESH;  //8bit width                               
//   tal   += (tal<<2)+(ADRESL>>6); // merge ADRESH and ADRESL in order to get 10bit value, shift ADRESH left 2 steps, ADRESL contains now the rest 2 bit why shifted right 6 steps.
   
   tal=ADRES;
   return(tal); 
} 
Skriv svar