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
extrene_interrupts_mit_dem_mystm32_light [2019/12/19 13:13] – [Vorbereitung] huwiextrene_interrupts_mit_dem_mystm32_light [2020/06/04 16:53] huwi
Zeile 1: Zeile 1:
 ====== Externe Interrupts auswerten ====== ====== Externe Interrupts auswerten ======
-...+{{tag>LED TOGGLE INT INTERRUPT}} 
 +In der vorausgegangenen Übung haben wir einen Timer als internen Trigger genutztBei eingebetteten Systemen ist kommt externen Auslösern jedoch mindest die selbe Bedeutung zu wie die Nutzung von TimernBeispiele lassen sich endlos aufzählen, in einem Auto finden wir Schalter als Auslöser für Systemaktionen an allen Türen, der Heck- oder Kofferaumklappe, den Sicherheitsgurten, dem Beleuchtungssystem, Fensterheber, jede Menge Schalter für den Fahrer im Cockpitbereich und am Lenkrad usw. usw. All diese Schaltelemente schalten längst nicht mehr plump irgendetwas ein oder aus. Die Signale von diesen Systembausteinen werden von Mikrocontrollern verarbeitet. Das könnte man natürlich durch ständiges Abfragen (polling) der Schalter tun. Bei der großen Anzahl von auszuwertenden Signalen kann das doch schon erheblich Rechenzeit fressen die dann für andere Aufgaben nicht zur Verfügung steht. Damit kommt dem erkennen von Änderungen (steigende oder fallende Flanken) an den Signaleingängen und dem Auslösen und Verarbeiten von Hardware-Ereignissen also Interrupts große Bedeutung zu, denn ereignisorientierte Verarbeitung verbraucht signifikant weniger Rechenzeit und kann zusätzlich noch viel besser Prioritäten der Signal beachten
  
 ===== Die Aufgabe ===== ===== Die Aufgabe =====
-{{ :anwendersichttasteled.jpg?400|}}Es ist eine Mikrocontrolleranwendung zu entwickeln, bei der ...+{{ :anwendersichttasteled.jpg?400|}} Es ist eine Mikrocontrolleranwendung zu entwickeln, bei der eine Externes Signal, fallende Flanke, als Auslöser einer Aktivität des Controllers dientDie Reaktion des Controllers auf das externe Ereigniss soll durch das Umschalten einer LED realisiert werden.
  
-**Die Aufgabe lautet:**\\ //Der Anwender soll sehendass 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 Lösung soll folgende Anforderungen erfüllen:** 
 +  * Externes Signal, fallende Flanke, durch Taster an A0 
 +  * LED-Anzeige an Pin B0 
 +  * Kein ständiges Abfragen des Tasters (polling) 
 +  * Behandlung des Ereignisses direkt im Interrupt
  
  
Zeile 22: Zeile 27:
  
 ===== Lösungsansatz ===== ===== Lösungsansatz =====
-Die Aufgabe besteht darin ...+Die Aufgabe besteht darin das Betätigen der Funktionstaste per Interrupt auszuwertenAls Reaktion auf den Interrupt soll die AnzeigeLED umschaltenDie PEC-Bibliothek bietet für die Aufgabe externe Interrupts zu behandeln den Bibliotheksbaustein **PecPinInterrupt**.
  
-...+{{:uml:classpecpininterrupt.png?direct&700|}}
  
