www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ARM LPC21xx mit serieller Schnittstelle


Autor: Neuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi ich habe grade mit der ARM7 programmierung angefangen und will nun
die serielle Schnittstelle zum funktionieren bringen. Hier im Forum und
sonst im Netz habe ich auch schon viel Anregungen gefunden.
Die Initialisierung funktioniert, genau so wie senden und empfangen.
dies aber nur wenn ich die Echo geschichte nehme wie sie zum Bsp bei
Hitex im LPCBook vorgestellt wird.
Mich stört hier der Code " while (!(U1_LSR & 0x01));" das bedeutet ja
das wenn nichts zu empfangen ist der ARM  in der Schleife hängen bleibt
bis eben etwas zu empfangen da ist (RDR gesetzt ist).
Da es aber nicht garantiert werden kann das immer Daten über die
Serielle Schnittstelle abkommen soll der Arm eben nicht warten bis
etwas anliegt sondern wenn nicht ist weiter machen mit der Daten
Auswertung.
Ungefahr so:
y=40;
for (x=0;x<y;x++)
{ if ((U1_LSR & 0x01) != 0){} // keine Daten im RBR tue nichts
  if ((U1_LSR & 0x01) == 0)    //  Daten im RBR lese
  { while(( U1_LSR & 0x01) ==0);// muss sein da sonst nur 0xAA gelesen
   U1_lesen();
}

leider geht dieses auch nur wenn y = der Anzahl der zu empfangen
Zeichen ist. Ist y größer stoppt alles wieder ist y kleiner werden die
"überzähligen" Zeichen beim nächsten Mal vorne weg gelesen.

Ich hoffe ich bin nciht der erste der sich über solche Probleme
gedanken macht. Wenn einer von euch so was schon programmiert hat: über
einen Bsp Code oder auch sonstige Tips würde ich mich freuen

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was spricht gegen einen interruptgesteuerten Schnittstellentreiber? Die
UART kann nämlich dazu gebracht werden, bei eintreffenden Zeichen
Interrupts auszulösen, entweder einen Interrupt für jedes einzelne
Zeichen oder aber einen Interrupt, wenn der Empfangsfifo einen gewissen
Füllstand erreicht hat.

Ein großes Rätsel dürfte diese UART eigentlich auch nicht darstellen,
ist sie doch kompatibel zur in jedem PC zu findenden 16550. Lediglich
die bei PCs über das MCR steuerbare externe Interruptfreigabe fehlt
hier, aber die ist ja auch nicht Bestandteil des 16550.

Dein Programm sollte also nicht bei der UART nachsehen, ob Zeichen
empfangen wurden, sondern im vom Interrupttreiber gefüllten
Empfangspuffer (ein globaler Speicherbereich).

Autor: Neuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
erstmal Danke für die schnelle Antwort.

also wenn ich das jetzt richtig verstehe soll ich nicht mehr da DR Bit
aus dem LSR abfragen sondern im U1IER das Bit 0 "Enable RX Data
Available Interrupt" setzen um  im U1IIR abzufragen ob Daten da sind?
Ich dachte bis jetzt das das DR BIt im Endefekt das selbe macht?

so wie ich es verstehe Frage ich y mal nach ob was im RBR liegt.
Wenn nichts drin ist passiert nichts wenn estwas drin ist wird es
gelesen. so sollte es sein wenn ich jetzt nicht irgendwo einen Fehler
in meiner Gedankenführung habe.

Ich habe eben probiert den U1IIR in der Initialisierung für den UART zu
aktivieren, das hat jedoch leider dazu geführt das z.B. die Baudrate
nicht mehr stimmte...

"Interrupttreiber gefüllten Empfangspuffer (ein globaler
Speicherbereich)" hier zu noch eine Frage: Habe im DAtenblatt grade
gesucht, das ist doch der IIR?

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn nicht interruptgesteuert:

Du kannst doch im Hauptprogramm auf die Bedingung:

U1_LSR & 0x01) == 0

pollen (und die Software hängt nicht).

Das müßte auch funktionieren.

Wenn interruptgesteuert:

ist die Bedingung immer wahr, oder?

Dietmar

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.