Materialien zum Unterricht

Der Controller lernt richtig zählen

In der vergangenen Übung hat der Controller wie ein Kindergartenkind mit den Fingern gezählt. Bei jedem neuen Ding (Apfel, Auto, Blume...) hat er wie ein Anfänger einen Finger gehoben, also eine LED angemacht. Bei 10 war aber das Ende der Fahnenstange erreicht.

Nun soll der Controller eine zweistellige 7-Segment-Anzeige ansteuern und richtige Zahlen anzeigen. Das heißt, er soll die Zahlen lernen und sie auf einer Anzeige ausgeben. Da die Anzeige zwei Ziffern enthält, muss er jetzt bis 100 zählen.

Aber wie in der Grundschule gehen wir wir langsam an die Sache ran. Erstmal die 10 Ziffern und diese auf einer Stelle anzeigen.

Hardware

Was ist eine 7-Segment-Anzeige?

Eine 7-Segment-Anzeige besteht aus sieben einzeln ansteuerbaren Leuchtdioden und eventuell einem Punkt.

Mit einer solchen Anzeige lassen sich alle 10 Ziffern gut darstellen.

Die acht Segmente der Anzeige bekommen jeweils eine Bezeichnung:

Die acht Leuchtdioden in der Anzeige sind mit der Anode zusamengeschaltet. Man sagt, die Anzeige hat eine gemeinsame Anode.

Im Gegensatz dazu gibt es auch Anzeigen mt gemeinsamer Katode.

Damit ist klar, dass die gemeinsame Anode vorerst an dem Pluspol angeschlossen wird und die einzelnen Segmente über jeweils einen Vorwiderstand am Controller. Wir verwenden dazu unseren bisherigen LED_PORT, also Port B.

Vor dem Verdrahten brauchen wir aber noch die Anschlussbelegung der Anzeige. Von unten betrachtet sieht sie so aus:

Die 18 Anschlüsse sind notwendig, da die Anzeige ja zwei Ziffern darstellen kann. Die Zuordnung erfolgt nun so:

Anschluss-
Nummer

Belegung Anschluss-
Nummer
Belegung
1
C1
10
G2
2
E1
11
A2
3
D1
12
F2
4
Anode 1
13
B2
5
Anode 2
14
B1
6
D2
15
F1
7
E2
16
A1
8
C2
17
G1
9
H2
18
H1

Die rechte Ziffer ist Nummer 2, die linke Nummer 1! Da wir mit der Einerstelle einer zweistelligen Zahl beginnen wollen, verdrahten wir zuerst Nummer 2.

Die Anode 2 legen wir an den Pluspol und die anderen Anschlüsse an die Pins des Port B. Auf dem Testboard hat sich folgende Zuordnung ganz gut gemacht:

Pin am Port B Anschluss an der Anzeige
0
H2 = 9
1
C2 = 8
2
E2 = 7
3
D2 = 6
4
G2 = 10
5
A2 = 11
6
F2 = 12
7
B2 = 13

Wie wir daraus nun Ziffern machen, legen wir über die Software fest. Deshalb ist es auch nicht schlimm, wenn die Verbindung zwischen den Pins und den Anschlüssen der Anzeige nicht in der vorgeschlagenen Reihenfolge geschieht. In der vorgeschlagenen Verdrahtung sind die Leitungen kurz und kreuzen sich nicht..

Software

Wir starten ein neues Projekt zaehler_2 und kopieren den Quelltext aus dem vorherigen Projekt hinein. Wenn wir das jetzt auf dem Controller laufen lassen (vielleicht ist es auch noch im Speicher des Controller), dann wird zwar mit jedem Tastendruck etwas verändert, aber wie Ziffern sieht das noch nicht aus.

Wir müssen für jede einzelne Ziffer 0 bis 9 festlegen, an welchem Pin eine 1 oder eine 0 anliegen muss, damit auf der Anzeige die Ziffer dargestellt wir. Es reicht also nicht aus, einfach den nächsten Pin einzuschalten, sondern jetzt müssen richtige Bitmuster bereit gestellt werden.

Wie sähe das Muster für die Ziffer 3 aus? Es müssen alle Segmente, außer E und F eingeschaltet werden. Wir erinnern uns, eingeschaltet bedeutet am Pin eine 0!!

 

Pin am Port B 7 6 5 4 3 2 1 0
Segment an der Anzeige                
Ziffer 0
0 0 0 1 0 0 0 1
Ziffer 1
0 1 1 1 1 1 0 1
Ziffer 2
0 1 0 0 0 0 1 1
Ziffer 3
               
Ziffer 4
               
Ziffer 5
               
Ziffer 6
               
Ziffer 7
               
Ziffer 8
               
Ziffer 9
               

Aufgabe: Erstelle für die restlichen Ziffern das Bitmuster. (Am besten mit Zettel und Stift)

Wo legen wir diese Bitmuster nun ab? Natürlich in Variablen.
Und welche Namen bekommen diese Variablen? Z.B. Ziffer0, Ziffer1 ...

Wir werden etwas später sehen, dass das zwar möglich ist, aber bei der Anzeige von Ziffer ein sehr umständliches Vorgehen erfordert. Deshalb nutzen wir eine neue Art von Variablen: das Array und legen die Bitmuster in den Elementen ziffer[0], ziffer[1] usw. ab.

Wir zerlegen das Programm

Unser Programm soll nach der Fertigstellung zwei Dinge tun

  1. Ständig den Taster abfragen, ob er gedrückt wurde
  2. Nach dem Drücken des Tasters die Ziffer auf der Anzeige um eins erhöhen

Damit lässt sich unser Programm in zwei Teile zerlegen, die einzeln betrachtet nichts miteinander zu tun haben. Der Teil 1 kann ewig den Taster abfragen, wenn er nicht gedrückt wird, muss der Teil 2 auch nicht aktiviert werden.

Es hat sich nun gezeigt, dass ein Programm wesentlich übersichtlicher und fehlerärmer wird, wenn man es in Funktionen zerlegt. In unserem Fall lassen wir die Tastenabfrage in der Hauptfunktion main() und schreiben einfach eine weitere Funktion mit dem Namen anzeige(), die im gewünschten Moment sich um die Anzeige kümmert.

Diese zweite Funktion wird bei Bedarf von der Hauptfunktion aufgerufen.

Vereinfacht sieht das Programm so wie in dem rechts dargestellten Ablaufplan aus.

Wir legen zu Beginn eine Variable zaehler mit 0 fest.

Danach stürtzt sich das Programm in die Endlosschleife und bringt die voreingestellte 0 sofort zur Anzeige.

Als zweite Aufgabe muss die Schleife den Taster beobachten. Und nur wenn er gedrückt wurde, wird die Variable zaehler um eins erhöht.

Damit die Funktion anzeige() weiß, welche Ziffer sie anzeigen soll, müssen wir ihr beim Aufruf die Variable zaehler übergeben.

Das konkrete Progamm

Die Funktion anzeige(zaehler) wird vor der main()-Funktion vereinbart und mit den Anweisungen gefüllt:

Die main()-Funktion ist der aus der vorhergehenden Übung ähnlich:

Leider kann unser Zähler nur bis 9 zählen. Das ist recht wenig und wird in der nächsten Übung geändert.

zurück