uart hängt nach senden (ATmega8)

Gast #797078
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).
1
int send_data(_int uart_data, _int device_id){
2
  
3
   PORTC |= 0x08;
4
   uart_data += device_id;
5
 
6
   while ( !( UCSRA & (1<<UDRE)) );
7

8
   UDR = uart_data; 
9

10
   return _FALSE;
11
}

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
Angehängte Dateien:
Gast #797083
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...
Gast #797095
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
#797106
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
Gast #797225
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 ;)
Gast #797360
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

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