Auslesen wenn ADLAR = 0 = 10bit
erst ADCL dann ADCH
Auslesen wenn ADLAR = 1 = 8bit
reicht ADCH auszulesen
BITTE das DB des ATMEGA 16 durcharbeiten ab Seite 204 http://ww1.microchip.com/downloads/e...oc/doc2466.pdf
Zitat von
HeSt
Woran es letztendlich liegt, dass eine 10-Bit Abfrage des ADCs in einer Schleife nicht normal abläuft kann ich aber auch nicht beantworten.
Bitte Seite 15 nochmal in Ruhe nachvollziehen. Dein Problem ist das du zuviel in deiner Routine umherspielst anstatt den ADC nur zu
1. Initalisieren + Testkanal** + Ergebnis verwerfen
2. Wandlungskanal auswählen
3. Ergebnis des eingestellten Kanals auslesen
** Testkanal kann auch den Eingang des Wandlers gegen 0V schalten Siehe Seite 218/219 beachten!!!!!
Hier mal ganz grob
Code:
;Einsetzen wo alle anderen Inits auch ablaufen
Init:
rcall ADC_Init
; das hier kann einzelnd im Hauptprgramm aufgerufen werden oder zusätzlich in deine Unterroutinen eingestezt werden
TEST_ADC_LESEN:
rcall ADC_channel_0 ;Kanal 0 einstellen
rcall RD_ADC ;ADC-Wandlung starten + auslesen in wrk2
ret
ADC_Init:
;hier wird AD-Wandler aktiviert und die Samplefreqnz eingestellt zwischen 50 bis 250kHz
;Teiler verfügbar von 2hochX, also bei 1Mhz nur Teiler 4/8/16 möglich
;Siehe Datenblatt Seite 220 Table 85. ADC Prescaler Selections
ldi muxr,(1<<ADEN | 0<<ADPS2 | 1<<ADPS1 | 0<<ADPS0)
out ADCSRA,muxr
rcall ADC_channel_GND
rcall RD_ADC ;ADC Testweise auslesen und Ergebnis verwerfen
ret
ADC_channel_0:
;Kanal ADC0 auf PA0 setzen mit 5V als UREF
ldi muxr,(0<<REFS1 | 1<<REFS0 | 1<<ADLAR | 0<<MUX4 | 0<<MUX3 | 0<<MUX2 | 0<<MUX1 | 0<<MUX0)
out ADMUX,muxr ;ADMUX setzen
ret
ADC_channel_GND:
;Hier wird Wandlungsreferenzspannung und der Kanal gleichzeitig gesetzt
;MUXR=128 bedeutet REFS1 = 1 und REFS0 =0 ist RESERVIERT siehe SEITE 217
ldi muxr,(0<<REFS1 | 1<<REFS0 | 1<<ADLAR | 1<<MUX4 | 1<<MUX3 | 1<<MUX2 | 1<<MUX1 | 1<<MUX0)
out ADMUX,muxr ;ADMUX setzen
ret
RD_ADC: ;Liest den selektierten ADC aus, AVCC OK
sbi ADCSRA,ADSC ;ADC Start Conversion
WADC: ;Schleife bis Messung
sbic ADCSRA,ADSC ;abgeschlossen = ADSC=0
rjmp wadc
; in wrk1,ADCL ;mit auslesen wenn ADLAR = 0
in wrk2,ADCH ;ADCH auslesen reicht bei ADLAR = 1
ret
Im Anhang deine alte Datei die ich angepasst habe
test.txt
Lesezeichen