Gast
#2266557
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
