Forum: Mikrocontroller und Digitale Elektronik LCD Busyflag abfrage programmieren?


von Chris Lambert (Gast)


Lesenswert?

Hallo,

aus der Busyflag abfrage werde ich nicht ganz schau, da wenn ich das
Datenblatt eines LCDs verstanden habe, setzte ich die RW und EN PINs
auf logisch 1 und der PIN an welchem die Datenleitung DB7 angeschlossen
wird, wird als Eingang deklariert und abgefragt, ob dieser logisch 1
ist. Solange dieser auf logisch 1 ist, ist das LCD beschäftigt???

Nabe ich folgendes Problem, ich benutzte die 4-Bit LCD Ansteuerung,
d.h. ich schicke zuerst das lower nibble anschließend das upper nibble.
Ich mache eine Busyflag abfrage vor dem senden des lower nibbles ->
keine Probleme. Mach ich eine Busyflagabfrage vor dem senden des upper
nibbles, geht's nicht weiter, bzw. er kommt nicht aus der schleife
raus!

Kann mir vielleicht jemand helfen und sagen, ob die Routine korrekt
geschrieben wurde?

void check_busyflag(void)        //Check if the LCD is still busy
{
  DDRT &= ~(1<<DB7);     // PIN DB7 as input
  PTT|=(1<<RW)|(1<<EN);          //Set the RW Pin to high

  while(PTIT & (1<<DB7))     //Read the Input Pin, as long as this pin
is set to high
  {
  }
  PTT &= ~(1<<RW);         //LCD is no longer busy, reset the RW Pin
  PTT &= ~(1<<EN);
  DDRT |= (1<<DB7);
};

von johnny.m (Gast)


Lesenswert?

Schau Dir mal das Datenblatt vom LCD genauer an. Ich vermute mal (auch
wenn Du nix davon schreibst), dass Du ein LCD mit HD44780-kompatiblem
Controller verwendest. Dann musst Du vor jeder Auswertung des Busy
Flag, also in Deiner Schleife, das Address-Byte komplett einlesen. Das
MSB des Address-Bytes ist das Busy-Flag. Wenn Du es nur einmal
einliest, ändert es sich natürlich nicht mehr und Du bleibst in der
Schleife hängen.

von Chris Lambert (Gast)


Lesenswert?

Hallo,

ja ich verwende einen HD44780 kompatiblen Controller, aber was meinst
du mit Address-Byte komplett einlesen???

von johnny.m (Gast)


Lesenswert?

Schau Dir doch bitte das Datenblatt an! Da steht in der Befehlstabelle

ein Befehl 'Busy Flag / Address Read'. Dieser wird ausgeführt, wenn
RS 0 und RW 1 ist. Das MSB des eingelesenen Bytes (das in den anderen
Bits die Adresse des zuletzt geschriebenen Zeichens enthält) ist das
Busy Flag. Du musst diesen Befehl ausführen (und das bedeutet im
4-Bit-Modus zwei Schritte) und das komplette Address-Byte einlesen.
Anschließend kannst Du den aktuellen Stand des BF auswerten. Eine
Änderung des Zustandes des BF kriegst Du nur mit, wenn Du den Befehl
'Busy Flag / Address Read' erneut ausführst!

von johnny.m (Gast)


Lesenswert?

Ach ja, sorry für die exzessive Anwendung von Fettdruck, aber manche
Leute kapieren es sonst nie, dass man ein Datenblatt auch lesen
muss...

von A.K. (Gast)


Lesenswert?

Alternative: Espar dir den Zirkus mit dem Busy-Flag und halte einfach
die beschriebenen Wartezeiten ein. Als Nebeneffekt wird ein Pin frei.

von johnny.m (Gast)


Lesenswert?

Nein, es wird kein Pin frei! Für die Zeichen-Ausgabe werden alle 8
Pins des Datenbus gebraucht!

von A.K. (Gast)


Lesenswert?

Der R/W-Pin wird frei.

von johnny.m (Gast)


Lesenswert?

Wenn man keine Display-Daten lesen will, dann ja...

von Marko B. (Gast)


Lesenswert?

Naja, das Display hat ja nicht so viel mitzuteilen. Ich schalte den
R/W-Pin auch immer auf GND. Das Busy-Flag bei Textdisplays auszulesen
ist ziemlich nutzlos.

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.