Ich arbeite gerade das ADC Tutorial durch und stehe vor folgendem Problem. Der Wert, den das ADCL/ADCH Register liefert ändert sich nicht, wenn ich den Transistor ändere, der als Eingabe dient. Lediglich, wenn ich den mC resette, ändert sich der Wert ... warum? Hat jmd eine Lösung dafür? Vielen Dank!
Liest Du die Register ADCL und ADCH in der richtigen Reihenfolge aus? Wartest Du auch wirklich, bis der ADC mit der Wandlung fertig ist, bevor Du den Wert ausliest? Außerdem ist es ziemlich sinnfrei, den Code, mit dem das Problem auftritt, nicht zu posten, aber zu vermuten, dass hier Hellseher sitzen, die den Code telepathisch auf Deinem Rechner lesen können...
... hm ... schön wärs ... ... ich lese in der Richtigen Reihenfolge ein und warte auch wirklich ... Hier mal mein Code: .include "m8def.inc" RESET: ldi r16, 0b11111111 out PORTB, r16 ldi r16, 0b11111111 out DDRB, r16 ldi r17, (1<<REFS0) ; interne Referenz AVCC (5V) und Pin PC0 out ADMUX, r17 ldi r17, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0) out ADCSRA, r17 ; ADVC aktivieren und Vorteiler = 128 MAIN: sbi ADCSRA, ADSC ; ADC starten wait_ADC_finish: ; warten, bis ADC fertig sbic ADCSRA, ADSC rjmp wait_ADC_finish in r17, ADCL com r17 out PORTB, r17 rjmp MAIN
Hä? Du liest ADCH überhaupt nicht ein. Das macht keinen Sinn. Und kann auch nicht funktionieren. ADCH MUSS immer ausgelesen werden! Ansonsten werden beide Register (ADCH und ADCL) gesperrt und der ADC kann keinen neuen Wert hineinschreiben. Du bekommst also genau einen Wert geliefert (und zwar nur das Low-Byte) und danach liest Du immer denselben Wert aus.
hm ... wie du sagtest ... vielen Dank!
1 | ... |
2 | rjmp wait_ADC_finish |
3 | |
4 | in r17, ADCL |
5 | in r18, ADCH |
6 | com r17 |
7 | out PORTB, r17 |
8 | ... |
aber kann ich das auslesen von ADCH nicht irgendwie umgehen?
> aber kann ich das auslesen von ADCH nicht irgendwie umgehen?
Nein. Ich frage mich allerdings, was der Sinn darin ist, nur das
Low-Byte auszulesen.
Hi Kleiner Auszug aus dem Datenblatt: 'If the result is left adjusted and no more than 8-bit precision is required, it is sufficient to read ADCH. Otherwise, ADCL must be read first, then ADCH, to ensure that the content of the Data Registers belongs to the same Conversion. Once ADCL is read, ADC access to Data Registers is blocked.' D.h.: wenn du das ADLAR-Bit setzt, reicht es das ADCH-Register zu lesen. Du hast dann aber nur eine Auflösung von 8 Bit. MfG Spess
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.