Probleme mit UART1 beim Infineon XC886 (8051Familie)

OP #1555905
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

}
Gast #1556319
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.