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
Man könnte auch ganz profan das TXEN-Bit für die Dauer abschalten und vorher den Pin auf low setzen. Peter
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.