[PIC] Räkna ut ACQT & ADCS på 18F4221

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

Re: [PIC] Räkna ut ACQT & ADCS på 18F4221

Inlägg av sodjan »

Ja, det vet vi ju inte. Det beror som sagt på vilken parameter som de
har fokuserat på. Atmel nämner även lite (på gott och ont) om hur man
kan "cut corners" för att förbättra sample per second på bekostnad av
precision. Microchip säger bara hur man ska göra för att ligga inom spec.

Hur som helst, man måste utgå från att respektive datablad är korrekt
för de kretsar/arkitekturer som de är skrivna för... :-)
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: [PIC] Räkna ut ACQT & ADCS på 18F4221

Inlägg av Pajn »

Jag har problem, jag får fel värde som dessutom svänger väldigt mycket mellan läsningarna.

Kod: Markera allt

void main() {
    LATA = 0;
    LATB = 0;
    LATC = 0;
    LATD = 0;
    LATE = 0;

    CMCON = 0x07;

    ADCON0 = 0b00000001;
    ADCON1 = 0b00001110;
    ADCON2 = 0b10100001;
    
    TRISA = 0b00000001;
    TRISB = 0;
    TRISC = 0;
    TRISD = 0;
    TRISE = 0;

    while (1) {
        ADCON0bits.GO=1; // Start A/D conversion
        while(ADCON0bits.GO==1){} //Wait till completion

        UART_putc(ADRESL);
    }
}
Jag vet att jag skippar de två högsta bitarna, men jag borde inte vara i närheten
av att använda dem då jag mäter 0.882V vilket bör ge värdet 0xB4.
Men jag får istället 0xCC 0xFE 0x60 0xFE 0x00...

Processorn är inte helt avkopplad då jag inte kunde hitta mina kondingar men det
sitter en 100nF ~5cm ifrån. Även om det inte är optimalt borde det väl inte ge så
stora fel?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: [PIC] Räkna ut ACQT & ADCS på 18F4221

Inlägg av sodjan »

Var kommer spänningen ifrån?
Hur har du verifierat 0.882 V?
Har du kollat på de 0.882 V spänningen med oscilloskop?
Har du kollat matningsspänningen med oscilloskop?
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: [PIC] Räkna ut ACQT & ADCS på 18F4221

Inlägg av Pajn »

Matningsspänningen kommer från min WISP 648. Dvs. Väggvårta>Diodbrygga+kondingar>
7805>kondning. Den programmerar ju fint så matningspänningen borde inte vara så fel.
"Mätspänningen" kommer från tempsensorn (MCP7901) som ochså matas från Wispen.

Spänningen är uppmätt med multimeter samt stämmer bra när jag räknar ut tempen.
(Diffar en grad mot en vanlig rumstermometer).

Tyvärr har jag inget oscilloskop. De är ju så jäkla dyra...
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: [PIC] Räkna ut ACQT & ADCS på 18F4221

Inlägg av sodjan »

OK.
Du får felsöka... :-)

Du har inte kommenterat något kring vad du har gjort
i ADCONx registren och jag orkar inte "avkoda" mot databladet.
Kan man inte sätta bitarna specifikt? Det kan bli tydligare.

Jag har något svagt minne om att man behöver en NOP mellan
att man sätter GO och att man testar samma bit...
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: [PIC] Räkna ut ACQT & ADCS på 18F4221

Inlägg av Pajn »

:)

Testade med NOP, men det verkar inte hjälpa.

Har inte tid nu men jag ska testa med en pot som spänningsdelare sen och se vad som händer då.

ADCON registren:

ADCON0:

Kod: Markera allt

bit 7-6 Unimplemented: Read as ‘0’
bit 5-2 CHS<3:0>: Analog Channel Select bits
0000 = Channel 0 (AN0)
0001 = Channel 1 (AN1)
0010 = Channel 2 (AN2)
0011 = Channel 3 (AN3)
0100 = Channel 4 (AN4)
0101 = Channel 5 (AN5)(1,2)
0110 = Channel 6 (AN6)(1,2)
0111 = Channel 7 (AN7)(1,2)
1000 = Channel 8 (AN8)
1001 = Channel 9 (AN9)
1010 = Channel 10 (AN10)
1011 = Channel 11 (AN11)
1100 = Channel 12 (AN12
1101 = Unimplemented(2)
1110 = Unimplemented(2)
1111 = Unimplemented(2)
Note 1: These channels are not implemented on 28-pin devices.
2: Performing a conversion on unimplemented channels will return a floating input
measurement.
bit 1 GO/DONE: A/D Conversion Status bit
When ADON = 1:
1 = A/D conversion in progress
0 = A/D Idle
bit 0 ADON: A/D On bit
1 = A/D converter module is enabled
0 = A/D converter module is disabled
ADCON0 = 0b00000001; bör ge Channel 0, A/D Idle, A/D "på"

ADCON1:

Kod: Markera allt

bit 7-6 Unimplemented: Read as ‘0’
bit 5 VCFG1: Voltage Reference Configuration bit (VREF- source)
1 = VREF- (AN2)
0 = VSS
bit 4 VCFG0: Voltage Reference Configuration bit (VREF+ source)
1 = VREF+ (AN3)
0 = VDD
bit 3-0 PCFG<3:0>: A/D Port Configuration Control bits
ADCON1 = 0b00001110; bar vara VSS och VDD som ref samt AN0 som analog (fick inte med tabellen, men det borde inte vara felet)

ADCON2:

Kod: Markera allt

bit 7 ADFM: A/D Result Format Select bit
1 = Right justified
0 = Left justified
bit 6 Unimplemented: Read as ‘0’
bit 5-3 ACQT<2:0>: A/D Acquisition Time Select bits
111 = 20 TAD
110 = 16 TAD
101 = 12 TAD
100 = 8 TAD
011 = 6 TAD
010 = 4 TAD
001 = 2 TAD
000 = 0 TAD(1)
bit 2-0 ADCS<2:0>: A/D Conversion Clock Select bits
111 = FRC (clock derived from A/D RC oscillator)(1)
110 = FOSC/64
101 = FOSC/16
100 = FOSC/4
011 = FRC (clock derived from A/D RC oscillator)(1)
010 = FOSC/32
001 = FOSC/8
000 = FOSC/2
ADCON2 = 0b10100001; bör vara right justified, 8 TAD och FOSC/8.

Självklart menar jag inte att ni ska leta upp felet åt mig, tänkte bara om det var något riktigt nybörjarmisstag ni såg :)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: [PIC] Räkna ut ACQT & ADCS på 18F4221

