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 Zitat von HeSt Beitrag anzeigen
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