Forum: Mikrocontroller und Digitale Elektronik Erprobte Werte für T_AS (Address Setup Time) bei HD44780 und Design-Probleme


von Dominik (Gast)


Lesenswert?

Hallo Zusammen,

die Platine liegt fertig vor mir (und es funktioniert derzeit auch) aber 
;-)....

Folgende Situation:

Im Rahmen einer Steuerungsaufgabe habe ich (wie immer ;-)) alle Pins 
genutzt und hatte entschieden, die SPI-Schnittstelle des Atmega328p
für die LCD-Ansteuerung zu verwenden. Die LCD-Befehle werden in einem 
Ringpuffer gehalten und dann mit den entsprechenden Verzögerungen 
interruptgesteuert via SPI an das Shiftregister übertragen (Shoot and 
Forget).
So habe ich in der Main-Loop keine Probleme mit Ausgabe-Timings.

Daher möchte ich auch bei der Hardware-SPI-Lösung bleiben und kann den 
MISO-Pin (PB4) nicht als separates Signal nutzen (habe den, um das 
Gewissen zu beruhigen, aber verwertet und lese aus dem Shiftregister 
zurück ->Baustein vorhanden/Fehlerfreie Übertragung).

Die 5 MSB im Shiftregister enthalten das Nibble und das 
Register-Select-Bit.
Die 3 LSB im Shiftregister steuern Hintergrundbeleuchtung und zwei 
Anzeige-Leds, diese Bits werden bei jeder LCD-Übertragung einfach als 
Carry mitgenommen. Das LCD wird in dieser Konfiguration natürlich nur 
schreibend angesprochen.

Ursprünglich hatte ich geplant den Enable-Puls auch über das 
Shiftregister
zu generieren, das hätte den Overhead aber verdoppelt und eine LED 
gekostet.

Auf Grund folgenden Datenblattes:

https://www.openhacks.com/uploadsproductos/eone-1602a1.pdf

habe ich mich dazu hinreißen lassen, den SS-Pin (PB2) direkt mit der 
LatchClock (Storageregisterclock) des 595 UND dem Enable-Pin des 
Displays zu verbinden, da dort die Address-Setup-Time mit 0ns angegeben 
war und der <Valid-Data>-Block zur fallenden Flanke referenziert ist. 
Was zugegebener Maßen schon etwas riskant war, da das 595 die Outputs 
zwar
sehr schnell schaltet (hier ~19ns), aber damit das R/S-Signal trotzdem 
der steigenden Enable-Flanke etwas nachhinkt. Bisher haut es mit den 
verschiedenen LCDs (China-Ware) hin, die ich zum testen da habe.

Nun ist mir aber das Original-Datenblatt zum HD44780(U) wieder in die 
Hände gefallen und dort ist die Address-Setup-Time mit 40ns angegeben, 
also mit einem deutlichen Vorlauf. Damit kommt mein R/S-Signal gem. 
Datenblatt fast 60ns zu spät. Vermutlich ist es so, dass RS bei der 
steigenden Flanke und DB7..DB4 bei der fallenden gelesen werden (Wäre 
auch logisch) und ich im Moment einfach nur Glück gehabt habe, das es 
überhaupt so klappt (Wellenwiderstand des LCD-Kabels/Schaltschwellen der 
Eingänge).

Nun aber endlich zurück zu eigentlichen Frage:
Ich möchte das Design nun abändern und auf dem fertigen PCB die Leitung 
zum
Enable-Pin des Displays auftrennen, ersatzweise soll dort ein 
RC-Tiefpass hin. Allerdings waren meine Recherchen im Internet was die 
T_AS betrifft ernüchternd, die Werte, die man findet, schwanken sehr 
stark (zwischen 0 und 240ns). Ferner würde ich damit die Rise- und 
Falltime überschreiten, die teilweise mit 20ns max. angegeben wird...

