FSST - Hardwarenahe Programmierung
You are viewing an older revision! See the latest version
Klassendesign LM75B
Wozu UML und objektorientierte Modellierung gebraucht wird; wird in dem Buch UML @ Classroom eine Einführung mit vertonten Folien gegeben (z.B. hier für das Klassendiagramm). Die OMG ist ein internationales Konsortium, das Standards für die objektorientierte Programmierung entwickelt unter anderem auch für UML 2.5.
Die folgende Überführung aus der strukturierten Programmierung in C in ein Klassendesign der objektorientierten Programmierung in C++ wurde mit dem Programm StarUML bzw. neue Version 3.0 vorgenommen, wobei zwei Unzulänglichkeiten aufgetreten sind: void vor dem Konstruktor und der Aufruf des Konstruktors in der CPP-datei der Klasse I2C wurd nicht richtig abgebildet (LM75B::LM75B(PinName sda, PinName scl) : i2c(sda, scl)).
Die folgende Abbildung zeigt das Klassendiagramm in UML (Unified Modeling Language), wobei die I2C Klasse nur der Vollständigkeit halber hinzugefügt wurde, da sie in der MBED-Bibliothek enthalten ist:
// // Generated by StarUML(tm) C++ Add-In // // @ Project : Untitled // @ File Name : LM75B.h // @ Date : 11.03.2016 // @ Author : pe // #if !defined(_LM75B_H) #define _LM75B_H class LM75B { public: void LM75B(); void LM75B(PinName sda, PinName scl); float read(); protected: I2C i2c; }; #endif //_LM75B_H
Adaptierte Header-Datei:
#include "mbed.h" #if !defined(_LM75B_H) #define _LM75B_H // LM75B I2C Adresse #define LM75B_ADDR 0x90 // LM75B Register #define LM75B_Conf 0x01 #define LM75B_Temp 0x00 class LM75B { public: LM75B(PinName sda, PinName scl); // I2C Pins übergeben p28, p27 ~LM75B(); float read(); private: I2C i2c; }; #endif //_LM75B_H
Aus Star-UML generierte CPP-Datei der LM75B Klasse:
// // Generated by StarUML(tm) C++ Add-In // // @ Project : Untitled // @ File Name : LM75B.cpp // @ Date : 11.03.2016 // @ Author : pe // #include "LM75B.h" void LM75B::LM75B() { } void LM75B::LM75B(PinName sda, PinName scl) : i2c(sda, scl) // fehlt im aus StarUML generiertem Code { } float LM75B::read() { }
CPP-Implementierung der LM75B Klasse:
// https://developer.mbed.org/cookbook/LM75B-Temperature-Sensor #include "mbed.h" #include "LM75B.h" LM75B::LM75B(PinName sda, PinName scl) : i2c(sda, scl) // fehlt im aus StarUML generiertem Code { char cmd[2]; cmd[0] = LM75B_Conf; cmd[1] = 0x0; i2c.write( LM75B_ADDR, cmd, 2); } float LM75B::read() { char cmd[2]; cmd[0] = LM75B_Temp; i2c.write(LM75B_ADDR, cmd, 1); // Send command i2c.read(LM75B_ADDR, cmd, 2); // Read command return (float((cmd[0]<<8)|cmd[1]) / 256.0); } LM75B::~LM75B(){}
Testprogramm:
#include "mbed.h" #include "LM75B.h" Serial pc(USBTX, USBRX); LM75B sensor(p28, p27); int main () { while (1) { pc.printf("Temp = %.2f\n", sensor.read()); wait(1); } }