7-Segment-Display-Ansteuerung
über den I2C-Bus

Motivation:

Um auf dem µPSD-Testboard - abgesehen von den 2 LED's - eine Darstellung von Fehlercodes und Zustandswerten zu ermöglichen, schien es mir sinnvoll, eine 7-Segment-Anzeige auf der Platine unterzubringen, die mit dem µPSD angesteuert wird.

Von einem ausrangierten Cyclades-PM-PCB (Cyclades Power-Leiste, Power-Distribution-Unit für Remote-Power-Switching) habe ich die 2-digit 7-Segment-Anzeige und einen LED-Driver-Chip mit I2C-Bus-Interface, den SAA1064, gewonnen. Da der µPSD3233B ein I2C-Interface on-board hat (mit dem DDC-Port eigentlich 2x) bot es sich an, damit das Display anzusteuern. Außerdem wollte ich schon seit langen mal für die I2C-Schnittstelle programmieren.

Der Vorteil der Ansteuerung über I2C ist, daß man nur 2 Datenleitungen zwischen µC und Segmentanzeige braucht, nämlich SDA (Datenleitung) und SCL (Clock-Leitung). Dazu kommen allerdings noch 2 Leitungen für VCC und GND.

Realisierung:

Um auch andere Ausgabemodule oder Peripherie am µPSD zu betreiben, habe ich die 7-Segment-Displayeinheit auf eine Adapterplatine mit Stiftleisten gelötet, die auf das µC-Testboard aufgesteckt wird. Daher kommen auch die 2x3 Buchsenleisten auf dem µC-Testboard aus dem vorangegangenen Projekt.

Hier beide Seiten der Steckplatine mit 7-Segment-Display und I2C-Driver-Chip auf der Vorderseite und der Freiverdrahtung auf der Rückseite:

7-Segment-Display 7-Segment-Display

Die Verdrahtung von SAA1064 mit der 7-Segment-Anzeige kann man im Datasheet, Seite 13 nachschlagen. An den Stiftleisen werden, wie oben beschrieben, SDA, SCL, VCC und GND angeschlossen.

Den zuvor vom Cyclades-PM-PCB "recycle-ten" originalen SAA1064 in SMD-Gehäuse und die 1. Testplatine habe ich wegen nichtfunktionierenden Display aufgrund - wie sich später rausstellte - fehlenden Pull-up-Widerständen für SDA und SCL unnötigerweise in die Tonne getreten.

Den SAA1064 in DIP-Gehäuse (DIP - Dual-In-Line), der auf dem Bild zu sehen ist, habe ich bei CC Tools bestellt, da er bei Conrad-Electronic nicht verkauft wird, bei Reichelt.de mit Versand zu teuer war und ich bei "CC Tools" den Artikel in München (in einem Folkladen ;-) bequem abholen konnte.

Die 7-Segment-Platine auf dem µ-Testboard aufgesteckt, sieht dann wie folgt aus (unter der Platine liegt noch der Serial-Port):

7-Segment-Display

Hier ein Bild mit abgezogener Anzeige-Platine:

7-Segment-Display

Die ganze Testumgebung mit FlashLink-Adapter zum Programmieren, dem µC-Testboard mit Display und angeschlossenen Netzteil für das Testboard:

7-Segment-Display

Debugging:

Die ersten Versuche, das 7-Segment-Display zum Funktionieren zu bringen, waren nicht sehr erfolgreich und ich war schon fast am Aufgeben. Ich habe erst eine Ansteuerung in Assembler programmiert, dann mit sdcc in C umgeschrieben und schließlich die Referenz-Implementierung für I2C-Master-Betrieb von dem DK3200-Kit genommen und mit Keil µVision-Compiler compiliert. Alles ohne Erfolg.

Dann fand ich nach einigen Überlegen doch noch den Grund für das Problem: An den SDA- und SCL-Leitungen fehlten die externen Pullup-Widerstände. Das stand weder im µPSD32xx Datasheet, noch im SAA1064 Datasheet, sondern wird wohl als bekannt vorausgesetzt. Darauf gekommen bin ich, als ich gesehen habe, daß die I2C-GPIO Open-Drain sind und keinen High-Low-Pegel schalten.

Als die Pullup-Widerstände (1.5K) dann eingesetzt waren, lief (mit niedrigen I2C-Busspeed) alles wunderbar und ich konnte die Ansteuerung in Assembler fertigschreiben. Die max. Übertragungsgeschwindigkeit auf dem I2C-Bus für den mit 20.480Mhz-Quartz getakteten µPSD habe ich nach einigen Herumspielen mit dem fOSC-Divisor schnell herausgefunden. Der Divisorwert muß mind. 120 betragen, der Bus-Speed liegt damit bei max. 171 KHz.

Eigene Programme:

Assemblerprogramm zum Testen der 7-Segment-Anzeige (zeigt Wert 34 auf dem Display an):
upsd-7seg-test.asm

Assemblerprogramm, das Timer0- und I2C-Interrupts nutzt, um einen Counter zu realisieren, der von 0 bis 99 im Sekundentakt hochzählt:
upsd-counter.asm

Compiliert werden die Programmer wie schon im vorigen Projekt beschrieben mit:

as8051 -slox upsd-7seg-test
aslink -i upsd-7seg-test upsd-7seg-test
as8051 -slox upsd-counter
aslink -i upsd-counter upsd-counter
    
Die Files im Intel-Hex-Format mit der Endung .ihx werden wieder in .hex umbenannt und können dann zum Flashen mit CAPS verwendet werden.

Um mir Tipparbeit zu ersparen und das Compilieren und Linken zu automatisieren, habe ich noch ein Makefile geschrieben.

Im Home-Verzeichnis wird dazu mit 'mkdir uPSD' ein Unterverzeichnis angelegt, und mit 'unzip -L av4p11.zip' werden dort die asxxxx-Tools entpackt.

Die Assembler-Programme upsd-7seg-test.asm und upsd-counter.asm und das Makefile habe ich nach $HOME/uPSD/asxxxx/projects kopiert. Dort lassen sich dann durch Eingabe von 'make' die Hex-Files erzeugen (vorausgesetzt, das make-Tool ist installiert). Mit 'make clean' wird wieder aufgeräumt.


Next: Als nächstes habe ich mich mit Atmel-µC's beschäftigt. Bei Pollin gibt es ein preiswertes Evaluationsboard, mit dem man z.B. den ATtiny2313 programmieren kann. Mehr dazu hier.

zurück zur Übersicht