Inlägg av sodjan »

> Men jag får istället 0xCC 0xFE 0x60 0xFE 0x00...

Ser du något mönster i det du får ?
Jag noterar t.ex att FE förekommer två gånger i enbart 5 värden.
Var det en tillfällighet ?

Mönster i "skräpet" kan ibland/ofta ge viktiga ledtrådar.

Det jag skulle göra är att sakta ner det hela för att kolla
om det är timing rellaterat...
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: [PIC] Räkna ut ACQT & ADCS på 18F4221

Inlägg av Pajn »

Jo 0xFE förekommer väldigt ofta och jag tror att det var med hyffsat jämna mellanrum. Jag tror att 0x06 även förekom rätt ofta. Jag ska testa med pauser senare, sitter på mobilen nu.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: [PIC] Räkna ut ACQT & ADCS på 18F4221

Inlägg av sodjan »

OK. Det tyder på något systematiskt fel, inte ett simpelt mätfel.
Som sagt, du får kolla på det igen... :-)
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: [PIC] Räkna ut ACQT & ADCS på 18F4221

Inlägg av Pajn »

Jag tror att jag kom på felet nu, visserligen vet jag inte då jag fortfarande inte är hemma och kan testa.
Min gissning är att

Kod: Markera allt

while(ADCON0bits.GO==1){} //Wait till completion
optimeras bort och bör vara

Kod: Markera allt

while(ADCON0bits.GO==1) { //Wait till completion
    Nop();
}
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: [PIC] Räkna ut ACQT & ADCS på 18F4221

Inlägg av sodjan »

Inte alls orimligt... :-)
Jag funderade lite i den riktningen.
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: [PIC] Räkna ut ACQT & ADCS på 18F4221

Inlägg av Pajn »

Jag hade fel.
Problemen var:
1. Jag hade glömt OSCCON så den tickade på 1MHz istället för 8 :P
2. Jag läste från både ADRESH & ADRESL vilket av någon anledning blev fel.

Jag förstår inte tvåan:

Kod: Markera allt

tmp = ADRESL;
funkar och blir rätt (det ska få plats på 8btar)

Kod: Markera allt

tmp = ADRESL;           // Get the 8 bit LSB result
tmp += (ADRESH << 8);   // Get the 2 bit MSB result
ger olika värden varje gång jag läser. Även fast ADRESH borde vara 0.

Det svajar fortfarande lite men inte så mycket. Jag antar att det kan bero på
tempsensorn och/eller dålig avkoppling.

Men varför blir det kajko när jag läser ADRESH? Står det data i de "överflödiga"
bitarna? Måste jag cleara ADRESH innan läsning?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: [PIC] Räkna ut ACQT & ADCS på 18F4221

Inlägg av sodjan »

Kör du med ADFM = 0 eller 1 ?

ADFM = 0 är vanligast om man vill ha 8 bitars resultat och
då läser man *enbart* från ADRESH.

Se också "9.1.6 RESULT FORMATTING" i :
http://ww1.microchip.com/downloads/en/D ... 41262E.pdf
Inte samma processor, men definitionen av ADFM ska vara den samma.
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: [PIC] Räkna ut ACQT & ADCS på 18F4221

Inlägg av Pajn »

ADFM är 1.
Jag vill ha 10bitars resultat då det behövs när det blir varmare.
Kanske var lite otydlig men det är i rummet jag är i just nu som
8bitar räcker.

EDIT: Jag ser nu vad du menar.
Jag behöver 10bitars noggrannheten, det jag menar med 8bitar ovan
är att jag har 10 bitars noggrannhet men bara upp till ~1.2V
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: [PIC] Räkna ut ACQT & ADCS på 18F4221

Inlägg av sodjan »

Äsch, jag blanade ihop ADCON1 och 2 i ett tidigare inlägg från dig... :-)
Jag *tyckte* att du körde med ADFM=0...

> tmp = ADRESL; // Get the 8 bit LSB result
> tmp += (ADRESH << 8);

Ger detta samma fenomen ? :

tmp = ADRESL; // Get the 8 bit LSB result
tmp += (ADRESH * 256);

Jag menar, så det inte är något problem med shiftarna.
Men det är ju en så enkel test så det kanske du redan har gjort...
Skriv svar