Forum: Mikrocontroller und Digitale Elektronik Wann ist ein Befehl bei einem HD44870 ausgeführt?


von bruegae (Gast)


Lesenswert?

Hallo,
ich habe ein HD44780 LCD gekauft und kann diesen auch wunderbar steuern. 
Mein Problem ist nur, dass ich immer sinnlos viele Takte verbrate weil 
ich nicht genau weiß wann der LCD den Befehl ausgeführt hat. Im 
Datenblatt steht, dass man RS auf 0, R/W auf 1 setzen muss und dann kann 
man an der Datenleitung D7 erkennen das der LCD fertig ist, wenn 0 
anliegt 
(http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=1;INDEX=0;FILENAME=A500%252FLCD162CBL%2523EAS.pdf 
Seite 3, obere Tabelle, Zeile "Busy Flag"). Allerdings klappt das bei 
mir nicht. Ich habe hier mal den Code Teil reinkopiert der nur so lange 
Takte verbrät bis der LCD bereit ist:

checkready:
cbi PORTD,5 ;RS auf 0
sbi PORTD,6 ;R/W auf 1
ldi r16,0
out DDRD,r16 ;Port D auf Eingang schalten
rauf:
sbis PIND,7
jmp rauf
ldi r16,255
out DDRD,r16 ;Port D auf Ausgan schalten
ret

Ich bitte um Hilfe! Vielen Dank schonmal.
bruegae

PS:

von Jean P. (fubu1000)


Lesenswert?

Dann würde ich auch auf NULL abfragen.
statt --->sbis PIND, 7  eher---->sbic PORTD, 7

Gruß

von Michael U. (amiga)


Lesenswert?

Hallo,

das wird so nicht klappen. Das Display hat gültige Daten maximal 160ns 
nach der steigenden Flanke von E (Datenblatt, Read-Timing).

checkready:
cbi PORTD,5 ;RS auf 0
ldi r16,0
out DDRD,r16 ;Port D auf Eingang schalten
sbi PORTD,6 ;R/W auf 1

rauf:
sbi PORTD, ??? Pin, wo E dranhängt
nop        Dem Display die 160ns lassen, hängt hier bom AVR-Takt ab...
in r16,PORTD
cbi PORTD, ??? Pin, wo E dranhängt
sbrc r16,7      Fertig, wenn Busy = 0 !!!!
jmp rauf

E muß jedesmal getaktet werden, das Display ändert während E = 1 den 
Zustand der Datenleitungen NICHT.

cbi PORTD,6 ;R/W auf 0
ldi r16,255
out DDRD,r16 ;Port D auf Ausgan schalten
ret

PS: ich habe mal die Folge R/W-Umschalten und Port-Richtung umschalten 
etwas umsortiert.
Hintergrund: die Display-Leitungen sind Eingang, der Port ist Ausgang.
Wenn jetzt zuerst das Display auf Schreiben, also Ausgang, gesetzt wird, 
könnten theoretisch 2 Ausgänge gegeneinander arneiten, bis der Port 2 
Takte später auf Eingang gesetzt wird.
Das kann nette Spikes erzeugen und damit Fehler, die man ewig sucht...
Umgekehrt sind in dieser Zeit 2 Eingänge zusammengeschaltet, das stört 
nicht.
Praktisch stört es hier konkret nicht, weil das Display mit E = 0 im 
TriState ist.
Es ist aber besser, sich anzugewöhnen auf solche Kleinigkeiten zu 
achten, spart bei anderen ICs evtl. mühsame Fehlersuche.

Gruß aus Berlin
Michael

von hans (Gast)


Lesenswert?

Anmerkung:

Es ist besser (schneller) nicht nach dem Zeichen/Befehlsenden auf das
Ende zu warten sondern vor dem Senden abzufragen ob/bis nicht mehr
Busy.
nach z.B. einem Clear-Befehl kann man dann die frischen Daten hohlen
oder was anderes abarbeiten während das Display noch arbeitet.

Kann viel Zeit sparen!

Beachten, daß Busy erst während der Initialisierung aktiviert wird 
(abfragen erst nach einigen Befehlen möglich!)

gruß hans

von Sascha B. (bruegae)


Lesenswert?

Ich habe den Code von Michael probiert, aber das funktiniert nicht. Ich 
habe zusätzlich beide Taktflanken von E und das Busy Flag auf 0 und 1 
gecheckt, nie hat es funktioniert.

von Benedikt K. (benedikt)


Lesenswert?

Michael hat einen Fehler eingebaut, den du richtig hattest: PinD 
anstelle von PortD abfragen.

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.