Forum: Mikrocontroller und Digitale Elektronik UART Interrupt Zeitprobleme


von Markus W. (kornbanane)


Lesenswert?

Hallo,

meine Frage bezieht sich auf das Tutorial zum UAART Interrupt auf 
mikrocontroller.net 
[[http://www.mikrocontroller.net/articles/Interrupt#UART_mit_Interrupts]]

Mir ist aufgefallen, wenn ich direkt hintereinander mehrere Strings mit 
der Funktion put_string sende, dass dann einige Zeichen verschluckt 
werden oder sich einfach misst ergibt.

Ich habe mir die Sache jetzt so erklährt:
Beim Übergeben des ersten Strings an put_string wird ja das 
uart_tx_flag=0 gesetzt (nach dem motto bin jetzt am senden, bitte nix 
neues mehr) und wenn die Senderoutine (welche über den UDRE Interrupt 
läuft) mit dem ganzen String fertig ist wird uart_tx_flag=1 gesetzt - 
also senden fertig.

Zwischen dem senden von zwei Zeichen des Strings - also zwischen zwei 
UDRE Interrupts kehrt der Programmzähler wieder zum "Hauptprogramm" 
zurück und dort soll schon gleich der nächste String losgeschickt 
werden. Dieser kann aber nicht auf die Reise gehn, da uart_tx_flag noch 
0 ist und somit die Funktion put_string ihren dienst verweigert.

Hab ich das so richtig verstanden ??
Ich habe das Problem so gelöst:
1
  put_string("\n");
2
  
3
  while(!uart_tx_flag)
4
  {
5
  }
6
  
7
  
8
  put_string(string);    // Den String zurück zum Pc senden
9
  
10
  while(!uart_tx_flag)
11
  {
12
  }
13
  
14
  
15
  put_string("\n");

Aber die Lösung kommt mir ziemlich dämlich vor oder ?

von Stefan (Gast)


Lesenswert?

Hallo,

Markus Wi*** schrieb:
> Aber die Lösung kommt mir ziemlich dämlich vor oder ?

zugegeben, sieht nicht schön aus, ist aber die richtige Lösung wenn du 
"put_string" nicht verändern willst.

Ansonsten schreib die Warteschleife als erste Zeile in die Funktion 
"put_string" und alles sieht wieder schön aus!

von Purzel H. (hacky)


Lesenswert?

Warten ist immer schlecht. Was spricht dagegen einen hinreichend grossen 
Buffer zu haben, der alles speichern kann was am Stueck rausgehen muss ?

von Peter D. (peda)


Lesenswert?

Markus Wi*** schrieb:
> Aber die Lösung kommt mir ziemlich dämlich vor oder ?

Der Tutorial-Code ist völlig unbrauchbar.
Sind noch Daten im Puffer, schmeißt er das nächste Paket einfach weg und 
gibt nichtmal nen Fehlercode zurück:
1
void put_string(char *daten) {
2
   if (uart_tx_flag==1) {
3
      // ...
4
   }
5
}

Der Sendepuffer muß als FIFO programmiert sein, d.h. weitere Daten 
werden hinten angehangen:

Beitrag "AVR-GCC: UART mit FIFO"


Peter

von Falk B. (falk)


Lesenswert?

@  Peter Dannegger (peda)

>> Aber die Lösung kommt mir ziemlich dämlich vor oder ?

>Der Tutorial-Code ist völlig unbrauchbar.

Verallgemeinerungen sind immer falsch ;-)

Der Code hat Einschränkungen, die sind aber der Einfachheit und 
Übersichtlichkeit geschuldet. Es soll das Pinzip der Interruptnutzung 
dargestellt werden, ohne möglichst durch zuviele andere Sachen 
abzulenken bzw. das Verständlnis zu erschweren.

>Sind noch Daten im Puffer, schmeißt er das nächste Paket einfach weg und
>gibt nichtmal nen Fehlercode zurück:

Da muss der Anwender halt selber VORHER prüfen.

MFG
Falk

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.