mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC Beispiel ohne Oversampling


Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe etwas mit dem Beispiel aus dem Tutorial gespielt.
http://www.mikrocontroller.net/articles/AVR-Tutori...

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

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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...
read_adc:
 sbic ADCSRA, ADSC       ; ADC noch beschäftigt? - nein...
 rjmp read_adc           ; ja, warten...
; ADC einlesen:
 in adlow, ADCL          ; immer zuerst LOW Byte lesen
 in adhigh, ADCH         ; danach das mittlerweile gesperrte High Byte
; Nun erstmal schnellstens die Mess-Quelle wechseln, damit sich der
; ADC auf die neue Quelle einschwingen kann und unnötige Warterei
; vermieden wird.
 ldi temp1,admux         ; ADC-Quelle einlesen
 mov temp2,temp1         ; und kopieren
 cbr temp2,15            ; nur die oberen Bits für Referenzquelle und
                         ; Result-Justage erhalten
 inc temp1               ; Mesquelle hochzählen
 andi temp1,7            ; nur die Bits der Messquelle stehen lassen
 or temp2,temp1          ; die Bits für Referenz-Quelle wieder dazu
 out admux,temp2         ; Messquelle für nächste Messung einstellen
 sbi ADCSRA, ADSC        ; den ADC wieder starten
; Nun wandelt der ADC in der Zeit, die für die Ausgabe gebraucht wird,
; schon auf dem neuen Kanal.
; In temp1 steht immernoch die neue Kanalnummer.
 dec temp1               ; alte Kanalnummer (0..7) 
 andi temp1,7            ; wiederherstellen,
 subi temp1,-'0'         ; ASCII-0 addieren (48..55, also Ziffer '0'..'7')
 rcall transmit          ; ausgeben...
 ldi temp1,':'           ; Trennzeichen zwischen Kanalnummer und Wert
 rcall transmit          ; ausgeben...
 rcall outp              ; Wert als ASCII-Ziffern ausgeben...
; (Und inzwischen klappert der ADC schon lange auf dem neuen Kanal...)
 ldi temp1, 13           ; CR als Trennzeichen
 rcall transmit          ; ausgeben...
 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...

...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.