Busy-Flag

Gast #1752
Lesenswert?

Hallo,
bei meinen Display wird wenn man RW auf Lesen und RS auf Befehl stellt 
der komplette Datenbus auf High bzw. auf Low gesetzt. Das heißt das du 
theoretisch auch im 4-Bitmodus das Busy-Flag ganz einfach dadurch 
ausliest indem du Prüfst ob etwas am Datenbus (DB0 - DB7) anliegt.

SaM
Gast #1753
Lesenswert?

Moinmoin

BF Flag lesen om 4 bit mode ist ein bischen "tricky"

Da der AVR Port im Input mode auch 2 Zustände annehmen kann ja nach dem 
welche Daten am Post anliegen

Wenn PORTx,D7 im Output & modus DDRx,D7 1
Versucht der Eingang einen pull up dh er zieht in richtung 1
Sollte
Ist der Ausgang des LCD chips nicht dafür ausgelegt kann das Probleme
machen
-> dafür sorgen das PRTx,BF (D7) vor der abfrage auf 0 liegt  HI_Z
-> dann erst DDRx,BF auf Input
-> dann RW 1 RS 0

Jetzt noch BF einlesen ( PINx ) Nicht vom PORTx

!! noch was !!

Das BF flag kann erst nach der 2. 4bit operation gelesen werden !
und das auch nur EN log 1
Man ist schnell versucht die BF Abfrage in die normale LCD Routine
reinzuflicken ( in den EN operations teil ) der wird aber 2 mal pro
Schreibvorgang benutzt und so klappt das dann nicht


poste doch mal den code den du probierst
vieleicht kann man da ja was sehen

Mfg Phagsae
Gast #638745
Lesenswert?

Hallo,

ich habe auch lange vergeblich versucht, bei einem LCD16X1 das Busyflag 
abzufragen, so daß es auch funktioniert.

Nach Internet-Recherche habe ich es jetzt geschafft. Das 
Assemblerprogramm ist zwar für einen PIC geschrieben, aber es ist kein 
Problem, es in den MCS51-Code
umzuschreiben.

Ich war nun interessiert daran, wie oft das Busyflag abgefragt wird, bis 
der letzte Befehl abgearbeitet ist.

Dafür habe ich ein Programm für einen 80C32X2 Standardcontroller (Atmel) 
geschrieben, das genau das macht und die Anzahl auf einem 16X1-Display 
ausgibt.

Bei 1,8432Mhz-Taktfrequenz sind es 18 Abfragen, bei 24Mhz schon 230.

Thomas
#638776
Lesenswert?

Johannes M. wrote:

> In der Tat. Und es gibt dann auch noch tatsächlich (derzeit 10) Leute,
> die sich das .doc auch noch runterladen...

Muss gestehen, zwei der Downloads stammen von mir. Wollte checken, obs 
wirklich ein DOC-File ist (GET-Request an der Kommandozeile) und ob 
Koffice/KWord das öffnen kann. (Ja, es kann, und es ist auch wirklich 
Quelltext enthalten)
Gast #638813
Lesenswert?

Also so habe ich das mal implementiert für einen Mega16
und ein 4x20 DIP (EA DIP 204-4) in 8-Bit:

---
#define LCD_E  (1<<PORTB0);
#define LCD_RW (1<<PORTB1);
#define LCD_RS (1<<PORTB2);

uint8_t display_busy(void)
{
 uint8_t x;

 DDRC = 0x00;      // set all Pins from PORTC to input
 PORTB |=  LCD_RW; // switch display to read-mode
 PORTB &= ~LCD_RS; // clear RS, this is always a command
 PORTB |=  LCD_E;  // set E
 x = PINC & 0x80;  // we only need the busy-flag
 PORTB &= ~LCD_E;  // clear E
 return(x);
}
---

Und dann habe ich das mal auf 4-Bit umgestellt:

---
// display functions

#define LCD_E  (1<<PORTB1);
#define LCD_RW (1<<PORTB2);
#define LCD_RS (1<<PORTB3);


uint8_t display_busy(void)
{
 uint8_t x;

 DDRA = 0x00;      // set all Pins from PORTA to input
 PORTB |=  LCD_RW; // switch display to read-mode
 PORTB &= ~LCD_RS; // clear RS, this is always a command
 PORTB |=  LCD_E;  // set E
 x = PINA & 0x08;  // we only need the busy-flag
 PORTB &= ~LCD_E;  // clear E
 // read second nibble to complete access
 PORTB |=  LCD_E;  // set E
 PORTB &= ~LCD_E;  // clear E
 return(x);
}
---

Hmm, okay, ist 'ne Weile her das ich das gebraucht habe und ist 
vielleicht ein wenig nachlässig implementiert... ;-)

Aber mit dem 2x16 DIP habe ich das auch schon erfolgreich benutzt.

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