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