Forum: Projekte & Code 7-Segm. LCD-Ansteuerung, 4-stelliges Einbaumodul, Attiny45


von M. N. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von M. N. (Gast)


Angehängte Dateien:

Lesenswert?

Für den einfachen Nachbau bzw. Umbau anbei die Dateien zur Schaltung 
erstellt mit Eagle 4.09.

von Bernd N (Gast)


Lesenswert?

Schönes Projekt. Hast du auch eine Bauteile Liste ? Display etc. ? Wo 
hast du die Platine fertigen lassen ?

von m.n. (Gast)


Lesenswert?

Als Display kann man dies nehmen, wobei die Abbildung nicht korrekt ist. 
Bitte das Datenblatt ansehen: 
http://such001.reichelt.de/index.html?ACTION=3;ARTICLE=10182;SEARCH=lcd%204,0

Was es sonst noch an LCDs gibt, ist hier zu sehen, wobei es auch Typen 
in transflektiver Ausführung gibt. Auch hier bitte in die Datenblätter 
sehen: 
http://www.schukat.com/schukat/schukat_cms_de.nsf/index/CMSFFEDE67DB7032C11C1256DF1003EF651?OpenDocument&wg=W4235&refDoc=CMS963E5A52B42365E9C125707C004A048A&kb=DE112TS-20/7.5

Die anderen Bauteile sind Wald- und Wiesentypen.
Muster-PCB ist von M&V (pcb-center.de).

von M. N. (Gast)


Lesenswert?

Noch etwas zu den Frontrahmen. Der oben verwendete ist ein AR1950 
http://www.schukat.com/schukat/schukat_cms_de.nsf/index/CMSFFEDE67DB7032C11C1256DF1003EF651?OpenDocument&wg=G7831&refDoc=CMSB2DFF5D99FA77051C125709E004C5C9F&kb=AR1950
Ein paar davon habe ich hier zu liegen, falls Jemand diese verwenden 
möchte.

Ebenfalls habe ich noch einige AR1977 mit roter Filterscheibe, die sich 
wie hier gezeigt für 6-stellige 13mm Anzeigen eignen. 
Beitrag "7-Segm.-LED-Anzeige, 6-stellig, statische Ansteuerung mit (74HC)4094"

von Ruedi H. (Firma: prim) (ruediheimlicher)


Lesenswert?

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

von M. N. (Gast)


Lesenswert?

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ß :-)

von Ruedi H. (Firma: prim) (ruediheimlicher)


Lesenswert?

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.

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.