UART receive - Data Overflow

OP #2291403
Lesenswert?
• ▲
▼
Hey Leute,
wenn ein Data Overflow beim Empfangen von Zeichenketten mittels 
Receive-ISR auftritt, woran kann das liegen (auf AT90CAN128)?

Ich habe mehrere Ideen:
1. Andere Interrupts laufen und verhindern das rechtzeitige Bearbeiten 
der ISR
2. Baudrate zu schnell
3. Fehlerhafte Kabel (durch Kabelbruch schnellere, fehlerhafte 
Flankenwechsel)
4. Abarbeitung in der ISR zu lang

Bei Punkt 3. sollte dann ja auch das Framing Error Bit gesetzt werden, 
oder?

Dazu eine generelle Frage: Soweit ich das sehe, muss man in einer ISR 
die Interrupts nicht deaktivieren, richtig?

Gibt's sonst noch andere Fehlerquellen?
Gast #2291595
Lesenswert?
• ▲
▼
Thomas L. schrieb:
> 3. Fehlerhafte Kabel (durch Kabelbruch schnellere, fehlerhafte
> Flankenwechsel

Das Timing hängt allein von der Baudrate ab, nicht von dem empfangenen 
Signal. Ob das Signal nach dem Startbit innerhalb eines Frames 1 oder 
1000 Bitwechsel enthält ist wurscht. Natürlich sind die Daten dann hin, 
aber Overruns sind dadurch nicht zu erwarten.
OP #2291858
Lesenswert?
• ▲
▼
ok danke für eure Antworten.
Ich habe ein wenig getested:
1. Ist ausgeschlossen, habe alle anderen Quellen deaktiviert und eine 
bad isr installiert.
2. Baudrate ist bei 38,4 @ 16 Mhz AT90CAN128 - folglich auch 
ausgeschlossen
4. in der ISR wird nur noch der Buffer zugewiesen.

Wenn es nicht noch weitere Gründe gibt, kann es doch ein fehlerhaftes 
Kabel sein? Habe ich was bei der Initialierung übersehen?
1
#define F_CPU = 16000000UL
2
void rs232_0_init()
3
{
4
  UCSR0A = 0x00;
5
  // Communication Parameters: 8 Data, 1 Stop, No Parity
6
  UCSR0C = _BV(UCSZ01) | _BV(UCSZ00);
7
  // Set BAUD depending on F_CPU
8
  rs232_0_38400(); // Calculates baud (descriped in AVR manual)
9
  // Enable Receiver, Transmitter and Rx complete interrupts
10
  UCSR0B = _BV(RXEN0) | _BV(TXEN0) | _BV(RXCIE0);
11
}

Zur Info: Wenn nur zwei bytes hintereinander gesendet werden, ist die 
Welt in Ordnung ;-)
Gast #2292063
Lesenswert?
• ▲
▼
Thomas L. schrieb:
> Zur Info: Wenn nur zwei bytes hintereinander gesendet werden, ist die
> Welt in Ordnung ;-)

Wenn die ersten 2 Bytes O.K. sind, funktioniert die Hardware 
einwandfrei. Da der Overrun erst ab dem 3. Byte auftritt, kann man 
daraus schließen, das schon das 1.Byte nicht rechtzeitig aus dem 
UDR-FIFO gelesen wird. Ein Overrun entsteht erst, Wenn das 2 Byte große 
UDR FIFO bereits voll ist und das 3. Byte im Schieberegister vom 
nächsten Byte überschrieben wird. Also wurde innerhalb von 3 Bytes das 
UDR nicht gelesen.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.