So, dann frisch ans Werk. Die erste Übung mit der wahrscheinlich ungewohnten Umgebung soll das einfache Einschalten einer LED sein.
Der Sinn und Zweck von Klassenbibliotheken ist natürlich vor allen der, dass Dinge die öfters gebraucht werden oder typische Problemstellungen die einfach schon mal gelöst wurden, dem Anwender komfortabel zur Wiederverwendung zur Verfügung stehen.
Das werden wir nutzen.
Die Objektorientierung zeichnet sich durch zunehmende Abstraktion von der tatsächlichen inneren Struktur und dem internen Verhalten der Maschine, hin zu einer anwenderbezogenen Sichtweise aus.
Die Aufgabe lautet:
Der Anwender soll sehen, dass der Mikrocontroller funktioniert. Entwickeln Sie dafür eine Lösung die den Status des Mikrocontrollers durch blinken einer LED anzeigt. Diese StausLED soll an Port B0 angeschlossen werden.
Falls Sie jetzt noch das vorherige 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, öffnen sie das SiSy UML-Projekt wieder.
Die Aufgabe besteht darin eine LED anzusteuern um den Status des Controllers anzuzeigen. Folgen wir dem sogenannten objektorientierten Konzepten, ist diese StatusLED ein Baustein unseres Systems. Systembausteine bilden wir in der UML als Klassen ab. In unserem Klassendiagramm sehen wir schon einen solchen Systembaustein. Den Controller.
Jetzt brauchen wir noch eine Klasse für die StausLED.
Diese beiden Bausteine stehen in Beziehung zu einander. Als Anfänger benutzen sie bitte nur zwei Beziehungstypen zwischen Bausteinen. Das ist die „ist ein“-Beziehung und die „hat“-Beziehung. Zwischen Controller und LED macht die „ist ein“-Beziehung wenig Sinn da passt die „hat“-Beziehung besser. Eine „hat“-Beziehung können wir mit der „Aggregation“ in der UML gut abbilden. Die Aggregation wird in der UML als Pfeil mit einer Raute (diamond shape) am Anfang dargestellt. Der Codegenerator macht daraus ein Klassenattribut. Der Name und die Sichtbarkeit des Attributes ist am Pfeil zu sehen. Der Klassenname sollte immer mit einem Großbuchstaben beginnen. Attribute und Operationen schreiben wir am Anfang immer klein.
Des weiteren möchten wir nicht so viel selber programmieren, sondern den Komfort der verfügbaren PEC-Bibliothek nutzen. Ein für diese Aufgabe passender PEC-Baustein ist PecPinOutput. Wenn wir uns den den Bibliotheksbaustein PecPinOutput anschauen werden wir feststellen, dass er genau das macht was wir benötigen um eine LED an- oder auch auszuschalten.
Die Beziehung zwischen StatusLED und PecPinOutput lässt sich als „ist ein“-Beziehung abbilden.
Dazu nutzen wir in diesem Fall die UML-Realisierung.
Diese Darstellung lässt sich zur Verifikation sehr schön wie folgt lesen:
Der Controller hat eine StatusLED. Die StatusLED ist ein PecPinOutput.
Das ist schon ein recht brauchbarer Grobentwurf. Es fehlt noch die Zuordnung zum konkreten Pin am Controller und die eigentliche Logik zum Einschalten der StatusLED. Das überlassen wir der Realisierung.
MERKE: Systembaustein = Klasse
MERKE: „hat“-Beziehung = Aggregation oder Komposition
MERKE: „ist ein“-Beziehung = Realisierung oder Vererbung
MERKE: Klassennamen = immer ein Großbuchstabe am Anfang
MERKE: Attribute und Operationen = beginnen immer mit einem kleinen Buchstaben
Die Realisierung sollte die im obigen Entwurf beschriebenen Elemente beinhalten. Zusätzlich muss das Pin B0 an die Realisierung der StatusLED gebunden werden. Sie finden den entsprechenden PEC-Baustein über den Explorer. Nutzen Sie gern auch das kleine Fragezeichen an PecPinOutput. Orientieren Sie sich an der folgenden Darstellung bei der Realisierung ihres Entwurfes:
Beim ersten mal gehen wir das hier Schritt für Schritt durch.
Zuerst ziehen Sie eine Klasse aus der Objektbibliothek in das Diagramm und geben dieser den Namen StatusLED.
Danach verbinden Sie die Klasse Controller mit der Klasse StatusLED und wählen als Verbindungstyp eine Aggregation aus.
Suchen Sie im Explorer nach dem PEC-Bibliotheksbaustein PecPinOutput. Ziehen Sie dieses Element in das Diagramm.
Verbinden Sie den Bibliotheksbaustein PecPinOutput mit der Klasse StatusLED. Wählen sie als Verbindungstyp die Realisierung.
Suchen Sie über den Explorer den Bibliotheksbaustein pinB0. Ziehen Sie diesen Baustein in das Diagramm. Sie können auch die kleine Fragezeichenschaltfläche nutzen um eine Liste der möglichen Bausteine zu erhalten.
Verbinden Sie den Baustein pinB0 mit der Klasse StatusLED. Wählen Sie als Verbindungstyp die Realisierung.
Sie sollten mit diesen Schritten einen Entwurf entsprechend der folgenden Darstellung erhalten. Ordnen Sie die Elemente übersichtlich an. Klassendiagramme sind sehr nützliche Dokumentationsmittel. Vergleichen Sie ihren Entwurf mit der folgenden Darstellung.
Diese Softwarekonstruktionszeichnung lässt sich wie folgt „lesen“:
Die eigentliche Verhaltenslogik für das Blinken der LED notieren wir als C + + Code in der Operation onWork() der Klasse Controller. Um die LED blinken zu lassen schalten wir die LED zyklisch um (togglen). Damit das Auge dieses toggeln auch wahrnimmt bauen wir eine kleine Pause ein. Die Möglichkeiten die der Bibliotheksbaustein PecPinOutput bietet sehen Sie rechst angezeigt. Notieren Sie den folgenden Code in der Operation onWork:
Controller::onWork():void// continuous event from the Mainloop statusLED.toggle(); waitMs(200);
Vergleichen sie diesen Code mit der folgenden alternativen Lösung:
Controller::onWork():void// continuous event from the Mainloop statusLED.on(); waitMs(50); statusLED.off(); waitMs(200);
Übersetzen Sie das Programm. Korrigieren Sie ggf. Schreibfehler. Übertragen Sie das lauffähige Programm in den Programmspeicher des Controllers.
Erlernte und gefestigte Arbeitsschritte:
Und weil es so schön war hier das Ganze noch mal als Video.
Erweitern Sie zur Übung die Anwendung um eine weitere ErrorLED an Pin B1. Orientieren sie sich an den obigen Arbeitsschritten. Lassen Sie die ErrorLED im Gegentakt zur StatusLED blinken.