Hallo, ich stehe kurz vorm Verzweifeln. Es gibt mal wieder ein Problem mit dem UART und der Baudrate. Bitte nicht die Augen verdrehen, denn zu diesem Fehler konnte ich hier im Forum keine Loesung finden. Ich verwende einen ATmega16 mit externem 8MHz Quarz. Die Baudrate berechne ich nach der "genaueren" Formel aus dem Wiki, die auch mit den Werten fuer UBBR im Datenblatt Uebereinstimmung liefert. Jedoch stimmt die Baudrate nicht mit der im UBBR ueberein (mit Jtag UBBRL/H ueberprueft)! Egal welche Werte ich waehle, es kommt immer nur nur ca. 300Baud raus (Messung mit Oszi). Ich habe keine Ahnung wieso!? Die Fusebits sind auf externen Quarz gesetzt. Daran duerfte es auch gar nicht liegen, denn dann muesste man ja wenigstens eine Veraenderung auf dem Oszi sehen koennen. Ich brauch daher dringend eure Hilfe. Danke.
"s" "xy" schrieb:
> Ich brauch daher dringend eure Hilfe. Danke.
Vorher brauchen wir aber dein Hilfe.
Ohne Code ist sowas nämlich immer nur Rätselraten.
Die Baudrate ist also viel zu niedrig, stimmt's? Hast Du beachtet, dass UBRRH und UCSRC sich dieselbe Adresse teilen und mit dem URSEL-Bit umgeschaltet werden? Viel zu niedrige Baudrates ergeben sich nämlich dann, wenn Du nach UCSRC schreiben möchtest, in Wirklichkeit aber UBRRH adressierst, weil das URSEL-Bit (0x80) nicht gesetzt ist.
@Karl Heinz Tut mir leid, den Code habe ich ganz vergessen. Ich habe ihn aus der AppNote 306 entnommen.
1 | /* Initialize USART */
|
2 | void usart_init( unsigned int baudrate ) |
3 | {
|
4 | unsigned char x; |
5 | |
6 | /* Set the baud rate */
|
7 | UBRRH = (unsigned char) (baudrate>>8); |
8 | UBRRL = (unsigned char) baudrate; |
9 | |
10 | /* Enable UART receiver and transmitter */
|
11 | UCSRB = ( ( 1 << RXCIE ) | ( 1 << RXEN ) | ( 1 << TXEN ) ); |
12 | |
13 | /* Set frame format: 8 data 1stop */
|
14 | |
15 | UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //For devices with Extended IO |
16 | |
17 | |
18 | /* Flush receive buffer */
|
19 | x = 0; |
20 | |
21 | USART_RxTail = x; |
22 | USART_RxHead = x; |
23 | USART_TxTail = x; |
24 | USART_TxHead = x; |
25 | }
|
womit wir schon beim Thema Hazeh waeren: Du hast recht, der Code aus der AppNote war wohl allgemein fuer alle Controller gehalten und das URSEL Bit nicht vorgesehen. Jetzt aendert sich die Baudrate!!! Vielen Dank euch beiden. Eine Frage haette ich noch, ist es normal dass das Jtag das UCSRC nicht auslesen kann? Ich sehe im Debugger immer nur 0x00. Im Dateblatt steht ja was drin, dass es da eine etwas aufwendige zeitabhaengige Prozedur sein soll. Naja, wie auch immer...soweit sehe ich zumindest eine Aenderung der Baudrate. :-)
> Eine Frage haette ich noch, ist es normal dass das Jtag das UCSRC nicht > auslesen kann? Ich sehe im Debugger immer nur 0x00. Die im Datenblatt beschriebene Sequenz für UCSRC dürfte über JTAG nicht zu machen sein.
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.