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