UART Baudrate laesst sich nicht aendern!

OP #1510296
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.
#1510310
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.
OP #1510335
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. :-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren