Forum: Mikrocontroller und Digitale Elektronik ARM LPC21xx mit serieller Schnittstelle


von Neuling (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


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).

von Neuling (Gast)


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?

von Dietmar (Gast)


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

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.