Forum: Mikrocontroller und Digitale Elektronik ADC Beispiel ohne Oversampling


von Dieter (Gast)


Lesenswert?

Habe etwas mit dem Beispiel aus dem Tutorial gespielt.
http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC#Die_Ergebnisregister_ADCL_und_ADCH

jetzt würde ich gerne mit meinem ATMega16 alle 8 ADC kanaele nach 
einander abfragen und ueber RS232 verschicken, jedoch ohne das 
oversampling.

Wie kann ich das am besten machen?
Danke

von Dieter (Gast)


Lesenswert?

oder hat jemand ein tip wie ich das hier noch in ascii umwandeln kann:

; ADC einlesen:
    in   adlow, ADCL        ; immer zuerst LOW Byte lesen
    in   adhigh, ADCH       ; danach das mittlerweile gesperrte High 
Byte

    mov temp1, adlow
    rcall transmit
    mov temp1, adhigh

   rcall transmit
    ldi   temp1, 13          ; CR

von Hannes L. (hannes)


Lesenswert?

Ich habe so meine Probleme mit dem Programmiedrstil des Beispiels im 
Tutorial. Da wird mir zuviel gewartet. Ich arbeite da lieber mit einer 
Synchronisation mittels Timer-Interrupt.

Aber davon mal abgesehen, statt transmitt solltest Du outp aufrufen, 
wenn Du den Wert in (ASCII-) Ziffern wandeln willst. Wenn Du das 
Oversampling nicht willst, dann schmeiß die Addition und den bedingten 
Rücksprung nach sample_adc raus.

Also:
Ich gehe davon aus, dass der ADC bereits läuft...
1
read_adc:
2
 sbic ADCSRA, ADSC       ; ADC noch beschäftigt? - nein...
3
 rjmp read_adc           ; ja, warten...
4
; ADC einlesen:
5
 in adlow, ADCL          ; immer zuerst LOW Byte lesen
6
 in adhigh, ADCH         ; danach das mittlerweile gesperrte High Byte
7
; Nun erstmal schnellstens die Mess-Quelle wechseln, damit sich der
8
; ADC auf die neue Quelle einschwingen kann und unnötige Warterei
9
; vermieden wird.
10
 ldi temp1,admux         ; ADC-Quelle einlesen
11
 mov temp2,temp1         ; und kopieren
12
 cbr temp2,15            ; nur die oberen Bits für Referenzquelle und
13
                         ; Result-Justage erhalten
14
 inc temp1               ; Mesquelle hochzählen
15
 andi temp1,7            ; nur die Bits der Messquelle stehen lassen
16
 or temp2,temp1          ; die Bits für Referenz-Quelle wieder dazu
17
 out admux,temp2         ; Messquelle für nächste Messung einstellen
18
 sbi ADCSRA, ADSC        ; den ADC wieder starten
19
; Nun wandelt der ADC in der Zeit, die für die Ausgabe gebraucht wird,
20
; schon auf dem neuen Kanal.
21
; In temp1 steht immernoch die neue Kanalnummer.
22
 dec temp1               ; alte Kanalnummer (0..7) 
23
 andi temp1,7            ; wiederherstellen,
24
 subi temp1,-'0'         ; ASCII-0 addieren (48..55, also Ziffer '0'..'7')
25
 rcall transmit          ; ausgeben...
26
 ldi temp1,':'           ; Trennzeichen zwischen Kanalnummer und Wert
27
 rcall transmit          ; ausgeben...
28
 rcall outp              ; Wert als ASCII-Ziffern ausgeben...
29
; (Und inzwischen klappert der ADC schon lange auf dem neuen Kanal...)
30
 ldi temp1, 13           ; CR als Trennzeichen
31
 rcall transmit          ; ausgeben...
32
 rjmp read_adc           ; nächsten ADC-Wert auslesen...

Ich würde sowas zwar in einem vom Timer synchronisierten Prozess laufen 
lassen, aber so müsste es auch gehen. Der Code ist frei Hand und 
ungetestet, könnte also noch Fehler enthalten (was ich nicht hoffe).

Ich hoffe, ich konnte helfen...

...

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.