Sida 1 av 1
10bit AD:n ger 1278 och inte 1024!!
Postat: 18 augusti 2005, 12:39:34
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);
}
Postat: 18 augusti 2005, 13:10:42
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å !?
Postat: 18 augusti 2005, 14:43:46
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.
Postat: 18 augusti 2005, 15:25:53
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 = ...
Postat: 18 augusti 2005, 18:30:45
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);
}