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
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
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
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.
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%.
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
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.
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