Forum: Mikrocontroller und Digitale Elektronik UART Baudrate laesst sich nicht aendern!


von Fenfen ". (x24)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

"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.

von Hc Z. (mizch)


Lesenswert?

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.

von Fenfen ". (x24)


Lesenswert?

@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. :-)

von Hc Z. (mizch)


Lesenswert?

> 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
Noch kein Account? Hier anmelden.