UART Baudrate laesst sich nicht aendern!

OP #1510296
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.
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
@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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.