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:
Dann würde ich auch auf NULL abfragen. statt --->sbis PIND, 7 eher---->sbic PORTD, 7 Gruß
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.