FSST - Hardwarenahe Programmierung

You are viewing an older revision! See the latest version

Klassendesign LM75B

Inhalt

C++-Seite

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:

/media/uploads/fpucher/lm75b_uml.jpg

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

All wikipages