PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : USART Baudrate ändern, nur wie?



andirs18
27.09.2010, 15:56
Hallo alle zusammen,

ich muss während des Programmlaufs die Baudrate vom USART ändern, doch
leider funktioniert das nicht so ganz.
Ich baue eine LIN Kommunikation auf (AT90CAN128) und um den Syncbreak zu
senden, muss ich von 19200Baud auf 13000Baud runter gehen.

Mit dem Debugger sehe ich auch das die Baudrate im Register richtig
verändert wurde wenn ich einen Breakpoint zwischen den beiden "BAUD_Init" setze (auf 13000Baud) aber es wird trotzdem mit 19200Baud
gesendet.
Habe ich etwas übersehen oder muss ich irgendein Flag noch setzen damit
die Übertragungsrate auch so übernommen wird ?

Meine Funktion sieht wie folgt aus:


void LIN_Syncbreak()
{
// Baudrate von 19200Baud auf 13000Baud runtersetzen
// um für >677µs Syncbreak zu senden

BAUD_Init(SYNCB); // Baudrate auf 13000 setzen

lin_msg.syncbreak = 0x00; // Daten für Syncbreak = 0x00
uart_putc(lin_msg.syncbreak); // Sende Syncbreak

BAUD_Init(NORMB); // Baudrate auf 19200 setzen
}

Gruß Andi

Jaecko
27.09.2010, 16:15
Wie schaut denn die Funktion BAUD_Init() aus?
Wenn ich bei meinen AVR den Inhalt von UBRRnH und UBRRnL veränder, dann tut sich da schon was.
Notfalls noch kurz RXEN und TXEN "neu starten".

andirs18
27.09.2010, 16:43
Habe das Prob. gefunden... mit einem delay_ms(1) funktioniert es.
Die Routine wird wohl zu schnell verarbeitet, so das es erst garnicht zu den 680µs senden kommt.

Thx & danke
Andreas