Inhaltsverzeichnis

Benutzerdefinierte Timer mit der UML

Für das einfache Timing haben wir zunächst den Timer SysTick verwendet. Aus diesem wurden uns die Ereignisse für 10 Millisekunden, 100 Millisekunden und 1 Sekunde ausgekoppelt. Der in diesem Tutorial verwendete XMC4500 verfügt jedoch über sage und schreibe 25 Timer (SysTick + 2xCCU8 mit je 4 Timern + 4xCCU4 mit je 4 Timern). Es ist also durchaus sinnvoll einzelnen Aufgaben eigene, benutzerdefinierte Timer zuzuordnen.

Die Aufgabe

Es ist eine XMC Anwendung zu entwickeln, bei der zwei LEDs mit je einem eigenen Timer in unterschiedlicher Frequenz blinken.

Vorbereitung

Falls 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, öffnen sie das SiSy UML-Projekt wieder. Legen Sie ein neues Klassendiagramm an und wählen Sie die Sprache ARM C++. Beachten Sie die Einstellungen für die Zielplattform XMC4500 Relax Kit. Beim Öffnen des Diagramms (rechte Maustaste, nach unten) laden Sie die Diagrammvorlage für eine PEC Applikation und fürgen das Treiberpaket für XMC4500 ein.

Grundlagen

Wir erinnern uns an den Abschnitt zum Dimmen einer LED mit PWM.

Wir können, unabhängig von den unveränderlichen SysTick-Ereignissen (10, 100, 1000 Millisekunden), über folgende frei programmierbare Timer verfügen:

Für die Modellierung der verwendeten Timer-Ressourcen verwenden wir in der UML geeignete Basisklassen bzw. Templates. Diese finden wir zum einen in den plattformunabhängigen pec-Paketen, aber auch in den plattformspezifischen Paketen des verwendeten Controllers XMC4500.

Das Template PecTimer repräsentiert einen abstrakten Timer. Es stellt ein portables Interface dar, welches in einer konkreten Anwendung realisiert werden kann. Die Templates aus dem controllerspezifischen XMC4500 Paket weisen der konkreten Realisierung die tatsächlichen Ressourcen des verwendeten Controllers zu. Die UML-Namen der konkreten XMC-Timer-Templates setzen sich zusammen aus der verwendeten CCU und dem zugeordneten Channel sowie dem verwendeten Controller.

Entwurf erste Iteration

Der blinkenden LED geben wir den Namen Blinky. Diese soll die Eigenschaften eines Ausgangs-Pins und eines Timers erhalten (PecTimer und PecPinOutput). Als Ressourcen weisen wir unserem ersten Blinky Pin1.0 und den CcuChannel0 der CCU40 zu.

Realisierung

Die Klasse Blinky vereinigt die Merkmale eins Timers und eines Ausgabe-Pins. Die konkreten Ressourcen zur Realisierung wurden ebenfalls als Templates angebunden. Mit der Operation onTimer wurde der Servishandler für den Timer-Interrupt realisiert. Die mittels der Templates zugewiesenen Realisierungsparameter kann man sich über den Definieren-Dialog ansehen.

Der Timer muss jetzt noch konfiguriert werden. Dafür empfiehlt sich die Operation onStart der Klasse Controller. Das Timer-Interface bietet verschiedene Operationen für die Konfiguration des Timers an. Im Folgenden wurde die Operation configHz benutzt.

Controller::onStart

blinky.configHz(5);

Im Ereignishandler onTimer kann jetzt das gewünschte Umschalten der LED codiert werden.

Blinky::onTimer

toggle();

Test

Übersetzen und übertragen Sie das Programm. Testen Sie die Anwendung.

Videozusammenfassung

Und hier diesen Abschnitt wiederum als Text- und Videozusammenfassung.

Übung

Erweitern Sie die Anwednung um die Klasse Blinky2. Ordnen Sie dieser einen eigenen Timer und die LED an Pin1.1 zu. Konfigurieren Sie den Timer auf 3 Hz. Lassen Sie die LED blinken.

Nächste Themen