ArduFE:
Hallo,
ich bringe den Thread noch mal in den Vordergrund, damit er besser als zukünftige Informationsquelle dienen kann. Der Fragesteller hat sich ja nicht mehr gemeldet.
Der obige Link in Beitrag #5 enthält eine LIN Master Implementierung für eine Hardware Serial auf einem Arduino. Ist also für den Uno nur geeignet, wenn man auf die USB-Anbindung verzichten kann.
LIN ist weitgehend normale serielle Kommunikation, bis auf diesen Teil
// Generate a BREAK signal (a low signal for longer than a byte) across the serial line
void Lin::serialBreak(void)
{
if (serialOn) {
serial.flush();
serial.end();
}
pinMode(txPin, OUTPUT);
digitalWrite(txPin, LOW); // Send BREAK
const unsigned long int brkend = (1000000UL/((unsigned long int)serialSpd));
const unsigned long int brkbegin = brkend*LIN_BREAK_DURATION;
if (brkbegin > 16383) delay(brkbegin/1000); // delayMicroseconds unreliable above 16383 see arduino man pages
else delayMicroseconds(brkbegin);
digitalWrite(txPin, HIGH); // BREAK delimiter
if (brkend > 16383) delay(brkend/1000); // delayMicroseconds unreliable above 16383 see arduino man pages
else delayMicroseconds(brkend);
serial.begin(serialSpd);
serialOn = 1;
}
Der muss zu Fuss gemacht werden, weil die AVR UARTs keine LIN Break Unterstützung haben.
Hier alternativ eine Implementierung für den Teensy 3.x (und LC), wo Hardware LIN Unterstützung vorhanden ist:
https://github.com/MarkusLange/Teensy_3.x_LIN_Master
Da sieht das obige deutlich einfacher aus
(*PortRegister_C2) |= UART_C2_SBK;
(*PortRegister_C2) &= ~UART_C2_SBK;
Hi Danke,
ja der auf dem Teensy verwendete Chip macht es sehr einfach, diverse Register setzen und er macht es von alleine.
Für ATMega habe ich auch noch ein recht simples Beispiel, etwas brutaler als das obrige für den Break aber auch das funktioniert.
Link
Serial1.end();
pinMode(0,OUTPUT);
digitalWrite(1, LOW);
delayMicroseconds(breakfield*Tbit); //after Frame Error Tbit to Sync Field
digitalWrite(1, HIGH);
delayMicroseconds(breakdelimiter*Tbit);