Forum: Mikrocontroller und Digitale Elektronik A/D-Wandler mit dem 16Bit Register ADC auslesen?


von H. G. (ledi)


Lesenswert?

Hallo,

ich habe folgendes Beispiel, wo ich den A/D-Wandler eines ATMEGA88 
direkt über das 16-bit Register ADC auslese!
Also nicht wie üblich zuerst ADCL und dann ADCH.

Beim Versuchsaufbau funktioniert alles.

Meine Frage:

Kann ich das auch so machen, oder kann es zu Problemen führen wenn nicht 
explizit das Register ADCH gelesen wird?

1
int main(void)
2
{
3
  unsigned int x, ergebnis;
4
  DDRD = 0xFF;            // Richtungsregister Port D auf Ausgang
5
  
6
  //*** Init ADC ***
7
  ADCSRA |= (1<<ADEN);        // ADC aktivieren
8
  ADCSRA |= (1<<ADPS0)|(1<<ADPS1);  // Vorteiler auf 8
9
  ADMUX  |= (1<<REFS0);        // Uref = 5V
10
  ADMUX  |= (1<<MUX2)|(1<<MUX0);    // ADC-Kanal 5 einstellen
11
  ADMUX  |= (1<<ADLAR);        // Ausgabe linksbündig
12
  DIDR0  |= (1<<ADC5D);        // Digital Input Kanal ADC5 deaktivieren (spart Strom)
13
  
14
  //*** Dummy Readout ***
15
  ADCSRA |= (1<<ADSC);        // Start ADC-Wandlung
16
  while (ADCSRA &(1<<ADSC));      // Auf Abschluss der Konvertierung warten
17
  x = ADC;              // Das Ergebnis der 1.Wandlung in x speichern
18
  
19
    while(1)
20
    {
21
        ADCSRA |= (1<<ADSC);      // Start ADC-Wandlung
22
        while (ADCSRA &(1<<ADSC));    // Auf Abschluss der Konvertierung warten
23
        ergebnis = ADC;         // Inhalt von ADC (16-bit Wert) in ergebnis speichern
24
        ergebnis = ergebnis >> 6;    // 16-bit Wert um 6 Stellen nach rechts schieben
25
       
26
        if (ergebnis <= 672)      // Wenn Ubat <= 10,5V
27
          PORTD = 0x01;        // LED an PD0 = ON
28
        else PORTD = 0x00;        // Wenn Ubat > 10,5V LED OFF
29
    }
30
}

von spess53 (Gast)


Lesenswert?

Hi

>oder kann es zu Problemen führen wenn nicht
>explizit das Register ADCH gelesen wird?

Das macht dein Compiler schon richtig. Sieh dir mal den erzeugten 
Assemblercode an.

MfG Spess

von H. G. (ledi)


Lesenswert?

also, wenn ich mir das Stück ansehe und meine Assemblerkenntnisse noch 
nicht zu eingerostet sind, wird der Inhalt von Adresse 0x78 (das ist 
ADCL) in das Register 24 geladen.
Wo aber bleibt das Register ADCH (liegt an Adresse 0x79)?

x = ADC;  // Das Ergebnis der 1.Wandlung in x speichern
1
00000078  LDI R24,0x78    Load immediate 
2
00000079  LDI R25,0x00    Load immediate 
3
0000007A  MOVW R30,R24    Copy register pair 
4
0000007B  LDD R24,Z+0    Load indirect with displacement 
5
0000007C  LDD R25,Z+1    Load indirect with displacement 
6
0000007D  STD Y+2,R25    Store indirect with displacement 
7
0000007E  STD Y+1,R24    Store indirect with displacement

von spess53 (Gast)


Lesenswert?

Hi

>Wo aber bleibt das Register ADCH (liegt an Adresse 0x79)?

00000078  LDI R24,0x78    Load immediate     ; Adresse von ADCL
00000079  LDI R25,0x00    Load immediate     ; nach r25:r24
0000007A  MOVW R30,R24    Copy register pair ; nach Z

0000007B  LDD R24,Z+0                        ; ADCL nach r24
0000007C  LDD R25,Z+1                        ; ADCH nach r25

MfG Spess

von Reiner.S (Gast)


Lesenswert?

In R24-25 wird die Adresse von ADCL geladen.
Dann wird R24-25 nach R30-31 kopiert. R30-31 ist das 16 Bit Z-Register.
Mit LDD R24, Z+0 ADCL nach kopiert und mit
LDD R25, Z+1 ADCH nach r25 gebracht denn Z+1 = 0x0078 +1 = 0x0079.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.