Kann man die Schaltung so überhaupt anpassen, wenn ja welchen wert von 
T_AS sollte man annehmen?
In wie weit ist die Rise- und Falltime kritisch, reicht überhaupt ein 
RC-Tiefpass oder muss da noch ein Schmitt Trigger hinter?

Gruß Dominik

von kyrk (Gast)


Lesenswert?

Schaltbild wäre nicht schlecht. Habe halbwegs durchgelesen aber ohne 
Bild kann ich es mir trotzdem nur sehr schwer vorstellen wie es 
aussieht.

von Dominik (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
leider habe ich keinen Schaltplan, anbei aber der Ausschnitt aus dem 
PCB-Layout. SPI kommt über 6 Pin-Header rein und LCD hängt am 16(-4) 
poligen Header. Dazwischen liegt das Shiftregister.
(Auf der Platine befinden sich daüber hinaus aber noch Summer, Encoder, 
etc..)

Problem wie gesagt, R/S und E kommen nahezu zeitgleich beim LCD an, (R/S 
sogar etwas später, liegt auf 595->QD)).
E wollte ich jetzt durch ein RC-Glied verzögern, aber dann verletze ich 
die maximale Risetime des LCDs.
Gemäß der internen Beschaltung des Eingangs-Pins E (aus HD44780U 
Datenblatt) vermute ich mal laienhaft, die Risetime ist auf 20 bis 25ns 
(teilweise aber auch 2µs in anderen Datenblättern??) begrenzt, damit 
nicht beide Transistoren zu lange in einem leitenden Zustand verbleiben 
und thermischen Schaden nehmen.

