mikrocontroller.net

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


Autor: Holger B. (rst-el)
Datum:

Bewertung
0 lesenswert
nicht 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

}

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.