Forum: Mikrocontroller und Digitale Elektronik ADC - immer gleicher wert in ADCH???!


von Burt (Gast)


Angehängte Dateien:

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

von Hannes L. (hannes)


Lesenswert?

sbrs/sbrc können deine Freunde sein...

...

von Burt (Gast)


Angehängte Dateien:

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

von Burt (Gast)


Lesenswert?

Ach ja, mein Mega wird extern mit 16Mhz quarz getaktet....
drum hab ich eine teilung durch 128 gewählt...

16Mhz/128 = 125khz abtastrate?????!

Burt

von Dennis Strehl (Gast)


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

von Burt (Gast)


Angehängte Dateien:

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

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