Forum: Mikrocontroller und Digitale Elektronik Sync Break für LIN erzeugen


von Jörg (Gast)


Angehängte Dateien:

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

von Peter D. (peda)


Lesenswert?

Man könnte auch ganz profan das TXEN-Bit für die Dauer abschalten und 
vorher den Pin auf low setzen.


Peter

von Jan84 (Gast)


Lesenswert?

füge nach dem Senden mal ein "Warte, bis Zeichen gesendet wurde ein".
Dafür musste es ein Statusbit geben.
Ansonsten gab es von Atmel auch mal eine Lin Bibliothek. War aber Lin 
1.3

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.