mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Mega8 - ADC liefert konstanten Wert


Autor: hkr1734 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich lese 4 ADC´s des Atmega8 etwa folgendermaßen aus:

1. Mux-Kanaleinstellungen ändern (auf z.B. Kanal3)
2. ADC-Starten
3. Warten bis der ADC fertig ist
4. ADC-Wert in Variablen kopieren
5. Wert der Variablen auf ein LED-Display ausgeben
->und wieder von vorn

Allerdings liefert der ADC immer einen kostanten Wert...

z.B.(0111011001->473) oder (0111011001->474)
Der Wert ändert sich aber nur bei einem Neustart der Schaltung.

Ich habe gelesen, dass die erste Messung nach dem Kanal-Wechsel immer 
schrott sein soll, aber 2-maliges Lesen hilft auch nicht.


Hat irgendwer eine Idee, woran das liegen könnte?

>PS:
>Programiert habe ich in Assembler nach dem ADC-Tutorial

Autor: Michael H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hkr1734 schrieb:
> Hat irgendwer eine Idee, woran das liegen könnte?

Na klar. Du hast einen Programmierfehler in Zeile 42.

Autor: Tim H. (hotty) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das heißt: Du sollst deinen Code hochladen. Immerhin kenn ich noch 
keinen der Weissagen kann :)

Autor: hkr1734 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, aber ich dachte, das mein vorgehen möglicherweise falsch sein 
könnte, so rein Hardwaremäßig (z.B. man muss erst 50µS warten bis man 
erneut den ADC lesen darf)

Hier also der Entscheidende Quellcode:
.include "m8def.inc"

.def temp1  = r16
.def temp2  = r17

.def WertL  = r18
.def WertH  = r19

Main:
  rcall Get_ADC_0
  rcall Ausgabe 
;Die Ausgabe funktioniert zu 100%, ewig getestet, die Daten werden korrekt ausgegeben, verwertet werden WertH und WertL


Get_ADC_0:
  ldi temp1, (1<<REFS0) | (1<<ADLAR) | (0<<Mux3) | (0<<Mux2) | (0<<Mux1) | (0<<mux0)
  ;Referenz 5V intern, Wert linksbündig, Kanal 0
  out ADMUX, temp1

  ldi temp1, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0)
  ;ADC an, Vorteiler 64
  out ADCSR, temp1
  rcall Get_ADC_lesen
ret

;^^^Gibt es für die Kanäle 0-3^^^


Get_ADC_lesen:
  sbi ADCSR, ADSC       ;ADC starten
  wait_adc:
    sbic ADCSR, ADSC
    rjmp R_wait_adc
  in WertH, ADCH
  in WertL, ADCL
ret

Achja, AVCC ist mit einem 100nF-Kondensator gegen GND angeschlossen...


Haben möglicherweise die Register r18 und r19 eine Sonderfunktion?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>  in WertH, ADCH
>  in WertL, ADCL

Falsch. Erst ADCL, dann ADCH einlesen.

MfG Spess

Autor: hkr1734 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das war ja einfach... :-)

Vielen Dank!

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.