mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LIN-Master-Bibliothek


Autor: Fabian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich bin auf der Suche nach einer Bibliothek, mit der ich einen 
LIN-Master mit einem Xmega / ATmega realisieren kann. Umgesetzt werden 
soll das ganze im AVR-Studio.

Von Atmel gibts da ja 2 AN's, allerdings gehen die nur auf nen LIN-Slave 
oder auf Prozessoren, die auch die LIN-Unterstützung haben, ein. Auch 
klar ist, dass es mit jedem normalen UART funktionieren sollte (in 
Kombination mit einem geeigneten Treiber-IC), allerdings will ich das 
Rad hier nicht neu erfinden.

Falls jemand sowas schon ma gemacht hat, wäre es toll, wenn er mir das 
zukommen lassen könnte.

Alternativ könnte man auch über einen externen IC nachdenken, der diese 
Funktionalität übernimmt und z.B. über SPI angesprochen wird (gibt es 
sowas überhaupt?).

Autor: Frederik Krämer (n0ll4k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also in der AVR322 ist das mit dem Master beschrieben und man kann auch 
Source Code dazu bekommen.

Hab zwar bisher nur nen LIN Slave programmiert, aber mit der AppNote war 
das recht simpel. Vorrausgesetzt du hast passende Hardware zum testen 
da.

Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe sowas mal mit einem Arduino (also ATmega168) gemacht, war aber nur 
für einen Slave und ohne Schedule Table.

Sah dann so aus:
//#define LIN13    // for classic checksum
#define LIN20  // for enhanced checksum

#define baudrate 19200
//#define baudrate 9600
//#define baudrate 4800

void txLINframe(byte nodeID, byte num, byte data[]){
  byte P0, P1, IDfield;
  int checksum = 0;
  P0 = ((nodeID>>0) + (nodeID>>1) + (nodeID>>2) + (nodeID>>4)) & 1;
  P1 = (~((nodeID>>1) + (nodeID>>3) + (nodeID>>4) + (nodeID>>5))) & 1;
  IDfield = nodeID & 0x3F | P0<<6 | P1<<7;
  // sync break (13 bit lengths zero)
  UCSR0B &= ~(1<<TXEN0);  // disable UART
  digitalWrite(1, LOW);  // output low for 13 bit times (minimum)
  delayMicroseconds(13*1e6/baudrate);
  digitalWrite(1, HIGH);
  delayMicroseconds(1e6/baudrate);  // sync delimiter (1 to 4 bits)
  UCSR0B |= 1<<TXEN0;  // enable UART

  // sync field (0x55)
  Serial.print(0x55, BYTE);

  // ident field (ID0:5, P0:1)
  Serial.print(IDfield, BYTE);

  #ifdef LIN20
    // LIN 2.0 includes ID field in checksum calculation
    // identifiers 60 (0x3c) to 63 (0x3f) shall always use classic checksum.
    if(nodeID < 60) {
      checksum = IDfield;
    }
  #endif

  for(byte i=0; i<num; i++) {
    Serial.print(data[i], BYTE);
    checksum += byte(data[i]);  // convert to unsigned number
    if(checksum > 255) {
      checksum -= 255;
    }
  }
  checksum = ~checksum;
 
  // send checksum
  Serial.print(byte(checksum), BYTE);
}
UART muss natürlich noch initialisiert werden.

Autor: Frederik Krämer (n0ll4k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also Slave Code mit verarbeitung einer Schedule Table hab ich auch noch 
rumfliegen.

Ist aber auch echt nicht schwer. Einzige Problem war bei mir damals erst 
die Erkennung des Sync Feldes aber das hab ich dann dank Atmel AppNote 
einfach mit einer verringerung der Baudrate erreicht. Für den Master 
gilt ja das selbe. Umgesetzt wurde das ganze damals auf einem ATMega 168 
bzw ATA22XX, Name fällt mir grad nicht mehr ein aber der Chip hatte LIN 
Transceiver und 5V Spannungsversorgung mit an Board, da gibts auch son 
kleines Eval Board von Atmel von.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.