Hallo, ich habe ein Problem mit der USART Initialisierung beim Atmega 16. Die Register UCSRC und UBRRH sind im gleichen Speicherbereich. Leider gelingt es mir nicht, trotz Verwendung des URSEL-Bits die Register einzeln anzusprechen. Dadurch werden mir immer bereits gesetzte Einstellungen wieder überschrieben. Weiß jemand Rat??? Grüße Jörg
> ich habe ein Problem mit der USART Initialisierung beim Atmega 16. > Die Register UCSRC und UBRRH sind im gleichen Speicherbereich. Leider > gelingt es mir nicht, trotz Verwendung des URSEL-Bits die Register > einzeln anzusprechen. > > Dadurch werden mir immer bereits gesetzte Einstellungen wieder > überschrieben. Hast du das Problem nur bei der Simulation (AVRStudio) oder auch in der Zielhardware? AVRStudio ist leider bei Weitem nicht fehlerfrei. Selbst bei einwandfreiem / funktionsfähigem Code kann AVRStudio nicht zwischen einem Schreibzugriff auf UCSRC (URSEL gesetzt) und UBRRH (URSEL gelöscht) unterscheinden, so dass bei der Simulation IMMER beide Register beschrieben werden. Gruß, Magnetus
Das Problem besteht auch bei der Hardware. Auch der Simulator (AVR STUDIO) verhält sich gleich. Also die Hardware verhält sich genau so, als ob die Register richtig angezeigt also falsch beschrieben werden. Es werden nämlich nur 5bit gesendet statt 8. DAs sit das einzige was ich definitiv sagen kann. Jörg
Hallo, hier der Code: Zur Initialisierung: void Uart0_init(void) { UCSRB = 0x00; /*disable while setting baud rate*/ UCSRA = 0x00; UCSRC = BIT(URSEL) | 0x06; /*keine AUSWIRKUNG im DEBUGGER*/ UBRRL = 0x19; /*set baud rate lo*/ UBRRH = 0x00; /*set baud rate hi UCSRB = 0x08; } /*Senden über UART**/ while ( !(UCSRA & (1<<UDRE)) ) /*Warte auf leeren Sendepuffer */ NOP(); UDR |= 0xAA; /* Synchro-Byte senden*/ while ( !(UCSRA & (1<<TXC)) ) /*Warte auf vollständige Übertragung*/ NOP(); UCSRA = UCSRA &~0x32; /*Rücksetzen des TXC Bits*/ for (i = 0; i < 255; i++) /*Warteschleife*/ { NOP(); } Bereits bei der Initialisierung wird im Debug-Mode das Schreiben von UCSRC = BIT(URSEL) | 0x06; /*keine AUSWIRKUNG im DEBUGGER*/ nicht angezeigt. Dadurch erklärt sich auch dass nur 5 Bit anstatt 8 gesendet werden.
Zum Problem: Was macht BIT(...)? Benutze doch einfach UCSSRC = (1<<URSEL) | (1<<UCSZ0) | (1<<UCSZ1); Auch deine Baudrate kann man durch Verwendung der Zahlen nicht wirklich herausfinden. Die Berechnung der Baudrate kann man ganz wunderbar dem Preprozessor überlassen. Übrigens wird in der Regel erst UBRRH und dann erst UBRRL übergeben (bin mir nicht ganz sicher, ob der Mega16 damit auch "Probleme" hat. Hast du dir die Beispiel-Initialisierung im Datenblatt (Seite 148) mal angeguckt? >UDR |= 0xAA; Sollte auch lieber UDR = 0xAA; heissen. (kanst ja mal herausfinden, was der Compiler aus deinem Konstrukt macht). Es bietet sich auch an, mal ein Blick in AVR-GCC-Tutorial zu werfen...
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.