mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LIN Sync Break Erkennung


Autor: Frederik Krämer (n0ll4k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich habe folgendes Problem:

ich habe hier einen ATmega168 mit einem ATA6624 und versuche eine LIN 
Kommunikation aufzubauen.

Als Master dient ein Lipowsky Baby-LIN-RM auf welchem momentan der 
Master und der Slave emuliert werden.

Zunächst würde ich erstmal gerne eine gescheite SyncBreak und SyncField 
Erkennung programmieren. Allerdings habe ich einige Probleme mit dem 
SyncBreak.
Ich versuche selbiges über den Framing Error des UART abzufragen und 
darauf zu reagieren. Zum Debuggen habe ich erstmal 2 LEDs drangehängt. 
Eine soll aufleuchten wenn der Receive Interrupt ausgelöst wurde und die 
zweite wenn ein SyncBreak erkannt wurde. Was allerdings nicht passiert. 
Interessehalber habe ich mal anstatt den Framing Error abzufragen 
versucht auf ein 0x00 Byte zu reagieren und siehe da er springt in die 
Schleife rein.

Die Baudraten sind beide 19.2kBaud und die Systemfrequenz des ATmega ist 
8MHz über den internen RC-Oszilator.

Hat jemand eine Idee woran das liegen könnte?

Hier noch der Quellcode.
#include <stdint.h>
#include <avr/io.h>
#include <avr/interrupt.h>

#define F_CPU 8000000UL     /*  8MHz Systemtakt  */
#define USART_BAUDRATE 19200UL
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
  

volatile uint8_t ReceivedByte;

int main( void ){
  
  DDRD |= ( 1<<DDD4) | ( 1<<DDD6 ) | ( 1<<DDD7 );
  PORTD |= ( 1<<PD4 );

  UCSR0B |= (1 << RXEN0) | (1 << TXEN0); //Empfangen und Senden einschalten
  UCSR0B |= (1 << RXCIE0); //Empfangsinterrupt einschalten
  UCSR0C |=  (1 << UCSZ00) | (1 << UCSZ01); //8-Bit Kommunikation
  
  //Berechneten Baudraten Prescaler in die Entsprechenden Register schreiben
  UBRR0L = BAUD_PRESCALE;  //Niedere 8-Bit schreiben
  UBRR0H = (BAUD_PRESCALE >> 8); //Hoehere 8-Bit schreiben

  sei();
  
  while(1){

  }

  return 0;
}

ISR(USART_RX_vect){

  PORTD |= ( 1<<PD7 );  

  //if (UDR0 == 0x00){ //Frame Error durch SyncBreak hervorgerufen
  if (FE0 == 1){
    ReceivedByte = UDR0;
    
    PORTD |= ( 1<<PD6 );
  }
}

Autor: mp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist schon tausendmal  gepostet worden:
der interne RC ist ungeeignet für asynchrone Übertragung da viel zu 
ungenau.
-> externen Takt benutzen

Ich mache dasselbe mit einem ATMEGA168 und externem Quarz, das 
funktioniert so einwandfrei.

Autor: Frederik Krämer (n0ll4k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Laut Atmel soll das ganze als LIN Slave auch ohne funktionieren von 
daher bin ich mal davon ausgegangen das es auch so ist. Aber gut, jetzt 
muss ich nur nochmal schauen wo ich die SMD Kondensatoren für das 
Development Board herbekomme.

Autor: Frederik Krämer (n0ll4k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So falls es nochmal jemanden interessieren sollte.

Ich hab mich nun an der AppNote von Atmel orientiert und für die 
SyncBreak Erkennung auf die entsprechende Zeit heruntergesetzt um ein 
"korrektes" 0x00 Byte zu erkennen. Nachdem dies erkannt wurde wird die 
Baudrate wieder hochgesetzt und die Verarbeitung des Frames kann nun mit 
der korrekten Baudrate starten.

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.