-**__MERKE:__ Systembaustein xxx**\\ +Schaut man sich diesen Baustein näher an ist Festzustellen, dass **PecPinInterrupt** alle Eigenschaften von **PecPinInput** besitzt und wie dieser zum beispiel mit **pinPullUp** und **pinLowActive** kombiniert werden kann. Diese Optionen sind für die Taster auf dem mySTM32 Board light gut geeignet da diese beim Betätigen gegen Masse schließen.  
 + 
 +{{uml:smd32pin.jpg?nolink&100|}} {{uml:klassecontroller.jpg?nolink&190|}} 
 +{{:uml:taste.jpg?nolink&70|}} {{:uml:classfunktionkey.png?nolink&200|}} 
 +{{::led.jpg?nolink&120|}} {{:uml:classindicatorled.png?nolink&190|}} 
 + 
 +Für die Anzeige-LED können wir **PecPinOutput** oder **PecLed** nutzen. Die Handhabung dieser Bausteine ist uns inzwischen vertraut. Aus diesen Betrachtungen lässt sich der folgender Grobentwurf ableiten. 
 + 
 +{{:stm32light:extigrob.png?direct&800|}} 
 + 
 +Dieses Klassenmodell lässt sich wie folgt textuell beschreiben:\\  
 +//Der Controller hat eine Funktionstaste. Die Funktionstaste ist ein PecPinInterrupt. Die Funktionstaste hat eine IndicatorLED. Die IndicatorLED ist eine PecLed.// 
 + 
 +Neu an diesem Entwurf ist, dass die Klasse **IndicatorLED** nicht in den **Controller** sondern an die Klasse **FunctionKey** aggregiert wurde. Damit wurde eine Struktur aufgebaut bei der die Klasse **FunktionKey** die Klasse **IndicatorLED** sozusagen in sich versteckt. Sonst hatten wir Systembausteine immer an den Controller gehängt. Die neue Lösung hat den Vorteil, dass beim ansprechen der LED nicht der Pfad über die Instanz des Controllers gegangen werden muss. Da die Klasse **FunctionKey** jetzt der Eigentümer der **IndicatorLED** ist kann diese ohne Einschränkungen direkt benutzt werden. Das Macht auch Sinn. Kein anderer Baustein in dieser Anwendung benutzt die **IndicatorLED**. **FunctionKey** und **IndicatorLED** bilden jetzt eine zusammengesetzte Einheit die vom **Controller** als ein Baustein benutzt wird. Zusammengesetzte Systembausteine nennt man Systemkomponente. 
 +\\  
 +\\  
 +**__MERKE:__ Systemkomponente Aggregation aus mehreren Systembausteinen**\\ 
  
  
 ===== Realisierung ===== ===== Realisierung =====
-Die Realisierung sollte die im obigen Entwurf beschriebenen Elemente beinhalten. Zusätzlich muss ...+Die Realisierung sollte die im obigen Entwurf beschriebenen Elemente beinhalten. Zusätzlich müssen folgende Modellelemente ergänzt werden. 
 +  * die konkreten Pins A0 und B0 für den Taster und die LED 
 +  * pinLowActive und piPullUp für den Taster 
 +  * virtuelle Operation //onPinInterrupt()// der Klasse //FunctionKey// überschreiben
  
 {{:stm32light:stml009.png?direct&900|}}  {{:stm32light:stml009.png?direct&900|}} 
 +
 +orientieren Sie sich bei der Realisierung der nötigen Arbeitsschritte an der obigen Darstellung. 
 +
 +{{:stm32light:extintdragdrop.png?direct&1100|}}
 +
 +Die geforderte Reaktion auf das Betätigen der Taste (Signaländerung: fallende Flanke) soll im Interrupt erfolgen also in der Operation **onPinInterrupt()**. Notieren sie dort den Code zum toggeln der LED.
  
 {{ :stm32light:stml009a.png?direct&300|}} {{ :stm32light:stml009a.png?direct&300|}}
Zeile 39: Zeile 69:
 </code> </code>
  
-..+Die Operationen **onStart()** und **onWork** der Klasse Controller bleiben leerAlles Aktionen erfolgen  im InterruptErstellen und Testen Sie diese Anwendung
- + 
-..+
 ===== 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.
Zeile 54: Zeile 82:
  
 ====== 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) 
 +  - **Komponenten aus Systembausteinen zusammensetzen** 
 +  - 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/Ugu683RCs84" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></html>
-Erweitern Sie zur Übung die Anwendung um ...+
  
 +[[https://youtu.be/dRbS54Feyl4|oder die schnelle Version ohne Sprachkommentare]]
 +====== Übung ======
 +Erweitern Sie die Anwendung um eine Zweite Taste mit einem UART-Terminal. Bei jedem Tastendruck soll ein Zähler hochgezählt werden und mit 19200 Baud an das SiSy-Controlcenter gesendet werden.  
 ====== Weiter mit: ====== ====== Weiter mit: ======
   * [[mystm32_board_light_tutorial|zurück zur Übersicht]]   * [[mystm32_board_light_tutorial|zurück zur Übersicht]]
-  * [[light all in one|alles in einem Beispiel zusammengefasst]] oder 
   * [[light LCD|ein Text-LCD am mySTM32 light anschließen]] oder   * [[light LCD|ein Text-LCD am mySTM32 light anschließen]] oder
   * [[light I2C|I2C Bausteine mit dem mySTM32 light verwenden]] oder   * [[light I2C|I2C Bausteine mit dem mySTM32 light verwenden]] oder
 +  * [[light CAN|Den CAN Bus auf dem mySTM32 light nutzen]] oder
 +  * [[light all in one|alles bisherige in einem Beispiel zusammengefasst]] oder
   * [[ein kleines Projekt mit dem mySTM32 light]] <sub>(erfordert eine SiSy Lizenz ab Version 3.7x)</sub>   * [[ein kleines Projekt mit dem mySTM32 light]] <sub>(erfordert eine SiSy Lizenz ab Version 3.7x)</sub>