ADC - immer gleicher wert in ADCH???!

Gast #273549
Lesenswert?
• ▲
▼
Hallo!

hab heute versucht meinen AD-wandler am Mega128
zum laufen zu bringen. Der versuchsaufbau ist eigentlich ganz einfach:

Am Port-pin ADC0 wird eine spannung von 2,5V angelegt (poti).
Die Referenzspannung beträgt 5V und wird extern an Aref angeschlossen.
Nach einer Single-conversion soll der wert aus ADCH (nur 8bit) binär am

byteport A ausgegeben werden (8 leds angeschlossen)
In Assembler hab ich folgendes test-programm geschrieben:

ADMUX:  REFS1 + REFS2 auf low setzen (externe Uref an Aref)
        ADCLAR auf high setzen (lese nur das high-byte ADCH)

ADCSRA: ADEN auf high und die drei Prescaler bits auf high (prescaler
128) alles andere Low (kein ADIF)

bevor ich anfange zu lesen, werden MUX0 - 4 auf low gesetzt (Channel
ADC0).
anschließend wird das ADC start-bit gesetzt (ADSC) und per schleife
wird gewartet, bis ADIF
high wird. jetzt wird das ADC Data register (ADCH) ausgelesen und auf
port A ausgegeben.

--> Ich glaube der fehler liegt an der schleife. Gibt es einen befehl
mit dem man ein einzelnes bit abfragen kann (kein I/O)
    und je nach wert weiterspringt? z.B. jump if bit ADIF = 1 oder
sowas?
    hab sowas im instructionset nicht gefunden!

Danke, Burt
Angehängte Dateien:
Gast #273551
Lesenswert?
• ▲
▼
danke für die schnelle antwort.... hab diese befehle wohl überlesen
:-D

hab meine schleife jetzt umgeschrieben und immerhin leuchten jetzt nur
noch die ersten drei leds.... aber unabhängig von der spannung an
ADC0??

Danke, Burt
Angehängte Dateien:
Gast #273553
Lesenswert?
• ▲
▼
"ldi r22, ADCH

ldi r23, 0xff
  out DDRA, r23

  out PORTA, r22"

Wenn ich das richtig sehe, wird so die Addresse von ADCH ausgegeben und
nicht der Wert, der in ADCH steht. ldi lädt immer nur eine Konstante (in
dem Fall die Addresse von ADCH) in ein Register.

"ldi r24, ADCSRA

loop:
sbrc r24, 6
jmp loop"

Ich glaub, das funktioniert so auch nicht, da mit ldi die Addresse
geladen wird. Du prüfst also in der Schleife ob ein Bit der Addresse
gesetzt ist und nicht ob ein Bit in dem Wert gesetzt ist.

I/O-Register kann man mit "in" und "out" lesen und schreiben, bei
Registern die im SRam liegen funktionieren nur "lds" und "sts"

MfG
Gast #273554
Lesenswert?
• ▲
▼
Verdammt..... das war ja völlig daneben....
ihr müsst mich entschuldigen, bin noch keine Woche AVRler.... davor hab
ich nur 8051er programmiert....

Auf jeden fall funktioniert es jetzt wie ichs mir vorgestellt hab.

@Dennis: Danke für die bemühungen. Sehr gut erklärt, habs gleich
geblickt :-))))

Danke, Burt
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.