Forum: Mikrocontroller und Digitale Elektronik USART Initialisierung Atmega162


von Anna F. (Gast)


Lesenswert?

Hallo.

Ich habe ein AVR Assembler Programm geschrieben, das Daten von einem
GPS Empfänger auswerten / anzeigen soll. Der GPS Empfänger ist an der
seriellen Schnittstelle angeschlossen. Ich habe zuerst mit dem Atmel
AT90S8515 gearbeitet und alles funktionierte super.
Nun habe ich auf den Atmega162 portiert, der 2 serielle Schnittstelle
hat. Er hat anstatt UART nun USART, aber ich stelle in der
Initialisierung ein, dass die Schnittstelle asynchron angesteuert
werden soll. Nach dem Wechsel auf den Atmega162 kommen bei mir an der
Schnittstelle nur "kryptische" Zeichen an anstatt eines NMEA GPS
Datensatzes, d.h. irgendwo wird die Schnittstelle nicht richtig
initialisiert. Hier meine Initialisierung:

sbi UCSR0A,U2X
cbi UCSR0B,UCSZ2
clr initbuf
ldi initbuf, 0b10000110 ;(1<<URSEL)|(1<<USBS)|(3<<UCSZ0)
out UCSR0C,initbuf
sbi UCSR0B,RXEN0 ; enable UART to receive data
sbi UCSR0B,RXCIE0 ; enable UART receive-interupt
clr initbuf
out UBRR0H,initbuf
ldi initbuf,95 ; Set Baud Rate to 4800 at 3.69 MHz
out UBRR0L,initbuf

sei


Der Fehler muss definit hier liegen. Die Einstellungen (Baudrate,
Stoppit, Parity etc.) sind mit dem GPS Empfänger abgeglichen. Hat
jemand eine Idee, was hier das Problem sein könnte? Falls diese
Informationen nicht reichen, kann ich noch weiteren Quelltext zur
Verfügung stellen, ich denke allerdings nicht, dass das relevant ist.

Vielen Dank,
Anna

von Steve W. (schniwie)


Lesenswert?

Ja Leider ist auch mir der Effekt aufgefallen. In AVR Studio mit der
Simmulation kann ich den 162 nicht dazubewegen nicht die Register
einzeln ansteuern zu können. Mal sehen was der Atmel Support sagt

von Rahul (Gast)


Lesenswert?

Ich kenne mich zwar nicht dolle mit AVR-asm aus, aber das Beispiel im
Datenblatt sieht etwas anders aus, wobei Atmel sich da wohl nicht
entscheiden konnte, für welche USART sie die Initialisierung machen.
(Seite 171, Comlete Datasheet)
Und dann passt das "ldi initbuf, 0b10000110" nicht zu deinem
Kommentar; ist aber irrelevant, wenn 8N1 eingestellt werden soll, und
nicht 8N2...

von Anna F. (Gast)


Lesenswert?

Mmm.... Danke für Eure Antworten.

@Rahul: Ja, ich habe das Beispiel im Datenblatt des Atmega162
angeschaut. Es stimmt, mein Code ist etwas verworren und
widersprüchlich teilweise. Das liegt daran, dass ich schon so viel
daran rumprobiert habe, schätze ich...

Also:
Durch das
sbi UCSR0A,U2X
wird die Datenrate verdoppelt, d.h. ich habe anstatt Baudrate von 4800
nun 9600, stimmt's?

Das
cbi UCSR0B,UCSZ2
ist richtig, denn ich will ja insgesamt UCSZ2=0, UCSZ1=1, UCSZ0=1, d.h.
8-Bit Character Size haben!


ldi initbuf, 0b10000110 ;(1<<URSEL)|(1<<USBS)|(3<<UCSZ0)
Hier passt der Kommentar in sofern nicht, da ich das USBS (Stopbit)
nich auf 1 setzen will, denn ich will nur 1 Stopbit setzen. Der
Kommentar ";(1<<URSEL)|(3<<UCSZ0)" wäre hier richtig, stimmt's?

Ansonsten entspricht mein Code aber doch genau dem im Atmega162
Datasheet, oder etwa nicht? Ich verstehe nicht, wo hier das Problem
liegen kann! Hat noch jemand eine Idee soweit?

Vielen Dank für Eure Hilfe,
Anna

von Rahul (Gast)


Lesenswert?

Stell doch lieber die 9600baud in den UBBR ein anstatt U2X zu benutzen.
Hast du auch den richtigen Takt bei den Fuses gewählt?

von Anna F. (Gast)


Lesenswert?

Ok, das Einstellen von 9600 als Baudrate direkt kann ich versuchen. Ich
habe dort aber schon einiges eingestellt und glaube nicht so ohne
Weiteres, dass dort das Problem liegt. Aber immerhin ändern sich die
kryptischen Zeichen ein wenig, wenn ich an der Baudrate drehe, obwohl
es immer noch kryptische Zeichen bleiben und keine vernünftigen
Daten...

Hinsichtlich Fuses kann ich mir gut vorstellen, dass hier ein Problem
liegen könnte!
Ich benutze das AVR Studio um die Fuses zu setzen. Dort habe ich auch
3.69 MHz als Taktrate eingestellt beim Oszillator. Ansonsten habe ich
bei den Fuses nichts weiter eingestellt, vor allem, weil ich da
überhaupt keine Erfahrung und Kenntnisse habe, was ich dort einstellen
muss / sollte. Kannst Du mir da evtl. weiterhelfen? Was muss ich da
beachten? Gibt es Fusebits, die ich definitiv einstellen muss? Im
Atmega162 Datasheet habe ich da nichts weiter zu gefunden.

Vielen Dank,
Anna

von Rahul (Gast)


Lesenswert?

Wie sehen deine Fuses denn aus? (Im AVR-Studio einfach den
entpsrechenden Reiter anklicken)
Z.B. ist CKDIV8 standardmässig eingeschaltet, also wird der eigentliche
Takt noch mal durch 8 geteilt.
Den Mega161 Compatibility-Mode wirst du auch nicht brauchen...
Und dann fehlt dir wahrscheinlich noch die Clocksource-Einstellung...

von Anna F. (Gast)


Lesenswert?

Bei meinen Fuses ist Folgendes eingestellt:

Boot Flash Section size=128 words Boot start address=$1F80;[BOOTSZ=11]

und

Ext. Crystal Osc.; Frequency 8.0-  MHz; Start-up time 16K CK + 65 ms;
[CKSEL=1111 SUT=11]

Die Atmega161 Compatibility-Mode hab ich nicht an und auch CKDIV8 ist
nicht gesetzt.

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.