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
Schaltbild wäre nicht schlecht. Habe halbwegs durchgelesen aber ohne Bild kann ich es mir trotzdem nur sehr schwer vorstellen wie es aussieht.
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
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.