Sync Break für LIN erzeugen

Gast #2266557
Lesenswert?

Hallo,

ich bin gerade dabei auf USART-Basis ein LIN-Protokoll zu schreiben. 
Allerdings funktioniert der Baudratenwechsel zur Erzeugung des 
Sync-Breaks nicht. Zum Baudratenwechsel möchte ich den Baudratenteiler 
per U2X1 im Register UCSR1A auf 1 bzw. 0 setzen. Der verwendete 
Controller ist ein AT90CAN128. Was gesendet wird kann ich am Oszi 
verfolgen. Im Dateianhang ist zu erkennen, dass der SyncBreak gleich 
lang ist wie das SyncField. Das SyncBreak sollte aber fast doppelt so 
lang sein?!?

Hier der Ausschnitt aus dem Code:

/* Baudrate einstellen */
UBRR1H = (103 >> 8);    //103 = 9600Baud bei 16mhz mitU2X1=0
UBRR1L = 103;

/* Asynchron, 8N1 */
UCSR1C = (0<<UMSEL1) |(0<<UPM11)|(0<<UPM10)|(0<<USBS1)| (1<<UCSZ11) 
|(1<<UCSZ10);

/* Empfänger und Sender einschalten */
UCSR1B = (1<<RXEN1) | (1<<TXEN1)| (0<<UCSZ12);
sei();

while(1)
{

UCSR1A = (0<<U2X1); //9600Baud

//Sync-Break
uart_send(0x00);
uart_send(zeichen);


UCSR1A = (1<<U2X1); //19200Baud

//Sync-Field
zeichen = 0x55;
uart_send(zeichen);

//Rest senden
...
}

Mit dem Befehl UCSR1A = (0<<U2X1) sollte die Baudrate zum Senden des 
Sync-Breaks auf 9600 zurückgestellt werden. Das Funktioniert nicht! - 
Warum?

Vielleicht findet einer im Forum den Fehler. Wäre toll. Habe bestimmt 
irgendwas übersehen...


Viele Grüße,

Jörg
Angehängte Dateien:

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