7-Segment LCD 2stellig
Für eine Luftfeuchte-Anzeige habe ich ein zweistelliges Modul erstellt, das über I2C-Bus wie ein I2C-Baustein zu behandeln ist.
Hardware
Die LCD-7Segment-Anzeige, zweistellig, gibt es bei Reichelt und hat 18 Anschlüsse. Zum Bedienen der Anzeige genügt daher ein ATmega8 mit internem Oszillator.
Der Druckstock wurde "leiterbahnorientiert" entworfen, mit möglichst wenig Überkreuzungen der Leiterbahnen. Die dadurch entstandene fast willkürliche Zuordnung LCD-Pin ↔ Controller-Pin wird per Software in Lookup-Technik behoben.
Die ISP-Buchse und die I2C-Buchse stellen eine individuelle Lösung dar. Hauptvorteil ist die Spiegelbarkeit: Spiegelfehler beim Druckstockentwurf spielen dann keine Rolle und auch das Stecken des Steckers kann wahlweise von B- oder von L-Seite erfolgen. Buchsen und Stecker lassen sich leicht aus DIL-IC-Sockeln mit gedrehten Kontakten herstellen.
Bild 1 Baustein, von L-Seite her
Software
Bei der Software steht die Herstellung des LCD-Signals und die Erstellung der Lookup-Tabelle im Vordergrund. Da hier die Pins außer fürs LCD nur noch für die I2C-Schnittstelle benutzt werden, braucht man eigentlich garnicht auf anderweitig benutzte Pins achten. Wegen eines größeren Projekts (3 stellige Anzeige mit TQFP44-Kontroller) wurde auch darauf geachtet. Mit den Kommentaren im .asm file habe ich versucht, möglichst viel zu erklären, ich hoffe, dass das ausreicht. Speziell das Vorgehen bei der Erstellung der Lookup-Tabelle ist in der Beschreibung des Aufbauens nochmals dargestellt.
Aufbau
- Erste Bestückungsstufe
ISP-Buchse, Stützkondensator und Kontroller.
Es empfiehlt sich, zunächst den Kontroller nur mit den Pins einzulöten, die für den ISP-Betrieb erforderlich sind. Im Fehlerfalle ist das Auslöten dann viel leichter. Ein erstes Erfolgserlebnis besteht dann darin, die Signatur abzurufen und sie vom Kontroller zurückzubekommen.
- Zweite Bestückungsstufe
Den Kontroller mit einem Prüfprogramm der Form (inc r16, out portn,r16))laden. Dann liefert er Rechteckspannungen an den Pins. Mit dem Scope kann man dann schnell Kurzschlüsse zwischen den Pins (z.B. bei TQFP44 wichtig) oder Leiterbahnunterbrechungen aufspüren. Besonders fies wirkt sich aus, wenn die Reset-Leitung eine Verbindung zu einem Portpin hat: Der Kontroller lässt sich zwar programmieren, aber sobald in init des Programms der Portpin zum Ausgang erklärt wird, stürzt der Kontroller ins Reset.
- Dritte Bestückungsstufe
Das LCD einlöten und den Kontroller mit der Programmversion mit rcall Segmente1 laden. Da sollte mit dem Scope erkennbar sein, ob alle Pins mit Signal versorgt sind. Liegt eines der Pins an DC (GND oder VCC) würde das zur Zerstörung des Display führen. Ohne Scope gehts auch mit DC-Voltmeter zu kontrollieren: Die Gleichspannung zwischen backplane und Segmentanschlüssen sollte kleiner als 50 mV sein (Datenblatt). Die Spannung an der Backplane, wegen der symmetrischen Rechteckspannug sollte VCC/2 betragen.
- Vierte Bestückungsstufe
Die Programmversion mit rcall Segment2 aufspielen. Und gegebenenfalls auf richtige Slave-Adresse einstellen. Die I2C-Routine ist eine Magerversion, läuft halt so gerade, ohne Fehlerbehandlung usw. Aber mir gehts mehr darum, zu zeigen, wie ein 7-Segment-LCD angesteuert wird. Jedenfalls hab ichs an diesem Projekt gelernt.
Erstellung der Lookup-Tabelle
Da man dabei sehr schnell die Übersicht verliert, verwende ich das Tabellenblatt aus der Anlage (Tabellenblatt).
Die erste Tabelle ist die generelle Zuordnung Ziffer-Segment und kann irgendwo abgeschrieben werden oder einfach selbst erstellt werden.
Die zweite Tabelle führt zunächst nur die Bits für portB auf. Durch Setzen einzelner Bits von r2 in der Programmversion mit rcall Segmente 1 (oder aus dem Schaltplan) kann man die Zuordnung Portbit ↔ Segment finden. Setzt man z.B. Bit 0 von r2, wird das Segment f der Zehnerstelle aktiv. In die unterste Zeile der Tabelle trägt man dann eben fZ ein. So arbeitet man eben alle Segmente durch. Anschließend kopiert man z.B.die Spalte f der ersten Tabelle in die Spalte B0 bzw. fZ Sind die nicht benutzten Pins mit 0 belegt kann man aus den Zeilen die passenden 8-Bit Bytes bzw. die hex-Zahlen auslesen und ins Programm übertragen.