Forum: Mikrocontroller und Digitale Elektronik Nochmal AT-Mega48 Probleme


von Simon Küppers (Gast)


Angehängte Dateien:

Lesenswert?

Ich versuch im Moment den ADC auszulesen und auf die serielle
Schnittstelle zu legen. Nur aus irgndeinem Grund funktioniert das ganze
nicht wie es soll.

Code im Anhang.

Fehlerbeschreibung:

Mache ich in die Main Loop ein einfaches
ldi UART, 'A'
rcall serout
und kompiliere. dann bekomm ich ständig A's zugeschickt am PC(das
funktioniert also!)

Nehme ich das wieder raus, und tu diese Auslese-Schleife in die Main,
kommt definitiv NICHTS an am PC. Der muss wohl irgndwo in der
Busy-waitschleife stehen bleiben. Könnte mir aber nicht vorstellen
warum.

Jemand ne Idee? Ich verzweifel hier gerade

von Simon Küppers (Gast)


Lesenswert?

Niemand? Na toll.

von Andi (Gast)


Lesenswert?

Überall hast es gemacht: 1<<Bitbezeichnung um ein Bit an die richtige
Stelle zu schieben.
Statt SBR würde ich lieber "ORI" (OR immediate) verwenden, ist
umgänglicher und gibt es in jedem Prozessor.
SBR ist eine Erfindung von Atmel und genau das selbe wie ORI (siehe
Hilfe in AVR-Studio).

Hier ein paar Änderungen:

loop:
        lds     temp, ADCSRA
;        sbr     temp, ADSC
        ori     temp, 1<<ADSC
        sts     ADCSRA, temp

not_rdy:
;Anstatt auf den ADC-Interrupt würde ich lieber mit ADSC=0 prüfen,
;ob eine Konvertierung fertig ist (wird vom ADC auf 0 gesetzt, wenn
;fertig).
        lds     temp, ADCSRA
;        sbrs    temp, ADIF
        sbrc    temp, ADIF
        rjmp    not_rdy

;Was soll das? Im Prinzip wird nur das Hi-Byte seriell
;ausgegeben
;        lds     UART, ADCL
;        lds     UART, ADCH
;        rcall   serout

        lds     UART, ADCL
        rcall   serout  ;Zusätzlicher CALL
        lds     UART, ADCH
        rcall   serout

rjmp loop

Ob das die Lösung Deines Problems ist kann ich nicht versprechen aber
ein paar Fehler sind ausgemertzt.

MfG
Andi

von Andi (Gast)


Lesenswert?

Oh man, der Teil mit dem not_rdy sollte natürlich so aussehen:
not_rdy:
        lds     temp, ADCSRA
;        sbrs    temp, ADIF
        sbrc    temp, ADSC
        rjmp    not_rdy

MfG
Andi

von Simon Küppers (Gast)


Angehängte Dateien:

Lesenswert?

Nene, das mit den Bytes hab ich mir schon so gedacht ! Es SOLL nur das
High-Byte ausgegeben werden. Es gibt ja das ADLAR bit im ADCSRA
Register. Damit kann man eine andere Register anordnung aktivieren,
damit sich ganz einfach die 8 MSBs lesen lassen. die 2 LSBs liegen in
ADCL (siehe ATMEGA48 Datenblatt seite 244 oben):

When an ADC conversion is complete, the result is found in these two
registers.
When ADCL is read, the ADC Data Register is not updated until ADCH is
read. Consequently,
if the result is left adjusted and no more than 8-bit precision is
required, it is
sufficient to read ADCH. Otherwise, ADCL must be read first, then
ADCH.
The ADLAR bit in ADMUX, and the MUXn bits in ADMUX affect the way the
result is
read from the registers. If ADLAR is set, the result is left adjusted.
If ADLAR is cleared
(default), the result is right adjusted.

"...aber
ein paar Fehler sind ausgemertzt."

Tz, das hätt ich jetzt zwar nicht geglaubt, dass es an diesem ORI zeugs
liegt, aber genau das wars. Bekomme jetzt die richtigen Daten.
Funktionierender Code im Anhang, wer's brauch ;)

von Andi (Gast)


Lesenswert?

Was heißt da "Tz"?
Dir wurde geholfen und ein kleines Danke wäre angebracht!!!
Das mit dem ADLAR ist mir persöhnkich vollkommen klar und ich kann ja
nicht riechen dass das "lds UART,ADCL" ein Überbleibsel ist.
Im Prinzip lag es einfach nur daran, das Du das Bit ADSC nicht mit
1<<ADSC an die richtige Stelle gschoben hast und evtl. noch an der
Abfrage ob der ADC fertig ist.
Ob mit SBR oder ORI ist egal da, wie oben schon erwähnt, beides das
selbe ist.

MfG
Andi

von Simon Küppers (Gast)


Lesenswert?

Hallo,

Danke erstmal, ist mir vorhin untergekommen :-)
Gut, riechen kannst du es natürlich nich, aber so aus dem Zusammenhang
und der Kommentierung hätte ich das zuerst vermutet, als dass ich ein
rcall serout vergessen hab.

Trotzdem Danke vielmals. Und ich hab da gestern Abend noch dran
gezweifelt :-)

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.