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 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); } }