Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
Letzte ÜberarbeitungBeide Seiten der Revision
einen_timer_mit_dem_mystm32_light_benutzen [2019/12/19 10:56] huwieinen_timer_mit_dem_mystm32_light_benutzen [2020/07/07 14:11] – [Übung] huwi
Zeile 1: Zeile 1:
 ====== Einen eigenen Timer programmieren ====== ====== Einen eigenen Timer programmieren ======
-... +{{tag>UART USART TIMER INT INTERRUPT}} 
 +Wenn man die Aufgabe eines Mikrocontrollers auf innerste Wesen, auf des Pudels Kern, zu reduzieren versucht merkt man das es faktisch immer um ein bestimmtes Verhalten in einer bestimmten Zeit gehtIm Fach-Slang Timing genanntTiming und Timer sind für Embedded-Entwickler untrennbar verbunden. Die Anzahl und Möglichkeiten der Timer eines Mikrocontrollers stellen ein wesentliches Leistungsmerkmal dar. Mit den SysTick-Experimenten und dem Erzeugen eines PWM-Signals haben wir eigentlich schon Timer angewendet. In diesem Beispiel wollen wir einen Timer nutzen um ein eigenes Timing per Timer-Interrupt zu generieren. Der Timer soll das Hochzählen eines 8-Bit-Zählers und das senden des Zählers an das SiSy-ControlCenter triggern
 ===== Die Aufgabe ===== ===== Die Aufgabe =====
-{{ :anwendersichttasteled.jpg?400|}}Es ist eine Mikrocontrolleranwendung zu entwickeln, bei der ... +{{ :stm32light:uctimer.jpg?500|}}Es ist eine Mikrocontrolleranwendung zu entwickeln, bei der ein Timer als Trigger für einen Zähler fungiert und der Zählerwert an den PC übertragen wird.
- +
-**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.//+
  
 +**Die Anforderungen an die Lösung sind:**\\ 
 +  * Der Timer-Interrupt soll alle 50 Millisekunden ausgelöst werden
 +  * Der Zähler soll eine vorzeichnlose 8-Bit Zahl sein
 +  * Die Datenübertragung soll mit 19200 Baud erfolgen
 +  * Die übertragenen Werte sollen pure Binärdaten sein
  
 ===== Vorbereitung ===== ===== Vorbereitung =====
-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. Legen Sie ein neues Klassendiagramm an und wählen Sie die Sprache //ARM C++//. Beachten Sie die Einstellungen für die Zielplattform //STM32F042 mySTM32 Board light HAL//. 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 //STM32F0// zu. Zusätzlich können Sie den Bibliotheksbaustein //stm32F042_48Mhz// aus dem Explorer nutzen um den Controller mit voller 48MHz Leistung zu betreiben.+Führen Sie folgende Vorbereitungsarbeiten durch: 
 +  * neues Klassendiagramm anlegen 
 +  * Zielsprache //ARM C++//  
 +  * Zielplattform //STM32F042 mySTM32 Board light HAL// 
 +  * Diagrammvorlage //Application Grundgerüst für PEC Anwendungen (XMC, STM32, AVR)// laden 
 +  * Treiberpaket für //STM32F0// zuweisen 
 +  * optional Template //stm32F042_48Mhz// zuweisem 
  
 {{:neueskldhallo.jpg?direct&290|}}{{:pecapplication.jpg?direct&250|}}{{:stm32light:stml001.png?direct&450|}}  {{:neueskldhallo.jpg?direct&290|}}{{:pecapplication.jpg?direct&250|}}{{:stm32light:stml001.png?direct&450|}} 
Zeile 15: Zeile 25:
  
 ===== Lösungsansatz ===== ===== Lösungsansatz =====
-Die Aufgabe besteht darin ...+Die Aufgabe besteht darin einen eigenen Timer für das Auslösen (Triggern) einer Aktion des Controllers zu bauenDie auszulösende Aktion wird durch das hochzählen eines Wertes und das Senden des Wertes per UART an den PC repräsentiertDas Auslösen dieser Aktion soll regelmäßig in 50 Millisekunden Abständen erfolgenDiesmal haben wir die Besonderheit, dass ein Systembaustein nicht als sichtbares Element auf dem Systemboard präsent ist sondern interner Baustein des Controllers ist. Damit ergeben sich für unser System folgende Systembausteine: 
  
-...+{{:uml:classtrigger.png?direct&150|}}{{:uml:klassecontroller.jpg?nolink&150|}} {{:uml:smd32pin.jpg?nolink&150|}}{{::laptopuart.png?nolink&200|}} {{:uml:classterminal.png?nolink&150|}}
  
-**__MERKE:__ Systembaustein = xxx**\\ +In der PEC-Bibliothek finden wir die Basisbaustein **PecTimer**. Er bietet neben einer virtuellen Operation  **onTimer()** für die Behandlung des Timer-Interrupts (Eventhandler) auch verschiedene Alternativen für die Initialisierung des Timers //configHz(), configMs(), configUs()//. Damit wird dem entwickler die übliche Timer-Rechnerei mit Vorteilern Zählerwerten usw. so ziemlich abgenommen.
  
 +{{:stm32light:pectimer.png?direct&400|}}
  
