Forum: Mikrocontroller und Digitale Elektronik Busy-Flag


von Heli (Gast)


Lesenswert?

Hallo.
Ich habe gestern 3 Stunden vergeblich Probiert
in das Programm aus dem Tutorial (LCD)
das Busy-Flag mit einzufügen.
Ich wäre sehr dankbar wenn mir jemand erklären
könnte wie man ein LCD im 4bit-Modus mit
Abfrage des Busy-Flag betreibt.
Heli

von SaM (Gast)


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

von Phagsae (Gast)


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

von Thomas Strauß (Gast)


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

von Thomas Strauß (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch das Programm, das offensichtlich auf der Strecke geblieben 
ist.

von Εrnst B. (ernst)


Lesenswert?

Wow. Ein .DOC File für Quelltext?

Welcher C-Compiler frisst denn sowas?

von Johannes M. (johnny-m)


Lesenswert?

Ernst Bachmann wrote:
> Wow. Ein .DOC File für Quelltext?
>
> Welcher C-Compiler frisst denn sowas?
Und zusätzlich noch nen fünfeinhalb (!) Jahre alten Fred wieder 
rausgekramt. Das ist rekordverdächtig!

von Meister der Insel (Gast)


Lesenswert?

Tja so sind die Leut.

von Johannes M. (johnny-m)


Lesenswert?

Meister der Insel wrote:
> Tja so sind die Leut.
In der Tat. Und es gibt dann auch noch tatsächlich (derzeit 10) Leute, 
die sich das .doc auch noch runterladen...

von Εrnst B. (ernst)


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)

von Meister der Insel (Gast)


Lesenswert?

Gegen Neugier gibt es halt auch kein Kraut.
So jetzt ist Feierabend.

Schönes Wochenende und Gruß.

von Peter D. (peda)


Lesenswert?

Ich hab grad kein DSL, kann mir also das DOC-Monster nicht ansehen.

Selbst mein größtes Projekt (50 Files, 10.000 Codezeilen in C) schaffts 
nicht auf 503kB.


Peter

von Rudolph (Gast)


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.

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.