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 | }
|