www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik uart hängt nach senden (ATmega8)


Autor: Matthias (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich habe ein Problem mit dem UART. Nachdem der Mega8 ein paar Mal ein 
Byte gesendet hat(über Tasten druck), hängt der UART (im Simulator 
wartet er  in der while auf UDRE).
int send_data(_int uart_data, _int device_id){
  
   PORTC |= 0x08;
   uart_data += device_id;
 
   while ( !( UCSRA & (1<<UDRE)) );

   UDR = uart_data; 

   return _FALSE;
}

Er es dauert sehr lange bis das Byte verarbeitet wird.

Könnt ihr mir sagen, warum der Atmega das Bit nicht gleich setzt?

Würde mich freuen auch etwas Hilfe
 matthias

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Er es dauert sehr lange bis das Byte verarbeitet wird.

>Könnt ihr mir sagen, warum der Atmega das Bit nicht gleich setzt?

Das UDRE wird erst dann gesetzt, wenn das UDR leer ist.
Wenn du das nur simmulierst, solltest du mal einen Breakpoint hinter 
deine Senderoutine setzen und F5 drücken.


>Nachdem der Mega8 ein paar Mal ein Byte gesendet hat

Zwei mal? So groß ist nämlich der UDR-Puffer...

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnelle  Antwort

In der Tat! Er hängt nach dem 2ten Byte.

Es ist aber nicht nur im Simulator so, sondern auch in der Realität. 
Dort braucht er auch relative lange. Kann ich den Puffer irgendwie 
beeinflussen (das er nicht wartet) bzw. kann ich das anders/besser 
lösen?

matthias

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Matthias (Gast)

>In der Tat! Er hängt nach dem 2ten Byte.

Er hängt nicht, er wartet darauf das der TX Buffer wieder frei wird.

>Es ist aber nicht nur im Simulator so, sondern auch in der Realität.

Auch in der Realität.

>Dort braucht er auch relative lange. Kann ich den Puffer irgendwie
>beeinflussen (das er nicht wartet) bzw. kann ich das anders/besser
>lösen?

Ja, über Interrupts.

MFG
Falk

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ja, über Interrupts.

Bringt auch nicht immer was.
In Verbindung mit einem genügend großen FIFO / Ringpuffer im RAM
hilft das oft.

Wenn aber viele Daten kommen und der UART sie trotz FIFO
nicht loswerden kann bringt auch das nichts. Der FIFO
läuft über. Da hilft dann nur Baudrate hochsetzen oder
das Konzept noch mal überdenken ;)

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Bringt auch nicht immer was.
>In Verbindung mit einem genügend großen FIFO / Ringpuffer im RAM
>hilft das oft.

Das wäre aber zumindest ein Konzept, bei dem der Controller sich 
"gleichzeitig" noch um andere Dinge kümmern kann.

Es ginge auch, in dem man in einer Schleife abfragt, ob UDR leer ist und 
nicht in einer Schleife verharrt, bis UDR leer ist.
Aber auch dieses Konzept erfordert einen genügend großen Puffer...

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.