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
Nächste ÜberarbeitungBeide Seiten der Revision
light_i2c [2020/01/14 10:59] – [Realisierung] huwilight_i2c [2020/06/19 10:06] huwi
Zeile 1: Zeile 1:
-====== Einen I2C Feldbus verwenden ====== +====== Einen I²C Feldbus verwenden ====== 
-...+{{tag>UART USART I2C TWI LM75 TEMPERATUR SENSOR BUS}} 
 +Für diese Übung benötigen Sie ein [[http://shop.myavr.de/Add-Ons%20und%20Zubeh%C3%B6r/myTWI%20Add-On%20Temperatursensor.htm?sp=article.sp.php&artID=71|Temperatursensor Add-On]] als Erweiterung an Ihrem mySTM32 Board light.\\ Feldbussysteme spielen bei vielen Mikrocontrolleranwendungen eine wichtige Rolle. Zum einen ermöglichen solche digitalen Kommunikationskanäle intelligente Sensoren und Aktoren zu verwenden und es erlaubt dem Entwickler, Controller mit verhältnismäßig geringer Pinanzahl zu benutzen und damit den Footprint klein zu halten. Der [[https://de.wikipedia.org/wiki/I%C2%B2C|I²C Bus]] ermöglicht hohe Datenübertragungsraten und selbst in Standardmodus bereits über 100 Geräte in einem Bus zu adressieren. Dabei benötigt der I²C Bus nur zwei Leitungen also zwei Pins am Controller. Es gibt es [[https://www.mouser.de/Search/Refine?Keyword=I2C&OrgTerm=I%c2%b2C|tausende I²C Devices]] die ein breites Anwendungsspektrum abdecken. Faktisch jede moderne Mikrocontrollerfamilie unterstützt diesen Standard. I²C wurde ursprünglich von Philips für die Kommunikation innerhalb eines Gerätes zum Beispiel innerhalb eines Fernsehers entwickelt. Damit lässt sich schon daraus schließen, dass dieses Bussystem nicht für weite Übertragungswege gedacht ist sondern für einige Zentimeter bis wenige Meter konzipiert wurde. In einem der folgenden Kapitel lernen Sie ein weiteres Feldbussystem kennen, den CAN-Bus, dieser kann mindestens 40 und unter bestimmten Voraussetzungen bis 500 Meter Daten zuverlässig übertragen. Auch diesen Feldbus finden Sie auf dem kleinen mySTM32 Board light.   
  
 ===== Die Aufgabe ===== ===== Die Aufgabe =====
-...+{{ :stm32light:uci2c.jpg?direct&450|}}Entwickeln Sie eine Mikrocontrolleranwendung bei der ein I²C Temperatursensor ausgelesen und die aktuelle Temperatur per UART an den PC gesendet wird
  
-**Anforderungen:** +**Anforderungen an die Lösung:** 
-//...//+  * Temperatursensor [[http://sisy.name/mymcu_download/produkte/mytwi/db_nxp-temperatursensor-lm75_en.pdf|LM75]], Adressekonfiguration 0x90 
 +  * Datenübertragung 8 Bit, 19200 Baud 
 +  * Temperaturwerte in vollen Grad Celsius
  
 ===== Vorbereitung ===== ===== Vorbereitung =====
Zeile 20: Zeile 24:
  
 ===== Lösungsansatz ===== ===== Lösungsansatz =====
-...+Die Aufgabe besteht darin einen digitalen Temperatursensor über einen I²C Bus auszulesen und die Daten per UART an ein PC Terminal zusendenDaraus lassen sich die fachlich motivierten Systembausteine für den Entwurf der Systemarchitektur ableiten.
  
-[[http://shop.myavr.de/index.php?sp=article.sp.php&artID=71|AddOn Temperatursensor LM75]]+{{:stm32light:lm75.png?nolink&100|}} {{:stm32light:i2c.jpg?nolink&150|}} {{:uml:smd32pin.jpg?nolink&150|}} {{::laptopuart.png?nolink&200|}}\\  
 +{{:stm32light:classtempsensor.png?nolink&170|}} {{:stm32light:classsensorbus.png?nolink&150|}} {{:uml:klassecontroller.jpg?nolink&150|}} {{:uml:classterminal.png?nolink&150|}}
  
-...+Für den [[http://shop.myavr.de/index.php?sp=article.sp.php&artID=71|Temperatursensor LM75]] gibt es neben anderen I²C Geräten einen entsprechenden Bibliotheksbaustein. Der folgende Ausschnitt aus dem Klassenmodell der PEC-Bibliothek zeigt den Zusammenhang zwischen dem Baustein **PecLm75** und der entsprechenden I²C Buskomponente **PecI2cBus**.
  
-**__MERKE:__ ... ... **+{{:stm32light:peclm75.png?nolink&800|}} 
 + 
 +Für die Anwendung dieser Bausteine sind zwei Operationen für uns wichtig. Zum einen soll die Temperatur in ganzen Grad ausgelesen werden. Dafür dient die Operation **getTemp()**. Diese wandelt die Temperaturdaten vom Sensor bereits in ganze Grad umDer Sensor selbst liefert die Temperatur in 0,125°C  
 +(8tel Grad) SchrittenDesweiteren können moderne Mikrocontroller mehrere I²C Bus-Schnittstellen besitzenEs ist daher notwendig das Gerät mit seiner Adresse dem konkreten Bus zuzuweisenDas erfolgt über die Operation **connect(...)**. Es gibt für diese Operation zwei Alternativen. Die Operation **connect(...)** im Device oder im Bus.  
 + 
 +Aus dem bisherigen Erkenntnissen lässt sich folgender Grobentwurf für die geforderte Mikrocontrollerlösung ableiten: 
 + 
 +{{:stm32light:grobi2cdesign.png?nolink&1000|}} 
 + 
 +In einfacher natürlicher Sprache lässt sich dieser Entwurf wie folgt lesen: 
 +  * der **Controller** ist ein **stm32F042_48MHz** 
 +  * der **Controller** hat einen **SensorBus** 
 +  * der **SensorBus** ist eine **PecI2CBus** 
 +  * der **Controller** hat ein **Terminal** 
 +  * das **Terminal** ist eine **PecUart** 
 + 
 +Die Zuweisung der konkreten Ressourcen muss in der Realisierung erfolgen. 
 + 
 +**__MERKE:__ BUS = DEVICE mit ADRESSE zuweisen **
  
 ===== Realisierung ===== ===== Realisierung =====
-...+Die Realisierung sollte die im obigen Entwurf beschriebenen Elemente beinhaltenZusätzlich müssen wir noch die konkret verwendeten Ressourcen unseres Controllers zuweisenVervollständigen Sie ihr Klassenmodell soweit, dass es mit der folgenden Darstellung übereinstimmt. Ordnen sie die Elemente übersichtlich an.
  
 {{:stm32light:i2cexample.png?direct&1100|}} {{:stm32light:i2cexample.png?direct&1100|}}
  
-...+Zuerst muss die Verbindung zum Bus hergestellt und die Geräteadresse zugewiesen werdenIn einem Bus können bis zu acht LM75 Adressiert werdenDafür gibt es auf dem Add-On Jumper zum Konfigurieren der GeräteadresseAchten Sie darauf, dass auf dem Add-On die Adress-Jumper wie folgt stehen (alle auf 0 = 0x90):
  
->Controller::onWork():void<code c> +{{:stm32light:addonlm75vonoben.png?nolink&400|}}
-// continuous event from the Mainloop +
-// WENN ... DANN +
-//      ... +
-// SONST +
-//      ... +
-</code>+
  
-{{ :stm32light:stml012a.png?direct&200|}}+Notieren Sie in der Operation **onStart()** der Klasse **Controller** folgenden Code: 
 + 
 +{{ :stm32light:stml012a.png?direct&250|}}
 >Controller::onStart():void<code c> >Controller::onStart():void<code c>
 sensorBus.connect(sensorBus.temperaturSensor,0x90); sensorBus.connect(sensorBus.temperaturSensor,0x90);
 </code> </code>
 +
 +Das Auslesen der aktuellen Temperatur der Digitalsensors erfolgt auf [[https://de.wikipedia.org/wiki/Programmierschnittstelle|API-Ebene]] ähnlich der Vorgehensweise beim Analogsensor. Beachten Sie, dass der Temperatursensor verhältnismäßig träge ist. Nutzen Sie eine kleine Warteroutine damit die Änderung der Daten auf dem Terminal gut zu verfolgen sind.\\ 
 +Notieren Sie in der Operation **onWork()** der Klasse **Controller** folgenden Code:
  
 {{ :stm32light:stml012.png?direct&300|}} {{ :stm32light:stml012.png?direct&300|}}
Zeile 55: Zeile 77:
 </code> </code>
  
-...+Jetzt können Sie die Anwendung erstellen und Testen.
  
 ===== Test ===== ===== Test =====
-Übersetzen Sie das Programm. Korrigieren Sie ggf. Schreibfehler. Übertragen Sie das lauffähige Programm in den Programmspeicher des Controllers.+{{ :stm32light:boardmitlm75.png?nolink&380|}}Übersetzen Sie das Programm. Korrigieren Sie ggf. Schreibfehler. Übertragen Sie das lauffähige Programm in den Programmspeicher des Controllers.
   - Erstellen (Kompilieren und Linken)   - Erstellen (Kompilieren und Linken)
   - Brennen   - Brennen
-  - verbinden Sie ...+  - verbinden Sie das //Temperatursensor Add-On// mit dem mySTM32 Board light 
 +  - Achten Sie auf die richtige Position der Adress-Jumper 
 +  - Aktivieren Sie mit den entsprechenden Jumpern die Pull-Up-Widerstände  
 +  - Beachten Sie die Einstellungen im SiSy-ControlCenter 
 + 
 +{{:erstellenbrennen.png?350|}}{{:stm32light:flashlight.png?direct&300|}} 
 +===== Variante ===== 
 +Ändern Sie die Anwendung so, dass die rohen Sensordaten (raw value) an den PC gesendet werden. Um die Lesbarkeit zu erhöhen wandeln sie die 10 Bit Rohdaten in Text um. Ändern sie den Code der Operation **onWork()** der Klasse Controller wie folgt: 
 + 
 +{{ :stm32light:seqlmv2.png?nolink&400|}} 
 +>Controller::onWork():void<code c> 
 +uint16_t temp; 
 +temp=sensorBus.temperaturSensor.getRawValue(); 
 +String txt; 
 +txt.format("\nRawValue=%d",temp); 
 +terminal.writeString(txt); 
 +waitMs(100); 
 +</code> 
 + 
 +Bilden, übertragen und testen Sie die Anwendung. Vergleichen Sie die Ergebnisse beider Varianten miteinander.
  
-{{:erstellenbrennen.png?350|}}{{:stm32light:flashlight.png?direct&300|}}{{:stm32light:stm32bl2.png?direct&300|}} 
  
 ====== Videozusammenfassung ====== ====== Videozusammenfassung ======
 +{{tag>Video}}
 Erlernte und gefestigte Arbeitsschritte: Erlernte und gefestigte Arbeitsschritte:
-  - ... +  - Klassendiagramm anlegen und öffnen 
- +  - Diagrammvorlage für PEC Applikation auswählen 
 +  - laden des richtigen Treiber-Pakets  
 +  - gewünschte Bausteine im Explorer suchen und ins Diagramm ziehen 
 +  - Klassen aggregieren, Komponenten bilden 
 +  - den nötigen Quellcode in den Operationen erstellen 
 +  - Erstellen und Brennen eine ARM Applikation im Klassendiagramm 
 Und weil es so schön war hier das Ganze noch mal als Video. Und weil es so schön war hier das Ganze noch mal als Video.
  
-<<<< ACHTUNG VERALTETES VIDEO >>>> +<html><iframe width="1024" height="580" src="https://www.youtube.com/embed/9VQa4HB7rxI" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></html>
- +
-><html><iframe width="640" height="440" src="https://www.youtube.com/embed/GNvT2T8sD6I" frameborder="0" allowfullscreen></iframe></html>+
  
 +[[https://youtu.be/qsJl6r3k29g|oder die schnelle Version mit Musik]]
 ====== Übung ====== ====== Übung ======
-... +Nutzen Sie das Text-LCD um die Sensordaten anzuzeigen!
 ====== Weiter mit: ====== ====== Weiter mit: ======
-  * [[light LCD|ein Text-LCD am mySTM32 light anschließen]] +  * [[light CAN|den CAN Bus auf dem mySTM32 light nutzen]]
   * [[mystm32_board_light_tutorial|zurück zur Übersicht]]   * [[mystm32_board_light_tutorial|zurück zur Übersicht]]
 +
 +====== Suchbegriffe ======