Fürs nächste Mal lege ich R/S auf QH`, dann liegt das Signal in jedem 
Fall
vor dem Enable-Signal an, aber für diesmal ist es dafür zu spät. sonst 
müsste ich 5 Leitungen ändern.

Gruß Dominik

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Dominik schrieb:
> Allerdings waren meine Recherchen im Internet was die
> T_AS betrifft ernüchternd, die Werte, die man findet, schwanken sehr
> stark (zwischen 0 und 240ns).

Meine Güte, das reisst alte Wunden auf :-)

Aus Erfahrung mit lcd4linux weiss ich, dass sich nicht nur die 
Datenblätter unterscheiden, sondern auch die Displays... deswegen musste 
ich damals das Timing komplett konfigurierbar machen, und obendrauf (für 
den "quick win") auch noch einen fuzz-factor einführen, um das Timing 
insgesamt mal schnell verlängern (oder verkürzen) zu können.

Aus meiner Erinnerung führten aber 140 ns für t_AS zu einer 70% 
Erfolgsquote

von m.n. (Gast)


Lesenswert?

Mein Schaltplan als Text:
vom Schieberegister (4094) verwende ich 4 Bit für das Daten-Nibble und 4 
Bit für den Kontrast. Die D-Leitung steuert RS und Strobe dient als 
E-Signal. Damit gibt es keine Timing-Probleme.

von Peter D. (peda)


Lesenswert?

m.n. schrieb:
> Die D-Leitung steuert RS und Strobe dient als
> E-Signal. Damit gibt es keine Timing-Probleme.

So hab ich das auch für den 8Bit-Mode mit einen 74HC164 gemacht.
Geht zu 100%.

von Dominik (Gast)


Lesenswert?

m.n. schrieb:
> vom Schieberegister (4094) verwende ich 4 Bit für das Daten-Nibble und 4
> Bit für den Kontrast. Die D-Leitung steuert RS und Strobe dient als
> E-Signal.

Ok, verstanden D-Leitung (MOSI/SI/DATA) ;-)
das ginge auch, müsste ich nur die SPI-Schnittstelle vorübergehend 
deaktivieren, könnte dann 140ns später latchen/stroben.
Das heißt aber auch, dass Du Enable und Datenbits quasi parallel setzt.
Und zusätzlich hat man noch einen weiteren Ausgang (für die nächste 
platine...).
Die Lösung gefällt und wäre ja praktisch schon bis auf die Verbindung
MOSI->RS auf dem aktuellen Board.

Peter D. schrieb:
> So hab ich das auch für den 8Bit-Mode mit einen 74HC164 gemacht.
> Geht zu 100%.

Dieses Shiftregister ist natürlich perfekt wenn es nur um das
LCD geht, durch den fehlenden Latch kann man E(SS) am Shiftregister 
vorbeiführen. Ich habe es aufgrund der zusätzlichen LED´s mit dem 
74HC595
gemacht, damit diese nicht während den Transfers "glimmen".

Generelle Frage: muss man erst SPI deaktivieren oder kann man den Port 
auch
manuell setzen wenn gerade kein Transfer im Gange ist?

P.S.: Danke nochmal für die Unterstützung im Timer-Thread, hat auch bei 
der LCD-Bibliothek geholfen, die längeren Wartezeiten habe ich jetzt 
über eine
Call-Back-Function gelöst, die auf ...getTime64() basiert :-)

Gruß Dominik

von m.n. (Gast)


Lesenswert?

Dominik schrieb:
> Das heißt aber auch, dass Du Enable und Datenbits quasi parallel setzt.

Das ist nicht der Punkt, da die Datenübernahme mit der fallenden Flanke 
von E stattfindet,

Dominik schrieb:
> Generelle Frage: muss man erst SPI deaktivieren oder kann man den Port
> auch manuell setzen wenn gerade kein Transfer im Gange ist?

SPI wird wohl abgeschaltet werden müssen; alternativ kann man auch ganz 
auf SPI verzichten und die Bits per Software setzen/löschen.
Seinerzeit hatte ich ein 6502-Derivat verwendet, zusätzlich noch ein 
EEPROM mit Data (SDA) und Clock (SCL) angesteuert und 4 x Taster im 
Multiplex abgefragt. SPI gab es nicht und die LCD-Ansteuerung brauchte 
eh viel Wartezeit.

von Dominik (Gast)


Lesenswert?

m.n. schrieb:
> Das ist nicht der Punkt, da die Datenübernahme mit der fallenden Flanke
> von E stattfindet,

Exakt, so habe ich das Datenblatt auch verstanden (Zumindest beim 
Write).
Interessanterweise läuft es bei mir ja sogar obwohl ich die R/S Leitung 
zeitgleich mit den Datenbits setze (etwa 19ns nach der steigenden Flanke 
von E), wobei die lt. Datenblatt eigentlich ja min. 40,140,240.. ns vor 
der steigenden Flanke von E gesetzt sein müsste.
Aber da es fast allen recherchierten Datenblättern widerspricht will ich 
das korrigieren, sonst muss ich irgendwann das LCD tauschen und dann 
geht nix mehr... Deswegen gefällt mir Deine Lösung ja so gut, damit 
werde ich allen gefundenen Datenblättern gerecht :-)

m.n. schrieb:
> SPI wird wohl abgeschaltet werden müssen;
Ja, obwohl es im Datenblatt bei SPI nicht explizit drin steht, Pin 
setzen klappt nur wenn SPI ausgeschaltet wird, wahrscheinlich steht es 
am Anfang, das alle Sonderfunktionen das Ausgangsregister umgehen, 
gerade getestet. Ok, sollte trotzdem kein Problem sein, 
erfreulicherweise nimmt die Clock-Leitung beim Ausschalten des SPI den 
Wert des PINs an, den man gesetzt hat.
Allso zappelt die auch nicht wenn man eine andere Polarität bräuchte.

m.n. schrieb:
> alternativ kann man auch ganz
> auf SPI verzichten und die Bits per Software setzen/löschen.

ja, das will ich hier aber um jeden Preis vermeiden, da ich alle
LCD-Befehle in einem Ringpuffer (s.o.) habe und die Nibbles über
Interrupt Routinen verschickt werden.

Gruß Dominik

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.