LCD busy flag abfragen

Gast #265971
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
Gast #265975
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?
Gast #265978
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.
Gast #265979
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;
}
Gast #265982
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren