www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART0 beim LPC2387


Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe hier eine kleine Routine mit der ich ein Zeichen auf der Uart0 
ausgebe und die im wesentlichen aus diesen beiden Zeilen besteht:

    while (!(U0LSR & BIT5));
    U0THR = character;

Die while-Schleife wartet IMHO solange bis der FIFO-Kopf wieder frei ist 
und ich das nächste Zeichen in die FIFO schieben kann.
Nun brauche ich aber eine Funktion die mir anzeigt, ob die gesamte 
FIFO leer ist.
Hintergrund ist, dass ich den Arm gerne in den PowerDown Modus schicken 
möchte ohne das die laufende Uart Übertragung abgebrochen wird.

Wenn ich vor dem powerDown noch ein

while (!(U0LSR & BIT6)) {};

einsetze, schneidet er immer genau ein Zeichen ab, egal wie lang der 
String ist, den ich vorher ausgebe...

Wie kann ich sicher gehen, dass die FIFO komplett leer ist, bevor ich in 
den PowerDown-Modus gehe?

Danke, Heiko

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versucht, auf gesetztes THRE und TEMP zu warten? Ansonsten dürfte eine 
kleine Warteschleife mit 10*Bittime vor PowerDown nicht wirklich wehtun.

Autor: Robert Teufel (robertteufel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In dem unwahrscheinlichen Fall, dass Du die Emfangsfunktion des UARTs 
nicht benoetigst und auch den Pin nicht anderweitig benutzt, kannst Du 
das Signal zurueckspeissen und auf das Empfangsinterrupt-bit achten.
Noch eine Hardwaremoeglichkeit ueber einen Timer und einen Interrupt. 
Beim 2387 sind sehr viele pins interruptfaehig, ich glaube wir haben ca. 
60 definiert. Der Vorschlag lautet den transmit pin auf einen Interrupt 
pin zu legen. Bei jeder fallenden Flanke wird der Interrupt getriggert 
und dadurch ein Timer auf 0 gesetzt. Dieser Timer wuerde relativ langsam 
laufen, entsprechend der baudrate. Nehmen wir an ein bit waeren 10 Timer 
Increments. Dann wuerde vor dem schlafen gehen der Timer ausgelesen. 
Wenn der Timerstand groesser 100 ist, dann ist keine Uebertragung am 
laufen, wenn kleiner 100, warten bis >100. Timer Ueberlauf dauert sehr 
lange und muss nicht wirklich beruecksichtigt werden, denn im 
schlimmsten Fall wartet man mit dem schlafen gehen obwohl man nicht 
muesste.

Ist alles etwas umstaendlich und ein "UART-busy Flag" waere viel 
eleganter aber vielleicht hilfts ja.


Robert Teufel
Partner in Silicon Valley gesucht?
Ich stehe gerne zur Verfuegung.
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Meine ARM/Cortex Webseite: http://www.lpc2000.com

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.