mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD busy flag abfragen


Autor: Poseidonius (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
E 0=>1
D7 abfragen
E 1=>0

Autor: Poseidonius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hab ich auch schon gedacht, aber kein Erfolg ...

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
RS Leitung korrekt?

Autor: Poseidonius (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Poseidonius (Gast)
Datum:

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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Poseidonius (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nochmal: Was ist mit der RS Leitung?

Autor: Poseidonius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die liegt auf low.

Autor: wigorex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Poseidonius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein verspaetetes Danke, jetzt tut alles was es soll

Poseidonius

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.