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


von Matthias (Gast)


Angehängte Dateien:

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

von STK500-Besitzer (Gast)


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...

von Matthias (Gast)


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

von Falk B. (falk)


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

von holger (Gast)


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 ;)

von STK500-Besitzer (Gast)


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...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.