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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.