Unterrichts- und Lernmaterial für Mikrocontroller
Unterrichts- und Lernmaterial fürMikrocontroller

SPI besser verstehen - Teil 2

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:

Abbildung 1 - Jeder Pin des ATtiny45 ist mit mehreren Optionen belegt. PB0, PB1 und PB2 sind für den SPI-Bus vorgesehen.

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.

Übung 1 - ATtiny45 und 7-Segment-Anzeige

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
  • 1x  ATtiny45 und Nullkraftsockel
  • 1x  7-Segment-Anzeige (z.B. SA52-11HWA von Kingsbright)
  • 1x  74HC595, 8-Bit Schieberegister
  • 8x  Widerstand, 330 Ohm
  • 1x  Steckbrett
  • 1x  Brenner mit USB-Kabel
  • 1x  Programm BASCOM und Rechner
  • 1x  Datenblatt des ATtiny45
Aufgabe
  • Baue die Schaltung nach der Vorlage auf.
  • Übertrage das Programm 7Segment_1.bas in den BASCOM-Editor und speichere es ab.
  • Überprüfe das Programm auf syntaktische Fehler und korrigiere ggf. angezeigte Fehler.
  • Brenne anschließend das Programm in den Controller.
  • Überprüfe anschließend, ob auf der 7-Segment-Anzeige die Zahl 6 dargestellt wird.

Schaltungsaufbau

Abbildung 2 - Schaltungsaufbau mit 74HC595, 7-Segment-LED-Display und ATtiny45.

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.

 

  • Das Programm ließe sich sehr einfach erweitern zu einem Aufwärts- oder Abwärtszähler. Dazu fehlen ein paar Programmzeilen. Das wäre eine gute Aufgabe zur Vertiefung.

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).

Abbildung 3 - SPI-Zeitdiagramm für einen ATtiny45

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.

Abbildung 4 - Software-SPI Startkondition

Übung 2 - ATmega8A und 8x 7-Segment-Anzeige

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.

Abbildung 5 - 8-stellige 7-Segment-LED Anzeige mit SPI-Schnittstelle

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
  • 1x  ATmega8A und Nullkraftsockel
  • 1x  8x 7-Segment-Anzeigemodul
  • 1x  Steckbrett
  • 1x  Brenner mit USB-Kabel
  • 1x  Programm BASCOM und Rechner
  • 1x  Datenblatt des ATtiny45 und des MAX7219
Aufgabe
  • Baue die Schaltung nach der Vorlage auf.
  • Übertrage das Programm 8x_7Segment_1.bas in den BASCOM-Editor und speichere es ab.
  • Überprüfe das Programm auf syntaktische Fehler und korrigiere ggf. angezeigte Fehler.
  • Brenne anschließend das Programm in den Controller.
  • Überprüfe anschließend, ob das Anzeigemodul
    a) einen Schnelltest durchläuft (alle Anzeigesegmente gehen an)
    b) die Zahlen von 0 bis 9 und anschließend fünf weitere Zeichen ausgibt.

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

  1. Welche Aufgabe hat der 8-Digit LED Display Driver Baustein in der Schaltung?
  2. Gib die Größe der Datenpakete an die an den Treiber MAX7219 geschickt werden müssen.
  3. Gib das Datenformat für eine serielle Kommunikation mit einem MAX7219 an.
  4. Gib den CPOL und CPHA Wert für einen Datentransfer an.
  5. Gib die Anzahl der Digit-Register, ihre Bezeichnung und Adresse an.
  6. Gib die Anzahl der Control-Register, ihre Bezeichnung, Adresse und Funktion an.

Das Programm 8x_7Segment_1.bas

Abbildung 6 - Variablendeklaration, Konfiguration der Hardware-SPI in BASCOM
Abbildung 7 - Register deklarieren
Abbildung 8 - Hauptprogramm

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).

Abbildung 9 - Zeitdiagramm für SPI bei einem ATmega8A

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

Druckversion Druckversion | Sitemap
© Reinhard Rahner - Gettorf