Forum: Mikrocontroller und Digitale Elektronik LCD busy flag abfragen


von Poseidonius (Gast)


Lesenswert?

Hallo zusammen,

mein LCD Display wird gegenwaertig in seinem Ablauf ueber die Zeiten
gesteuert, die nach den einzelnen Befehlen abgewartet werden sollen.
Soweit funktioniert dass ganze auch. Nun wollte ich diese leidlichen
Zeitvorgaben durch die Abfrage des Busyflags an D7 beseitigen aber dass
will nicht.

Die Bezeichner habe ich als Makros definiert und die sollten, da das
ganze ja sonst funktioniert auch passen. Offenbar ist busy immer
false.

bool LCDbusy()
{  bool busy;
  RW_PORT |=(1<<RW_BIT);
  // enable Bit setzen und wieder loeschen
  E_PORT|=(1<<E_BIT);
        E_PORT&=~(1<<E_BIT);
  // LCD 7 als Input
  LCD_7_DDR &=~(1<<LCD_7_BIT);
  if (LCD_7_PIN & (1<<LCD_7_BIT))
  {
    busy=true;
  }
  else
  {
    busy=false;
  }
  // LCD 7 als Output
  LCD_7_DDR |=(1<<LCD_7_BIT);
  RW_PORT &=~(1<<RW_BIT);
  return busy;}

Bitte helft mir wieder mal auf die Spruenge

von A.K. (Gast)


Lesenswert?

E 0=>1
D7 abfragen
E 1=>0

von Poseidonius (Gast)


Lesenswert?

Das hab ich auch schon gedacht, aber kein Erfolg ...

von A.K. (Gast)


Lesenswert?

RS Leitung korrekt?

von Poseidonius (Gast)


Lesenswert?

Wenn ich das Programm ueber die serielle Schnittstelle auf den
Mikrocontroller flashe, schreibt die LCD was sie soll. Nach Reset oder
Stromabschalten bleibt sie stumm.

(Atmega 128 auf ChipCon 2420 Board)

Eine Idee?

von A.K. (Gast)


Lesenswert?

Ach ja:
  // LCD 7 als Input
  LCD_7_DDR &=~(1<<LCD_7_BIT);
Die Richtung tunlichst vorher setzen. Sonst aktivieren beide die
gleiche Leitung und das ist ungesund.

von Poseidonius (Gast)


Lesenswert?

Da verstehe ich nicht ganz was du meinst? Die Richtung habe ich doch vor
der Abfrage gesetzt.

von A.K. (Gast)


Lesenswert?

Normalzustand:
"  LCD_7_DDR |=(1<<LCD_7_BIT);"

Lesen:
" // enable Bit setzen und wieder loeschen
  E_PORT|=(1<<E_BIT);
        E_PORT&=~(1<<E_BIT);
  // LCD 7 als Input
  LCD_7_DDR &=~(1<<LCD_7_BIT);
  if (LCD_7_PIN & (1<<LCD_7_BIT)) "

In Worten:

Controller hat D7 als Ausgang aktiv.
E wird aktiviert.
LCD aktiviert D7 als Ausgang.
E wird deaktiviert und deaktiviert.
Controller deaktiviert seinen Ausgang und liest.

D.h. zeitweilig treiben LCD und Controller gegeneinander.

von Poseidonius (Gast)


Lesenswert?

Ja, das hast Du recht ... nun, da ich die D7 als Inputanweisung ganz
nach oben geschrieben habe, bleibt das System in der busy Abfrage =
busy wird niemals low.

{
  bool busy;
  // LCD 7 als Input
  LCD_7_DDR &=~(1<<LCD_7_BIT);
  // RW = Read
  RW_PORT |=(1<<RW_BIT);
  // enable Bit setzen
  E_PORT|=(1<<E_BIT);
  if (LCD_7_PIN & (1<<LCD_7_BIT))
  {
    busy=true;
  }
  else
  {
    busy=false;
  }
  // enable Bit wieder loeschen
  E_PORT&=~(1<<E_BIT);
  // LCD 7 als Output
  LCD_7_DDR |=(1<<LCD_7_BIT);
  RW_PORT &=~(1<<RW_BIT);
  return busy;
}

von A.K. (Gast)


Lesenswert?

Nochmal: Was ist mit der RS Leitung?

von Poseidonius (Gast)


Lesenswert?

Die liegt auf low.

von wigorex (Gast)


Lesenswert?

Also bei mir schaut das so aus:
( und funktioniert )

#define LPORT PORTA
#define LPIN  PINA
#define LDDR  DDRA
#define RW  5
#define EN  6
#define BF  7


ich verwende code vision da
kann man per PORT.X=0/1 die bits setzten


// Wartet auf BF_flag = 0 -> LCD ready
// D7 wird Input EN wird high
void wait_bf ( void )
{
// RW=1 RS=0 ->  Read Mode BF Flag readout D7
// EN ist High && BF Input-Pin ist im pulldown mode
LPORT.BF=1 ; LPORT.RW=1 ; LPORT.RS=0 ; LDDR.BF=0 ; LPORT.EN=1 ;
// Warten bis LCD BF low -> LCD ready
while ( LPIN.BF == 1 ) { }
// D7 pin wieder output LCD wieder im write modus
LPORT.EN=0 ; LDDR.BF=1 ; LPORT.RW=0 ;
}



vieleicht hilfts ja was

von Poseidonius (Gast)


Lesenswert?

Ein verspaetetes Danke, jetzt tut alles was es soll

Poseidonius

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.