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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren