Für stromsparende Anwendungen mit numerischer Anzeige, sind LC-Anzeigen
nach wie vor besonders geeignet. Hier wird eine statische Ansteuerung
mit Schieberegistern gezeigt, die mit kostengünstigen, leicht
verfügbaren Bauteilen auskommt. Die Stellenanzahl läßt sich problemlos
erweitern, sodass auch mehrere Anzeigen von einem µC angesteuert werden
können.
Im Gegensatz zu 7-Segment-Anzeigen mit LEDs, die statisch oder im
Multiplex angesteuert werden können, muß bei LCDs jedes aktive Segment
mit einer Wechselspannung (typ. 30-100Hz) bezogen auf die 'backplane'
(BP) betrieben werden.
Jede angezeigte Stelle besteht aus acht Segmenten 'A' – 'G' und '.'. Da
die Stromaufnahme sehr gering ist, reicht pro Stelle ein CMOS-4094
Schieberegister. Für eine 4-stellige Anzeige braucht man somit vier
Schieberegister. Ferner braucht man ein Steuersignal für die gemeinsame
BP. Da der Dezimalpunkt ganz rechts keinen Sinn ergibt – in der Regel
ist er auf der Anzeige auch garnicht ausgeführt – kann man den 8.
Ausgang eines Schieberegisters hierfür verwenden.
Wie gesagt müssen die Segmente mit Wechselspannung bezogen auf BP
betrieben werden. In der gezeigten Schaltung/Programm wird dies dadurch
erreicht, dass die zugehörigen Bits im Speicher für die BP immer auf '0'
und ein aktives Segment auf '1' gesetzt werden. Bei der Ausgabe auf die
Schieberegister, die per Interrrupt mit 100Hz erfolgt, werden die
auszugebenden Bytes (Digits) einmal wie abgespeichert und anschließend
invertiert ausgebenen (EXOR mit 0xff). Dadurch wird an den aktiven
Segmenten eine 50Hz Wechselspannung in Bezug auf BP erzeugt, die ein
Tastverhältnis von typ. 50% aufweist. Dies ist wichtig, damit sich an
den Segmenten kein Gleichspannungsanteil bildet, der unter 1% bleiben
muß.
Um die Signale zur Ansteuerung gering zu halten, werden nur LCD_DATA,
LCD_CLK und LCD_STR für die 4094 ausgegeben. Der '1' Pegel für OE wird
aus dem zyklischen LCD_STR-Signal gewonnen und zwischengespeichert.
Siehe Schaltplan: R1, C1, R2, D1
Auf der Platine zur Ansteuerung ist noch Platz für einen Attiny45/85,
mit dem sich einfache Anwendungen umsetzen lassen. Mit den 'Innereien'
des Tiny45 lassen sich zum Beispiel eine Temperaturanzeige/Überwachung
oder – wie im angehängten Programm 'LCD_4_45.c' – ein
Spannungs-Messmodul aufbauen. Es geht dabei nicht um
Präzisionsmessungen, sondern um Beispiele für eigene Programme.
Es wird gezeigt, wie die LCD-Ansteuerung per Interrupt erfolgt, wie
'int'- oder 'float'-Zahlen (int32_t x1000 skaliert auf drei
Nachkommastellen) ausgeben werden, wie sich die Schaltung per
3V-Kopfzelle sparsam ein/ausschalten und betreiben läßt sowie ein paar
kleine programmtechnische Spielereien. Eine nähere Beschreibung der
EIN-AUS-Funktion findet sich hier:
Beitrag "EIN-AUS mit Taster per Interrupt, ATtiny25 o.ä."
Im ausgeschaltenten Zustand liegt die Stromaufnahme bei <0,3µA und im
Betrieb bei <0,5mA. Eine CR2032 Knopfzelle reicht für >400h
Betriebsstunden. Die LC-Anzeige verblasst bei Vcc <= 2V; Vcc kann aber
auch bis 5V betragen.
Der Musteraufbau (Bilder) weicht noch etwas von der endgültigen
Schaltung ab. Falls mehr IO-Pins notwendig sind, fände ein ATtiny44 noch
genug Platz auf der Platine. Bei Gelegenheit werde ich ggf. noch ein
Programm für einen einfachen 4-stell. Drehzahlmesser hinzufügen.
M. N. schrieb:> ... Bei der Ausgabe auf die> Schieberegister, die per Interrrupt mit 100Hz erfolgt, werden die> auszugebenden Bytes (Digits) einmal wie abgespeichert und anschließend> invertiert ausgebenen (EXOR mit 0xff). Dadurch wird an den aktiven> Segmenten eine 50Hz Wechselspannung in Bezug auf BP erzeugt, die ein> Tastverhältnis von typ. 50% aufweist. Dies ist wichtig, damit sich an> den Segmenten kein Gleichspannungsanteil bildet, der unter 1% bleiben> muß.
Die Schaltung ist genau das, was ich brauche, um einen ICL7107 zu
ersetzen. Allerdings blicke ich bei der ISR nicht so ganz durch.
Was macht die Variable static uint8_t temp? Die wird ja jedes Mal neu
definiert. Was ändert sich da mit dem ^= 0xff?
Bin offensichtlich mit C noch nicht so sattelfest. Gab's zu Fortran's
Zeiten noch nicht.
Danke und Gruss
Ruedi
Ruedi Heimlicher schrieb:> Was macht die Variable static uint8_t temp? Die wird ja jedes Mal neu> definiert.
Das static sorgt dafür, dass temp einen festen Speicherplatz bekommt,
beim Programmstart einmalig initialisiert wird (hier mit 0x00) und nur
in der ISR bekannt ist und verändert werden kann.
> Was ändert sich da mit dem ^= 0xff?
temp ^= 0xff;
kann man auch auseinanderziehen und so formulieren:
temp = (temp ^ 0xff);
Alle Bits von temp werden invertiert (EOR-Befehl beim AVR) und temp
zugewiesen, sodass in aufeinanderfolgenden ISR-Aufrufen temp zwischen
den Werten 0x00 und 0xff wechselt: 0x00, 0xff, 0x00, 0xff, ....
Bei der Ausgabe der Segmente werden diese durch "anzeige[n] ^ temp"
abwechselnd unverändert (temp ist 0x00) oder invertiert (temp ist 0xff)
ausgegeben. Da auch die backplane (Q5 von IC1) mit invertiert wird,
ensteht an den aktiven Segmenten eine Wechselspannung.
> Bin offensichtlich mit C noch nicht so sattelfest. Gab's zu Fortran's> Zeiten noch nicht.
Sei froh, dass ich Dir keine Lochkarten zuschicken muß :-)
M. N. schrieb:> Das static sorgt dafür, dass temp einen festen Speicherplatz bekommt,> beim Programmstart einmalig initialisiert wird (hier mit 0x00) und nur> in der ISR bekannt ist und verändert werden kann.
Danke vielmals, genau das hat mir gefehlt.