Nachdem in Kapitel 1 über den SPI-Bus allgemein und die Beschaltung und Programmierung mit einem Arduino UNO im Besonderen gesprochen wurde, geht es jetzt um die Beschaltung und Programmierung eines ATtiny45 Mikrocontrollers, der mit einer 8x 7-Segment-Anzeige verbunden ist. Dazu wird in Übung 1 mit einer einfachen 7-Segment-Anzeige und ihrer Ansteuerung unter BASCOM gestartet und in Übung 2 mit einem ATmega8A ein 8x 7-Segment-Modul untersucht.
Mit dem ATtiny45 wird ein Software-SPI, mit dem ATmega8A ein Hardware-SPI programmiert.
Kenndaten des ATtiny45
Fangen wir mit der Pinbelegung an. Dem Datenblatt zu entnehmen ist:
PB2 ist vom Hersteller hardwaremäßig alsMaster-Schiebetaktausgang für SPI vorgesehen. PB1 für MISO (Master Data Input, Slave Data Output) und PB0 für MOSI (SPI Master Data Output, Slave Data Input). Es steht beim ATtiny45 nur der bidirektional PortB mit internen einzeln zuschaltbaren Pull-up Widerständen zur Verfügung (PB5:PB0).
Voreingestellt ist über den internen RC-Oszillator eine Taktfrequenz von 8.0 MHz, der nicht flüchtige Speicher hat eine Größe von 4 kByte und das interne SRAM verfügt über 256 Bytes.
Die Ansteuerung einer 7-Segment-Anzeige über den Winzling ATtiny45 mit nur sechs Pinanschlüssen (PB0 ... PB5) gestaltet sich über den SPI-Bus mit einem 74HC595 LED-Treiberbaustein recht einfach. Den Datenblättern entnimmt man die Pinbelegungen. Es werden die vom Hersteller des IC bereitgestellten Hardwarevoraussetzungen für den SPI-Bus ausgenutzt, also kein Bit-Banging.
ATtiny45 steuert 7-Segment-Anzeige | |
Material |
|
Aufgabe |
|
Schaltungsaufbau
Das Programm 7Segment_1.bas
Wie arbeitet das Programm 7Segment_1.bas?
Zeilen 18 - 23
In den ersten Zeilen werden ein Array Zahl mit 10 Elementen und eine Zählvariable I definiert. Die drei Zuweisungen sind die kodierten Anweisungen zur Darstellung der Ziffern 0, 1 und 2 auf einem 7-Segment-Display. Diese Werte sind Hardware abhängig; je nach Verdrahtung ergeben sich völlig andere Werte.
In meinem Fall sind die 8 LED-Segmente in der Ziffernanzeige den folgenden Ausgangspins am 74HC595 Baustein zugeordnet:
Die LED-Segmente sind je nach verwendeter 7-Segment-Anzeige unterschiedlich beschriftet. Für den angegebenen Typ SA52-11HWA von Kingsbright liegen die entsprechenden LED-Segmente wie in Abb. 3 gezeigt. Die Durchnummerierung der zehn Anschlusspins ist ebenfalls angegeben.
Die Anzeige hat eine gemeinsame Anode für alle 8 LEDs. Das heißt, eine LED leuchtet nur dann, wenn ihr entsprechender Pin auf GND gezogen wird. Liegen alle Pins der LED-Anzeige auf 1 oder HIGH, leuchtet kein Diodenelement auf, umgekehrt leuchten alle 8 Elemente auf.
Die Zahl 1 wird zum Beispiel durch die beiden LED-Segmente b und c dargestellt. Die Ausgänge QE und QC müssen auf 0 und alle restlichen auf 1 gezogen werden.
In der Tabelle steht die Codierung der Ziffer 1. In der unteren Zeile der Tabelle ist der entsprechende Hexadezimalcode 0xEB angegeben. Und der taucht in Programmzeile 22 auf.
Zeilen 25 - 26
Die softwaremäßige Einbindung einer SPI erfolgt über Programmzeile 25. Die Hilfefunktion in BASCOM gibt weitere Auskünfte.
Zeilen 28 - 33
In der FOR...NEXT-Schleife werden mit dem Befehl spiout Daten in das Schieberegister des Bausteins 74HC595 übertragen.
Bemerkungen zum Software-SPI
Wie bekannt, lässt sich beim Software-SPI das Timing bei der Datenübertragung nicht verändern, dafür können die I/O Pin am Controller frei gewählt werden.
Bei einem ATtiny45 mit 8 MHz liegt die maximale Taktfrequenz auf dem SPI nach Herstellerangaben bei 8 MHz/2 = 4 MHz; die gemessene Taktzeit liegt bei 39 µs (ca. 26 kHz) mit einem HIGH-Anteil von 14 µs und entsprechend einem LOW-Anteil von 25 µs. Das ist ziemlich langsam, reicht für unsere Zwecke aber vollständig aus. 4 µs vor Taktbeginn wird der MOSI-Ausgang (dout) aktiv. Für die Übertragung eines Bytes werden 285 µs benötigt. Der CS-Ausgang wird ca. 18 µs vor dem ersten Taktimpuls auf LOW gezogen (Abb. 3).
Die Startkondition für einen SPI (spiinit) wird vom Master (hier: ATtiny45) vorgegeben; er zieht SDA oder MOSI auf LOW, während SCL auf HIGH verbleibt.
Anschließend zieht der Master SCL auf LOW; der ATtiny45 erledigt das nach ca. 95 ns (Abb. 4). Damit wird der SLAVE (hier: 74HC595) aus seinem Schlaf gerissen oder, wenn er bereits tätig war, aufgefordert, seine laufenden Tätigkeiten sofort abzuschließen, da der Master für ihn eine Botschaft hat.
In der folgenden Übung geht es um ein LED-Modul aus acht 7-Segment-LED-Anzeigen, die über einen seriellen Displaytreiber, einem MAX7219, angesteuert werden. Die Aufgabe besteht darin, das Modul so anzusteuern, dass auf der ganz rechts befindlichen Anzeige die Zahlen von 0 bis 9 ausgegeben werden. Klingt einfach, aber wie immer steckt der Teufel im Detail.
Die Anzeigeeinheit verfügt über fünf Zugangspins: Vcc, GND für die Spannungsversorgung, sowie DIN, CS und CLK für den SPI.
ATmega8A steuert 8x 7-Segment-Anzeige-Modul | |
Material |
|
Aufgabe |
|
Schaltungsaufbau
Bevor es an die Programmierung des Moduls geht, wird ein Zugang zur Ansteuerung der 8 7-Segment-LED Displays über den Treiberbaustein MAX7219 gesucht. Dazu müssen - wie immer bei einem neuen IC - das Datenblatt des MAX7219 studiert und ein paar Fragen beantwortet werden.
Aufgaben
Das Programm 8x_7Segment_1.bas
Bemerkungen zum Hardware-SPI
Bei einem ATmega8A mit 8MHz beträgt die gemessene Taktzeit 2 µs mit einem HIGH- und LOW-Anteil von je 1 µs. Für die Übertragung eines Bytes sind ca. 16 µs notwendig, bei einer eingestellten Taktrate von 16 (vergleiche diesen Wert mit dem ATtiny45 aus Übung 1).
Mögliche Lösungen zur Aufgabe
zu 1
Ein Display Driver Baustein wird zur Ansteuerung von 7-Segment-LED Anzeigen, Bargraph-Displays oder LED-Matrixanzeigen eingesetzt. Er verfügt über eine schnelle serielle Schnittstelle, eine digitale und analoge Helligkeitssteuerung, einen BCD-Decoder und bietet die Möglichkeit, bis zu 8 Digits anzuzeigen.
zu 2
Die Datenpakete sind 16 Bit groß.
zu 3
Das serielle Datenformat (16 Bit) setzt sich aus drei Abschnitten zusammen:
D15:D12 beliebiger Wert (hier: 0)
D11:D08 Adresse
D07:D00 Daten
zu 4
Die Daten werden mit der steigenden Flanke in das 16-Bit Schieberegister geschoben, dazu muss vorher /CS auf LOW gezogen werden. Sind alle 16 Bit übertragen, wird /CS wird auf HIGH gezogen. Der CPOL und CPHA Wert sind beide 0.
zu 5
zu 6