mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Nochmal AT-Mega48 Probleme


Autor: Simon Küppers (Gast)
Datum:
Angehängte Dateien:

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

Autor: Simon Küppers (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Niemand? Na toll.

Autor: Andi (Gast)
Datum:

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

Autor: Andi (Gast)
Datum:

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

Autor: Simon Küppers (Gast)
Datum:
Angehängte Dateien:

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

Autor: Andi (Gast)
Datum:

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

Autor: Simon Küppers (Gast)
Datum:

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

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.