www.mikrocontroller.net

Forum: Compiler & IDEs ISR fuer UART in AVR


Autor: Owen Senmeis (senmeis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich benutze AT90CAN128 von Atmel und habe eine ISR-Funktion und eine 
User-Funktion für UART geschrieben. Baudrate = 19,200 bits/s, Quarz = 8 
MHz.
SIGNAL(SIG_UART0_RECV)
{
  receive_uart_data = UDR0;  // Datenbyte speichern
  new_receive_uart_data = 0x01;  // Mitteilung vom neuen Datenbyte
}

void user_application()
{
  if (new_receive_uart_data == 0x01)  
  {
  // Datenbyte bearbeiten
  new_receive_uart_data = 0x00;
  }
}
Frage : Kann das passieren, dass UART-Daten verloren gehen, wenn 
UART-Daten zu schnell ankommen ?

Gruss
Senmeis

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Owen Senmeis (senmeis)

>SIGNAL(SIG_UART0_RECV)

Das heisst beim aktuellen AVR-GCC ISR(), siehe Doku.

>Frage : Kann das passieren, dass UART-Daten verloren gehen, wenn
>UART-Daten zu schnell ankommen ?

Ja, wenn dein Programm zu viel Zeit zur Verarbeitung braucht, siehe 
Interrupt.

MFG
Falk

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja. Es können Verluste an mehreren Stellen auftreten.

1/ Die ISR läuft und es kommt ein neues Zeichen in der UART Hardware an. 
Wenn das nicht gespeichert werden kann, geht es verloren. Eher 
unwahrscheinlich bei Baudrate = 19,200 bits/s, Quarz = 8 MHz, aber je 
nach dem Restcode kann man das provozieren.

2/ user_application() wird zu selten ausgeführt. Der Puffer 
receive_uart_data ist nur ein Byte gross. Wenn zwischen zwei ISR 
Aufrufen kein user_application() Aufruf ist, geht das ältere Byte 
verloren.

3/ Man sieht die Definition von new_receive_uart_data nicht, 
insbesondere ob es volatile typisiert ist. Der Compiler kann in 
user_application() Code produzieren, der nicht berücksichtigt, dass eine 
ISR diese Variable zu einem beliebigen Zeitpunkt ändert.

Autor: Owen Senmeis (senmeis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke für die Hinweise.

Noch eine Frage zur angegebenen Anleitung "Interrupt". Zitat aus der 
Anleitung:
"D.h. während der UART selbsttätig das Zeichen sendet ist die CPU zum 
Warten verdammt."

Im Gegensatz habe ich immer folgenden Code benutzt, um ein Byte zu 
senden, also keine Interrupts.
// einzelnes Senden
void USART0_Tr_UINT8(UINT8 num8)
{
  while(!(UCSR0A&(1<<UDRE0)));
  UDR0 = num8;
}
Kann das Programm hier blockiert werden? Bisher habe ich noch keine 
Probleme gehabt.

Gruss
Senmeis

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Kann das Programm hier blockiert werden? Bisher habe ich noch keine
>Probleme gehabt.

Nein, eigentlich nur, wenn das Senden nicht gestattet ist (TXEN muß zum 
Senden gesetzt sein).

>Der UART ist ein oft benutztes Modul eines Mikrocontrollers. Anfänger >nutzen ihn 
meist im sogenannten Polling Betrieb (engl. to poll, abfragen).
>"D.h. während der UART selbsttätig das Zeichen sendet ist die CPU zum
>Warten verdammt."

Aus dem Zusammenhang gerissen kann man einen anderen Sinn hinter der 
Aussage vermuten.

>Im Gegensatz habe ich immer folgenden Code benutzt, um ein Byte zu
>senden, also keine Interrupts.

Bei einem gepufferten UART (zwei Bytes werden gespeichert) und geringer 
Datenmengen spricht nichts gegen die Poll-Methode.
Wenn man aber viele Daten (vielleicht auch noch relativ schnell) 
verschicken will, sollte man das "im Hintergrund" per ISR und 
Daten-Puffer lösen. Der Controller führt zwischen zwei Interrupts 
mindestens eine Anweisung aus.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Owen Senmeis (senmeis)

>Kann das Programm hier blockiert werden?

Sicher durch die While-Schleife. Wobei das keine Blockieren im Sinn von 
endlos festfressen ist, sondern halt warten bis der FIFO des UARt 
leer ist.

> Bisher habe ich noch keine Probleme gehabt.

Das hat ja auch keiner behauptet, aber die CPU muss dennoch warten, wenn 
du z.b. einen String mit 10 Zeichen senden willst.

MFG
Falk

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.