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
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
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...
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
Stell doch lieber die 9600baud in den UBBR ein anstatt U2X zu benutzen. Hast du auch den richtigen Takt bei den Fuses gewählt?
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
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.