-===== Realisierung ===== +Aus dem bisher dargelegtem ergibt sich folgender Grobentwurf der Anwendungslösung.
-Die Realisierung sollte die im obigen Entwurf beschriebenen Elemente beinhalten. Zusätzlich muss ...+
  
 +{{:stm32light:groetimer.png?direct&1100|}}
  
 +Dieser Grobentwurf lässt sich wie folgt lesen:\\ //Die Klasse Controller hat einen Trigger und ein Terminal. Der Trigger ist ein PecTimer. Das Terminal ist eine PecUart mit baudrate19200.//
 +\\ 
 +\\ 
 +**__MERKE:__ interner Systembaustein = Systembaustein**\\ 
 +
 +
 +===== Realisierung =====
 +Die Realisierung sollte die im obigen Entwurf beschriebenen Elemente beinhalten. Zusätzlich müssen folgende Modellelemente ergänzt werden:
 +  * der konkrete Timer zum Beispiel Timer2
 +  * die genutzte UART Uart 1 an Port A9
 +  * ein 8 Bit Zähler als Attribut der Klasse Trigger
 +  * das Überschreiben der Operation **onTimer** der Klasse Trigger
 +
 +Orientieren Sie sich bei diesen Arbeitsschritten an dem folgenden Klassendiagramm.
  
 {{:stm32light:stml008.png?direct&900|}}  {{:stm32light:stml008.png?direct&900|}} 
 +
 +{{:stm32light:timerdrop.png?direct&1100|}}
 +
 +Die Initialisierung des Timers auf die geforderten 50 Millisekunden erfolgt in der Startsequenz des Controllers. Notieren sie folgenden Code in der Operation **onStart()** der Klasse **Controller**.
  
 {{ :stm32light:stml008a.png?direct&300|}} {{ :stm32light:stml008a.png?direct&300|}}
Zeile 35: Zeile 64:
 </code> </code>
  
-...+Die auszulösende Aktion Wert hochzählen und an das PC-Terminal senden notieren wir in der Operation **onTimer()** der Klasse **Trigger** wie folgt:
  
 {{ :stm32light:stml008b.png?direct&300|}} {{ :stm32light:stml008b.png?direct&300|}}
Zeile 43: Zeile 72:
 </code> </code>
  
-... +Jetzt kann diese Anwendungslösung getestet werdenVariieren Sie die Initialisierung  des Timers zum Beispiel auf 5 Millisekunden und überprüfen das Ergebnis im SiSy-Controlcenter.
- +
-...+
  
 ===== Test ===== ===== Test =====
 Übersetzen Sie das Programm. Korrigieren Sie ggf. Schreibfehler. Übertragen Sie das lauffähige Programm in den Programmspeicher des Controllers. Übersetzen Sie das Programm. Korrigieren Sie ggf. Schreibfehler. Übertragen Sie das lauffähige Programm in den Programmspeicher des Controllers.
-  - Erstellen (Kompilieren und Linken) +  - Systemboard mit dem PC verbinden  
-  - Brennen +  - Anwendungslösung Erstellen (Kompilieren und Linken) 
-  - verbinden Sie ...+  - Anwendungslösung Übertragen (Brennen) 
 +  - SiSy-Controlcenter öffnen und konfigurieren (COMx, 19200 Baud) 
 +  - Verbinden und in Oszi-Ansicht wechseln
  
 {{:erstellenbrennen.png?direct&350|}}{{:stm32light:flashlight.png?direct&300|}}{{:stm32light:stm32bl4.png?direct&300|}} {{:erstellenbrennen.png?direct&350|}}{{:stm32light:flashlight.png?direct&300|}}{{:stm32light:stm32bl4.png?direct&300|}}
  
 +{{:stm32light:terminaloszi.png?direct&600|}}
 ====== Videozusammenfassung ====== ====== Videozusammenfassung ======
 +{{tag>Video}}
 Erlernte und gefestigte Arbeitsschritte: Erlernte und gefestigte Arbeitsschritte:
-  - ...+  - //Klassendiagramm// anlegen und öffnen 
 +  - Diagrammvorlage für //PEC Applikation// auswählen, laden und Treiberpaket für STM32F0 einfügen 
 +  - im Explorer //PEC-Bausteine// aus der Bibliothek suchen 
 +  - gewünschte Bibliotheksbausteine und ins Diagramm ziehen 
 +  - Klassen verbinden (Aggregation, Realisierung) 
 +  - den nötigen //Quellcode// in den Operationen erstellen 
 +  - //Erstellen und Brennen// einer STM32 Applikation im Klassendiagramm 
 +  
 +Und weil es so schön war hier das Ganze noch mal als Video.
  
-====== Übung ====== +<html><iframe width="1028" height="580" src="https://www.youtube.com/embed/VMNekisEzYc" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></html> 
-Erweitern Sie zur Übung die Anwendung um ...+ 
 +[[https://youtu.be/dj0khQb40uo|oder die schnelle Version ohne Sprachkommentare]] 
 +====== Übung ====== 
 +Erweitern Sie zur Übung die Anwendung um eine LED die bei jedem Trigger-Event umschaltet (toggle) 
  
 ====== Weiter mit: ====== ====== Weiter mit: ======
   * [[mystm32_board_light_tutorial|zurück zur Übersicht]]   * [[mystm32_board_light_tutorial|zurück zur Übersicht]]
   * [[extrene Interrupts mit dem mySTM32 light]]   * [[extrene Interrupts mit dem mySTM32 light]]
 +
 +====== Suchbegriffe ======
 +