Dies ist eine alte Version des Dokuments!
Mit den Klassen Button und LED weiter arbeiten
Lassen Sie uns diese Arbeitsweise vertiefen. Das zweite Beispiel in klassischem C war der intelligente Lichtschalter. Dabei sollte per Tastendruck eine LED eingeschaltet werden. Im letzten Abschnitt benutzten wir die vorhandene Klasse Led. Aufmerksame Beobachter haben gewiss schon die Klasse Button im selben Paket entdeckt.
Die Aufgabe
Es ist eine Mikrocontrolleranwendung zu entwickeln, bei der durch Drücken einer Taste eine LED eingeschaltet wird.
Vorbereitung
Wenn Sie jetzt noch das Klassendiagramm geöffnet haben wählen Sie im Kontextmenü (rechte Maustaste) des Diagramms den Menüpunkt „nach oben“. Falls das Projekt nicht mehr geöffnet ist, öffenen sie das SiSy UML-Projekt wieder. Legen Sie ein neues Klassendiagramm an, wählen Sie die Sprache ARM C++ und stellen Sie die Hardware (STM32F407) ein. Beim Öffnen des Diagramms (rechte Maustaste, nach unten) laden Sie aus dem SiSy LibStore die Diagrammvorlage Application Grundgerüst für PEC Anwendungen (XMC, STM32, AVR). Weisen Sie das Treiberpaket für STM32F4 zu.
Lösungsansatz
Die benötigten Klassenkandidaten und die Anforderungen an diese ergeben sich aus der Aufgabenstellung:
- Led, an, aus
- Taster, ist gedrückt
Navigieren wir zu den Quelldiagrammen des Tasters, ergibt sich das folgende Gesamtbild:
Klassendiagramme sind die Konstruktionszeichnungen einer objektorientierten Anwendung. Kein Elektrotechniker würde sich mit der textuellen Beschreibung einer Schaltung zufrieden geben. Wehement würde er auf einen Schaltplan drängen. Fragt sich, warum sich manche Programmierer mit Nachdruck gegen die UML stemmen. Die Antwort ist unter Umständen recht trivial. Sie können die UML nicht lesen. Ein Elektroniklaie würde bei Vorlage eines Schaltplanes, diesen beiseite schieben und sich das ganze lieber in seiner Sprache erklären lassen. Unter anderem können wir Aussagen aus der obigen Darstellung entnehmen.
- Die Klasse Button ist ein PecButtonClickAndHold.
- Es gibt eine Variante des Button die low activ arbeitet.
- Alle Button besitzen unter anderem folgende Operationen
- isPressd
- waitForPress
- onClick
Damit lässt sich doch unsere Aufgabe locker lösen. Die Operation isPressed sollte genau das sein was wir suchen.
Ziehen Sie die Klassen Button und Led in den neuen Entwurf. Verbinden Sie diese mit der Klasse Controller und dem Verbindungstyp Aggregation.
Realisierung
Der Entwurf sollte jetzt folgenden Stand aufweisen.
- der Controller hat
- einen taster
- und eine roteLED
Die Initialisierung erfolgt, wie gehabt, in der Operation onStart. Laut Schaltplan des Discovery ist der Taster an Pin A0 und die rote LED an Pin D14 angeschlossen.
Controller::onStart:
roteLED.config(GPIOD,BIT14); taste.config(GPIOA,BIT0);
Die Verarbeitungslogik erfolgt in der Operation onWork im Polling.
Controller::onWork:bool ok; ok=taste.isPressed(); if (ok) roteLED.on(); else roteLED.off();
Test
Übersetzen Sie das Programm. Korrigieren Sie ggf. Schreibfehler. Übertragen Sie das lauffähige Programm in den Programmspeicher des Controllers.
- Erstellen (Kompiliern und Linken)
- Brennen
Die rote LED auf dem STM32F4 Discovery leuchtet jetzt immer solange, wie der blaue Taster gedrückt ist.
Videozusammenfassung
Erlernte und gefestigte Arbeitsschritte:
- Klassendiagramm anlegen und öffnen
- Diagrammvorlage für PEC Applikation auswählen, laden und Treiberpaket für STM32F4 einfügen
- Navigator auf UML Pakete umschalten
- gewünschte Klassen Led und Button im Navigator suchen und ins Diagramm ziehen
- Klassen aggregieren
- den nötigen Quellcode in den Operationen erstellen
- Erstellen und Brennen eine ARM Applikation im Klassendiagramm
Und hier diesen Abschnitt wiederum als Videozusammenfassung.
Übung
Erweitern Sie die Anwendung um die blaue LED. Diese soll leuchten, wenn der Taster nicht gedrückt ist und aus sein wenn er gedrückt wird.
Nächstes Thema
- Der SystemTick in C++ (login erforderlich)