Forum: Mikrocontroller und Digitale Elektronik Probleme mit UART1 beim Infineon XC886 (8051Familie)


von Holger B. (rst-el)


Lesenswert?

Hallo,
ich habe beim Senden mehrerer Bytes über den UART1 folgendes Problem:
Die Abfrage des TI-Flags scheint nicht richtig zu funktionieren. Sofern 
ich das Flag direkt vor dem Beschreiben des Sendepuffers lösche, 
funktioniert die nachfolgende while Schleife, in der auf das Setzen des 
TI-Flags gewartet wird, nicht. Es wird lediglich das erste und letzte 
Byte in der for-Schleife gesendet, die anderen Bytes gehen verloren.

Wenn ich dagegen direkt nach der while Schleife das Flag wieder lösche, 
dann funktioniert das Senden einwandfrei. Man könnte meinen, das TI-Flag 
wird nicht direkt mit dem Befehl gelöscht, sondern erst einige Zyklen 
später. Der UART1 wird nicht direkt am XC886-core betrieben sondern über 
den internen peripheral Bus. Kann hierdurch eine Verzögerung verursacht 
werden ?

Gruß H.Bz

Die Test-Senderoutine sieht folgendermaßen aus:

void SendASC1Data()
{
  int i;
  _push_(SYSCON0);    // push the current RMAP

  SET_RMAP();         //Mapped SFR-Area freischalten, da UART1 dort 
liegt

  for(i=0;i<10;i++)
  {
// wird transmitter interrupt flag hier gelöscht, Fehlfunktion
//    TI_1 = 0;

  UART1_SBUF = i;

// warten, bis Zeichen gesendet ist (Transmit Interrupt Flag gesetzt)
    while (TI_1 == 0){};

// wird transmitter interrupt flag hier gelöscht, ok
  TI_1 = 0;
  }

  _pop_(SYSCON0);                // restore the old RMAP

}

von Ralf (Gast)


Lesenswert?

Was sagt das Assembler-Listing? Nicht dass Löschen vor der 
while-Schleife wegoptimiert wird.

Falls ich mal Polling verwende (meist eher Interrupt), schreibe ich die 
Abfrage übrigens immer so, dass ich vor dem Schreiben von SBUF warte, 
bis TI gesetzt ist, dann TI lösche und dann in SBUF schreibe. Hat den 
Vorteil, dass andere Aufgaben schneller drankommen, wenn man nur 
einzelne Zeichen sendet. Zusammenhängende Datenblöcke werden mit der 
o.g. Routine gesendet, so kann dann während dem Senden das nächste Byte 
des Blocks geholt werden.
Allerdings muss man dann in der UART-Initialisierung TI vorher auf eins 
setzen, sonst bleibt die Routine hängen.

Wie gesagt, am besten wäre das ASM-Listing, damit man sieht, was denn 
alles passiert.

Ralf

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.