Commit Iniziale, progetto funzionante caricato su box ETcontroller in
cantina
This commit is contained in:
62
DS18B20/DS18B20Sensor.cpp
Normal file
62
DS18B20/DS18B20Sensor.cpp
Normal file
@@ -0,0 +1,62 @@
|
||||
/**
|
||||
* @file DS18B20Sensor.cpp
|
||||
* @brief Wrapper for the OneWireDrv library by Frederic Blanc.
|
||||
* @author Steve Spence (Published 3 March 2013 www.mbed.org)
|
||||
*/
|
||||
#include "DS18B20Sensor.h"
|
||||
|
||||
DS18B20Sensor::DS18B20Sensor(PinName pin) : _oneWirePort(pin)
|
||||
{
|
||||
_init = false;
|
||||
nSensors = 0;
|
||||
}
|
||||
|
||||
void DS18B20Sensor::getReading(char * text, uint8_t index)
|
||||
{
|
||||
uint8_t subzero, cel, cel_frac_bits;
|
||||
DS18X20_read_meas( &gSensorIDs[index][0], &subzero, &cel, &cel_frac_bits);
|
||||
DS18B20Sensor::getReading(text, subzero, cel, cel_frac_bits);
|
||||
}
|
||||
|
||||
void DS18B20Sensor::getReading(char * text, uint8_t subzero, uint8_t cel, uint8_t cel_frac_bits)
|
||||
{
|
||||
uint16_t decicelsius;
|
||||
char s[10];
|
||||
float temperature;
|
||||
sprintf(text,"");
|
||||
sprintf(s,"%s", (subzero)?"-":"+");
|
||||
strcat(text,s);
|
||||
decicelsius = DS18X20_temp_to_decicel(subzero, cel, cel_frac_bits);
|
||||
temperature = decicelsius;
|
||||
temperature = temperature/10;
|
||||
sprintf(s,"%4.1f", temperature);
|
||||
strcat(text,s);
|
||||
|
||||
}
|
||||
|
||||
uint8_t DS18B20Sensor::search(void)
|
||||
{
|
||||
search_sensors(&nSensors, &gSensorIDs[0][0]);
|
||||
_init = true;
|
||||
return nSensors;
|
||||
}
|
||||
|
||||
uint8_t DS18B20Sensor::count(void)
|
||||
{
|
||||
if (_init==false)
|
||||
DS18B20Sensor::search();
|
||||
return nSensors;
|
||||
}
|
||||
|
||||
uint8_t DS18B20Sensor::startReading(bool includeWait)
|
||||
{
|
||||
uint8_t r = DS18X20_start_meas(DS18X20_POWER_EXTERN, 0 );
|
||||
if ((r == DS18X20_OK) && includeWait)
|
||||
wait_ms(DS18B20_TCONV_12BIT);
|
||||
return r;
|
||||
}
|
||||
|
||||
void DS18B20Sensor::getReading(uint8_t index, uint8_t *subzero, uint8_t *cel, uint8_t *cel_frac_bits)
|
||||
{
|
||||
DS18X20_read_meas( &gSensorIDs[index][0], subzero, cel, cel_frac_bits);
|
||||
}
|
||||
100
DS18B20/DS18B20Sensor.h
Normal file
100
DS18B20/DS18B20Sensor.h
Normal file
@@ -0,0 +1,100 @@
|
||||
#ifndef _SENSOR_H
|
||||
#define _SENSOR_H
|
||||
|
||||
|
||||
#include "onewire.h"
|
||||
#include "DS18X20.h"
|
||||
#include "mbed.h"
|
||||
|
||||
/** DS18B20Sensor class.
|
||||
* A wrapper class for the DS18B20 (temperature sensor) and onewire 'c' library.
|
||||
* Based on the OneWireDrv Library by Frederic Blanc. Many thanks to him for making this code available.
|
||||
*
|
||||
* Simple Example:
|
||||
* @code
|
||||
#include "mbed.h"
|
||||
#include "DS18B20Sensor.h"
|
||||
|
||||
// Instantiate sensor with hardware in pin p30
|
||||
DS18B20Sensor sensor(p30);
|
||||
|
||||
// Setup a window to the world
|
||||
Serial pc(p13, p14);
|
||||
//Serial pc(USBTX, USBRX);
|
||||
|
||||
int main()
|
||||
{
|
||||
char sensorBuf[25];
|
||||
|
||||
// count will search for sensors, if not already called
|
||||
pc.printf("Found %d sensor/s\r", sensor.count());
|
||||
|
||||
uint8_t result = sensor.startReading(true); // start sensor readings and wait
|
||||
|
||||
for (uint8_t i = 0; i < sensor.count(); i++) {
|
||||
sensor.getReading(sensorBuf, i); // get result into buf
|
||||
pc.printf("Sensor %d : %s\r", i+1, sensorBuf); // display it to the world
|
||||
}
|
||||
|
||||
}
|
||||
* @endcode
|
||||
*/
|
||||
class DS18B20Sensor
|
||||
{
|
||||
public:
|
||||
/** Create DS18B20Sensor instance
|
||||
* @param pin The pin number used by the onewire bus.
|
||||
*/
|
||||
DS18B20Sensor(PinName pin);
|
||||
|
||||
/** Copies the sensor results into the parameter text.
|
||||
* @param text The target text buffer.
|
||||
* @param index The sensor number.
|
||||
*/
|
||||
void getReading(char * text, uint8_t index);
|
||||
|
||||
/** Copies the sensor results into the parameter text.
|
||||
* @param text The target text buffer.
|
||||
* @param subzero 1 for less than zero.
|
||||
* @param cel Degrees Cel
|
||||
* @param cel Degrees fraction
|
||||
*/
|
||||
void getReading(char * text, uint8_t subzero, uint8_t cel, uint8_t cel_frac_bits);
|
||||
|
||||
/** Gets the sensors reading results.
|
||||
* @param index The sensor number.
|
||||
* @param subzero Returns 1 if less than zero.
|
||||
* @param cel Returns degrees Cel
|
||||
* @param cel Returns degrees fraction
|
||||
*/
|
||||
void getReading(uint8_t index, uint8_t *subzero, uint8_t *cel, uint8_t *cel_frac_bits);
|
||||
|
||||
/** This searches for sensors on the onewire bus.
|
||||
* It can also invoked by just using count()
|
||||
* @returns The number of sensors found on the bus.
|
||||
*/
|
||||
uint8_t search(void);
|
||||
|
||||
/** Starts the sensors reading.
|
||||
* @param includeWait If true, the method will wait the specified time for the sensors to complete the reading.
|
||||
* @returns
|
||||
DS18X20_OK on success,
|
||||
Other values in DS18X20.h on failure.
|
||||
*/
|
||||
uint8_t startReading(bool includeWait = true);
|
||||
|
||||
/** If search() was not called before this, then search() is invoked.
|
||||
* @returns The number of sensors found on the bus.
|
||||
*/
|
||||
uint8_t count(void);
|
||||
|
||||
|
||||
protected:
|
||||
DigitalInOut _oneWirePort;
|
||||
uint8_t gSensorIDs[MAXSENSORS][OW_ROMCODE_SIZE];
|
||||
uint8_t nSensors;
|
||||
bool _init;
|
||||
|
||||
};
|
||||
|
||||
#endif // file
|
||||
209
DS18B20/DS18X20.cpp
Normal file
209
DS18B20/DS18X20.cpp
Normal file
@@ -0,0 +1,209 @@
|
||||
/**
|
||||
* @file DS18x20.c
|
||||
* @brief library of DS18X20 1-Wire digital thermometer (http://www.maxim-ic.com/datasheet/index.mvp/id/2812)
|
||||
* @author Maciej Rajtar (Published 10 May 2010 www.mbed.org)
|
||||
* @author Frederic BLANC
|
||||
*/
|
||||
#include "crc8.h"
|
||||
#include "DS18X20.h"
|
||||
#include "mbed.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
/**
|
||||
* @brief get power status of DS18x20
|
||||
* @param [in] uint8_t id[] = rom_code
|
||||
* @return DS18X20_POWER_EXTERN or DS18X20_POWER_PARASITE
|
||||
* @date 20/06/2011
|
||||
*/
|
||||
uint8_t DS18X20_get_power_status(uint8_t id[]) {
|
||||
uint8_t pstat;
|
||||
ow_reset();
|
||||
ow_command(DS18X20_READ_POWER_SUPPLY, id);
|
||||
pstat=ow_bit_io(1); // pstat 0=is parasite/ !=0 ext. powered
|
||||
ow_reset();
|
||||
return (pstat) ? DS18X20_POWER_EXTERN:DS18X20_POWER_PARASITE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief start measurement (CONVERT_T) for all sensors if input id==NULL
|
||||
or for single sensor. then id is the rom-code
|
||||
* @param [in] uint8_t with_power_extern
|
||||
* @param [in] uint8_t id[] = rom_code
|
||||
* @return DS18X20_OK or DS18X20_START_FAIL
|
||||
* @date 20/06/2011
|
||||
*/
|
||||
uint8_t DS18X20_start_meas( uint8_t with_power_extern, uint8_t id[]) {
|
||||
ow_reset(); //**
|
||||
if ( ow_test_pin() ) { // only send if bus is "idle" = high
|
||||
ow_command( DS18X20_CONVERT_T, id );
|
||||
if (with_power_extern != DS18X20_POWER_EXTERN)
|
||||
ow_parasite_enable();
|
||||
return DS18X20_OK;
|
||||
}
|
||||
return DS18X20_START_FAIL;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief reads temperature (scratchpad) of sensor with rom-code id
|
||||
output: subzero==1 if temp.<0, cel: full celsius, mcel: frac
|
||||
in millicelsius*0.1
|
||||
i.e.: subzero=1, cel=18, millicel=5000 = -18,5000�C
|
||||
* @param [in] id[] = rom_code
|
||||
* @param [out] subzero
|
||||
* @param [out] cel
|
||||
* @param [out] cel_frac_bits
|
||||
* @return DS18X20_OK or DS18X20_ERROR_CRC
|
||||
* @date 20/06/2011
|
||||
*/
|
||||
uint8_t DS18X20_read_meas(uint8_t id[], uint8_t *subzero,
|
||||
uint8_t *cel, uint8_t *cel_frac_bits) {
|
||||
uint8_t i;
|
||||
uint8_t sp[DS18X20_SP_SIZE];
|
||||
|
||||
ow_reset();
|
||||
ow_command(DS18X20_READ, id);
|
||||
for ( i=0 ; i< DS18X20_SP_SIZE; i++ )
|
||||
sp[i]=ow_byte_rd();
|
||||
if ( crc8( &sp[0], DS18X20_SP_SIZE ) ){
|
||||
if ((sp[DS18X20_SP_SIZE-1]==0xFF) && (sp[DS18X20_SP_SIZE-2]==0xFF))
|
||||
return OW_ERROR; // bus error
|
||||
return DS18X20_ERROR_CRC; // data error
|
||||
}
|
||||
|
||||
DS18X20_meas_to_cel(id[0], sp, subzero, cel, cel_frac_bits);
|
||||
return DS18X20_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief convert raw value from DS18x20 to Celsius
|
||||
input is:
|
||||
- familycode fc (0x10/0x28 see header)
|
||||
- scratchpad-buffer
|
||||
output is:
|
||||
- cel full celsius
|
||||
- fractions of celsius in millicelsius*(10^-1)/625 (the 4 LS-Bits)
|
||||
- subzero =0 positiv / 1 negativ
|
||||
always returns DS18X20_OK
|
||||
TODO invalid-values detection (but should be covered by CRC)
|
||||
* @param [in] fc
|
||||
* @param [in] sp
|
||||
* @param [out] subzero
|
||||
* @param [out] cel
|
||||
* @param [out] cel_frac_bits
|
||||
* @return DS18X20_OK
|
||||
* @date 20/06/2011
|
||||
*/
|
||||
uint8_t DS18X20_meas_to_cel( uint8_t fc, uint8_t *sp,
|
||||
uint8_t* subzero, uint8_t* cel, uint8_t* cel_frac_bits) {
|
||||
uint16_t meas;
|
||||
uint8_t i;
|
||||
|
||||
meas = sp[0]; // LSB
|
||||
meas |= ((uint16_t)sp[1])<<8; // MSB
|
||||
//meas = 0xff5e; meas = 0xfe6f;
|
||||
|
||||
// only work on 12bit-base
|
||||
if ( fc == DS18S20_ID ) { // 9 -> 12 bit if 18S20
|
||||
/* Extended measurements for DS18S20 contributed by Carsten Foss */
|
||||
meas &= (uint16_t) 0xfffe; // Discard LSB , needed for later extended precicion calc
|
||||
meas <<= 3; // Convert to 12-bit , now degrees are in 1/16 degrees units
|
||||
meas += (16 - sp[6]) - 4; // Add the compensation , and remember to subtract 0.25 degree (4/16)
|
||||
}
|
||||
|
||||
// check for negative
|
||||
if ( meas & 0x8000 ) {
|
||||
*subzero=1; // mark negative
|
||||
meas ^= 0xffff; // convert to positive => (twos complement)++
|
||||
meas++;
|
||||
} else *subzero=0;
|
||||
|
||||
// clear undefined bits for B != 12bit
|
||||
if ( fc == DS18B20_ID ) { // check resolution 18B20
|
||||
i = sp[DS18B20_CONF_REG];
|
||||
if ( (i & DS18B20_12_BIT) == DS18B20_12_BIT ) ;
|
||||
else if ( (i & DS18B20_11_BIT) == DS18B20_11_BIT )
|
||||
meas &= ~(DS18B20_11_BIT_UNDF);
|
||||
else if ( (i & DS18B20_10_BIT) == DS18B20_10_BIT )
|
||||
meas &= ~(DS18B20_10_BIT_UNDF);
|
||||
else { // if ( (i & DS18B20_9_BIT) == DS18B20_9_BIT ) {
|
||||
meas &= ~(DS18B20_9_BIT_UNDF);
|
||||
}
|
||||
}
|
||||
|
||||
*cel = (uint8_t)(meas >> 4);
|
||||
*cel_frac_bits = (uint8_t)(meas & 0x000F);
|
||||
|
||||
return DS18X20_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief converts to decicelsius
|
||||
input is ouput from meas_to_cel
|
||||
i.e.: sz=0, c=28, frac=15 returns 289 (=28.9�C)
|
||||
0 0 0
|
||||
1 625 625 1
|
||||
2 1250 250
|
||||
3 1875 875 3
|
||||
4 2500 500 4
|
||||
5 3125 125
|
||||
6 3750 750 6
|
||||
7 4375 375
|
||||
8 5000 0
|
||||
9 5625 625 9
|
||||
10 6250 250
|
||||
11 6875 875 11
|
||||
12 7500 500 12
|
||||
13 8125 125
|
||||
14 8750 750 14
|
||||
15 9375 375
|
||||
* @param [in] subzero
|
||||
* @param [in] cel
|
||||
* @param [in] cel_frac_bits
|
||||
* @return absolute value of temperatur in decicelsius
|
||||
* @date 20/06/2011
|
||||
*/
|
||||
uint16_t DS18X20_temp_to_decicel(uint8_t subzero, uint8_t cel,
|
||||
uint8_t cel_frac_bits) {
|
||||
uint16_t h;
|
||||
uint8_t i;
|
||||
uint8_t need_rounding[] = { 1, 3, 4, 6, 9, 11, 12, 14 };
|
||||
|
||||
h = cel_frac_bits*DS18X20_FRACCONV/1000;
|
||||
h += cel*10;
|
||||
if (!subzero) {
|
||||
for (i=0; i<sizeof(need_rounding); i++) {
|
||||
if ( cel_frac_bits == need_rounding[i] ) {
|
||||
h++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return h;
|
||||
}
|
||||
/**
|
||||
* @brief compare temperature values (full celsius only)
|
||||
* @param [in] subzero1
|
||||
* @param [in] cel1
|
||||
* @param [in] subzero2
|
||||
* @param [in] cel2
|
||||
* @return -1 if param-pair1 < param-pair2
|
||||
0 if ==
|
||||
1 if >
|
||||
* @date 20/06/2011
|
||||
*/
|
||||
int8_t DS18X20_temp_cmp(uint8_t subzero1, uint16_t cel1,
|
||||
uint8_t subzero2, uint16_t cel2) {
|
||||
int16_t t1 = (subzero1) ? (cel1*(-1)) : (cel1);
|
||||
int16_t t2 = (subzero2) ? (cel2*(-1)) : (cel2);
|
||||
|
||||
if (t1<t2) return -1;
|
||||
if (t1>t2) return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
68
DS18B20/DS18X20.h
Normal file
68
DS18B20/DS18X20.h
Normal file
@@ -0,0 +1,68 @@
|
||||
/* DS18X20 specific values (see datasheet www.maxim-ic.com/datasheet/index.mvp/id/2812) */
|
||||
#include "onewire.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef _DS18X20_
|
||||
#define _DS18X20_
|
||||
#define DS18S20_ID 0x10
|
||||
#define DS18B20_ID 0x28
|
||||
|
||||
#define DS18X20_POWER_PARASITE 0x00
|
||||
#define DS18X20_POWER_EXTERN 0x01
|
||||
#define DS18X20_CONVERT_T 0x44
|
||||
#define DS18X20_READ 0xBE
|
||||
#define DS18X20_WRITE 0x4E
|
||||
#define DS18X20_EE_WRITE 0x48
|
||||
#define DS18X20_EE_RECALL 0xB8
|
||||
#define DS18X20_READ_POWER_SUPPLY 0xB4
|
||||
|
||||
#define DS18X20_OK 0x00
|
||||
#define DS18X20_ERROR 0x01
|
||||
#define DS18X20_START_FAIL 0x02
|
||||
#define DS18X20_ERROR_CRC 0x03
|
||||
|
||||
#define DS18B20_CONF_REG 4
|
||||
#define DS18B20_9_BIT 0
|
||||
#define DS18B20_10_BIT (1<<5)
|
||||
#define DS18B20_11_BIT (1<<6)
|
||||
#define DS18B20_12_BIT ((1<<6)|(1<<5))
|
||||
|
||||
// indefined bits in LSB if 18B20 != 12bit
|
||||
#define DS18B20_9_BIT_UNDF ((1<<0)|(1<<1)|(1<<2))
|
||||
#define DS18B20_10_BIT_UNDF ((1<<0)|(1<<1))
|
||||
#define DS18B20_11_BIT_UNDF ((1<<0))
|
||||
#define DS18B20_12_BIT_UNDF 0
|
||||
|
||||
// conversion times in ms
|
||||
#define DS18B20_TCONV_12BIT 750
|
||||
#define DS18B20_TCONV_11BIT DS18B20_TCONV_12_BIT/2
|
||||
#define DS18B20_TCONV_10BIT DS18B20_TCONV_12_BIT/4
|
||||
#define DS18B20_TCONV_9BIT DS18B20_TCONV_12_BIT/8
|
||||
#define DS18S20_TCONV DS18B20_TCONV_12_BIT
|
||||
|
||||
// constant to convert the fraction bits to cel*(10^-4)
|
||||
#define DS18X20_FRACCONV 625
|
||||
|
||||
#define DS18X20_SP_SIZE 9
|
||||
|
||||
// DS18X20 EEPROM-Support
|
||||
#define DS18X20_WRITE_SCRATCHPAD 0x4E
|
||||
#define DS18X20_COPY_SCRATCHPAD 0x48
|
||||
#define DS18X20_RECALL_E2 0xB8
|
||||
#define DS18X20_COPYSP_DELAY 10 /* ms */
|
||||
#define DS18X20_TH_REG 2
|
||||
#define DS18X20_TL_REG 3
|
||||
|
||||
uint8_t DS18X20_get_power_status(uint8_t id[]);
|
||||
uint8_t DS18X20_start_meas( uint8_t with_external, uint8_t id[]);
|
||||
uint8_t DS18X20_read_meas(uint8_t id[], uint8_t *subzero, uint8_t *cel, uint8_t *cel_frac_bits);
|
||||
uint8_t DS18X20_read_meas_single(uint8_t familycode, uint8_t *subzero, uint8_t *cel, uint8_t *cel_frac_bits);
|
||||
uint8_t DS18X20_meas_to_cel( uint8_t fc, uint8_t *sp, uint8_t* subzero, uint8_t* cel, uint8_t* cel_frac_bits);
|
||||
uint16_t DS18X20_temp_to_decicel(uint8_t subzero, uint8_t cel, uint8_t cel_frac_bits);
|
||||
int8_t DS18X20_temp_cmp(uint8_t subzero1, uint16_t cel1, uint8_t subzero2, uint16_t cel2);
|
||||
#endif
|
||||
|
||||
}
|
||||
62
DS18B20/crc16.cpp
Normal file
62
DS18B20/crc16.cpp
Normal file
@@ -0,0 +1,62 @@
|
||||
#include <onewire.h>
|
||||
#include <inttypes.h>
|
||||
#include "mbed.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define CRC16INIT 0x0000
|
||||
//#define CRC16POLY 0x8005; // Polynome =x^16 + x^15 + x^2 + x^0 = 0x18005
|
||||
#define CRC16POLY 0xA001;
|
||||
|
||||
uint16_t crc16(uint8_t* octets, uint16_t nboctets)
|
||||
{
|
||||
uint16_t crc = CRC16INIT;
|
||||
int i, done = 0;
|
||||
uint8_t todo;
|
||||
if (nboctets != 0) {
|
||||
do {
|
||||
todo = octets[done];
|
||||
crc ^= todo;
|
||||
for (i = 0; i < 8; i++) {
|
||||
if (crc % 2 != 0) {
|
||||
crc = (crc >> 1) ^ CRC16POLY;
|
||||
} else {
|
||||
crc = crc >> 1;
|
||||
}
|
||||
}
|
||||
done++;
|
||||
} while (done < nboctets);
|
||||
|
||||
|
||||
}
|
||||
|
||||
return crc;
|
||||
}
|
||||
//CRC16 byte, always two bytes, bit inverted, LSByte first
|
||||
uint8_t ctrl_crc16(uint8_t* octets, uint16_t nboctets)
|
||||
{
|
||||
uint16_t crc;
|
||||
uint8_t *ptr;
|
||||
#ifdef DEBUG
|
||||
printf( "\nCRC16 : " );
|
||||
for ( uint8_t i=0 ; i< nboctets; i++ )
|
||||
printf(":%2.2X",octets[i]);
|
||||
printf( "\n" );
|
||||
#endif
|
||||
crc =~crc16(octets, nboctets-2);
|
||||
ptr=(uint8_t*)&crc;
|
||||
#ifdef DEBUG
|
||||
printf( "\n" );
|
||||
printf("CRC16:%X",crc);
|
||||
printf( "\n" );
|
||||
#endif
|
||||
if(*ptr==octets[nboctets-2])
|
||||
if(*++ptr==octets[nboctets-1])
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
}
|
||||
5
DS18B20/crc16.h
Normal file
5
DS18B20/crc16.h
Normal file
@@ -0,0 +1,5 @@
|
||||
#ifndef _CRC16_
|
||||
#define _CRC16_
|
||||
uint16_t crc16(uint8_t* octets, uint16_t nboctets);
|
||||
uint8_t ctrl_crc16(uint8_t* octets, uint16_t nboctets);
|
||||
#endif
|
||||
45
DS18B20/crc8.cpp
Normal file
45
DS18B20/crc8.cpp
Normal file
@@ -0,0 +1,45 @@
|
||||
#include <inttypes.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define CRC8INIT 0x00
|
||||
#define CRC8POLY 0x18 //0X18 = X^8+X^5+X^4+X^0
|
||||
|
||||
uint8_t crc8 ( uint8_t *data_in, uint16_t number_of_bytes_to_read )
|
||||
{
|
||||
uint8_t crc;
|
||||
uint16_t loop_count;
|
||||
uint8_t bit_counter;
|
||||
uint8_t data;
|
||||
uint8_t feedback_bit;
|
||||
|
||||
crc = CRC8INIT;
|
||||
|
||||
for (loop_count = 0; loop_count != number_of_bytes_to_read; loop_count++)
|
||||
{
|
||||
data = data_in[loop_count];
|
||||
|
||||
bit_counter = 8;
|
||||
do {
|
||||
feedback_bit = (crc ^ data) & 0x01;
|
||||
|
||||
if ( feedback_bit == 0x01 ) {
|
||||
crc = crc ^ CRC8POLY;
|
||||
}
|
||||
crc = (crc >> 1) & 0x7F;
|
||||
if ( feedback_bit == 0x01 ) {
|
||||
crc = crc | 0x80;
|
||||
}
|
||||
|
||||
data = data >> 1;
|
||||
bit_counter--;
|
||||
|
||||
} while (bit_counter > 0);
|
||||
}
|
||||
|
||||
return crc;
|
||||
}
|
||||
|
||||
}
|
||||
9
DS18B20/crc8.h
Normal file
9
DS18B20/crc8.h
Normal file
@@ -0,0 +1,9 @@
|
||||
#ifndef _CRC8_
|
||||
#define _CRC8_
|
||||
#include <mbed.h>
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
uint8_t crc8 (uint8_t* data_in, uint16_t number_of_bytes_to_read);
|
||||
#endif
|
||||
}
|
||||
312
DS18B20/onewire.cpp
Normal file
312
DS18B20/onewire.cpp
Normal file
@@ -0,0 +1,312 @@
|
||||
/**
|
||||
* @file onewire.c
|
||||
* @brief library 1-Wire(www.maxim-ic.com)
|
||||
* @author Maciej Rajtar (Published 10 May 2010 www.mbed.org)
|
||||
* @author Frederic BLANC
|
||||
*/
|
||||
#include "crc8.h"
|
||||
#include "DS18X20.h"
|
||||
#include "onewire.h"
|
||||
|
||||
DigitalInOut ow_pin(ONEWIRE_PIN);
|
||||
|
||||
/**
|
||||
* @brief PUL-UP bus OW
|
||||
* @return OW_OK
|
||||
* @date 20/06/2011
|
||||
*/
|
||||
uint8_t ow_PullUp(void)
|
||||
{
|
||||
ow_pin.mode(PullUp); //PULL-UP bus OW
|
||||
return OW_OK;
|
||||
}
|
||||
/**
|
||||
* @brief search_sensors
|
||||
* @param [out] nSensors number of device onewire
|
||||
* @param [out] gSensorIDs[][] array of id romcode
|
||||
* @return OW_OK or OW_PRESENCE_ERR or OW_DATA_ERR
|
||||
* @date 20/06/2011
|
||||
*/
|
||||
uint8_t search_sensors(uint8_t *nSensors,uint8_t *gSensorIDs ) {
|
||||
uint8_t i;
|
||||
uint8_t id[OW_ROMCODE_SIZE];
|
||||
uint8_t diff;
|
||||
printf( "Scanning Bus\n" );
|
||||
diff = OW_SEARCH_FIRST;
|
||||
for (*nSensors = 0 ; (diff != OW_LAST_DEVICE) && (*nSensors < MAXSENSORS) ;++(*nSensors) ) {
|
||||
ow_find_sensor( &diff, &id[0] );
|
||||
if ( diff == OW_PRESENCE_ERR ) {
|
||||
printf( "No Sensor found\n" );
|
||||
return diff;
|
||||
}
|
||||
if ( diff == OW_DATA_ERR ) {
|
||||
printf( "Bus Error\n" );
|
||||
return diff;
|
||||
}
|
||||
for (i=0;i<OW_ROMCODE_SIZE;i++)
|
||||
gSensorIDs[(*nSensors)*OW_ROMCODE_SIZE+i]=id[i];
|
||||
|
||||
}
|
||||
return OW_OK;
|
||||
}
|
||||
/**
|
||||
* @brief show_id
|
||||
* @param [in] id[] = rom_code
|
||||
* @param [in] n number of id[n]
|
||||
* @param [out] text id
|
||||
* @return OW_OK or OW_ERROR_CRC
|
||||
* @date 20/06/2011
|
||||
*/
|
||||
uint8_t ow_show_id( uint8_t id[], size_t n ,char *text) {
|
||||
size_t i;
|
||||
char hex[4];
|
||||
sprintf(text,"");
|
||||
|
||||
for ( i = 0; i < n; i++ ) {
|
||||
if ( i == 0 ) strcat(text, " FC: " );
|
||||
else if ( i == n-1 ) strcat(text, "CRC: " );
|
||||
if ( i == 1 ) strcat(text, " SN: " );
|
||||
sprintf(hex,"%2.2X ",id[i]);
|
||||
strcat(text,hex);
|
||||
if ( i == 0 ) {
|
||||
if ( id[0] == DS18S20_ID ) strcat(text,"(18S)");
|
||||
else if ( id[0] == DS18B20_ID ) strcat(text,"(18B)");
|
||||
else strcat(text,"( ? )");
|
||||
}
|
||||
}
|
||||
if ( crc8( id, OW_ROMCODE_SIZE) )
|
||||
return OW_ERROR_CRC;
|
||||
return OW_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief test pin onewire bus
|
||||
* @return etat pin ow
|
||||
* @date 20/06/2011
|
||||
*/
|
||||
uint8_t ow_test_pin (void){
|
||||
if (ow_pin)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
/**
|
||||
* @brief onewire reset bus
|
||||
* @return pin ow or OW_SHORT_CIRCUIT
|
||||
* @date 20/06/2011
|
||||
*/
|
||||
uint8_t ow_reset(void) { // reset. Should improve to act as a presence pulse
|
||||
uint8_t err;
|
||||
|
||||
ow_pin.output();
|
||||
ow_pin = 0; // bring low for 500 us
|
||||
wait_us(500);
|
||||
ow_pin.input();
|
||||
wait_us(60);
|
||||
err = ow_pin;
|
||||
wait_us(240);
|
||||
if ( ow_pin == 0 ) { // short circuit
|
||||
err = OW_SHORT_CIRCUIT;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief read write onewire
|
||||
* @param [in/out] b data
|
||||
* @return data
|
||||
* @date 20/06/2011
|
||||
*/
|
||||
uint8_t ow_bit_io( uint8_t b ) {
|
||||
|
||||
ow_pin.output(); // drive bus low
|
||||
ow_pin = 0;
|
||||
wait_us(1); // Recovery-Time wuffwuff was 1
|
||||
|
||||
if ( b )
|
||||
ow_pin.input(); // if bit is 1 set bus high (by ext. pull-up)
|
||||
// delay was 15uS-1 see comment above
|
||||
wait_us(15-1);
|
||||
if ( ow_pin == 0 ) b = 0; // sample at end of read-timeslot
|
||||
wait_us(60-15);
|
||||
ow_pin.input();
|
||||
return b;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief byte write on onewire
|
||||
* @param [in] b data
|
||||
* @return data
|
||||
* @date 20/06/2011
|
||||
*/
|
||||
uint8_t ow_byte_wr( uint8_t b ) {
|
||||
uint8_t i = 8, j;
|
||||
|
||||
do {
|
||||
j = ow_bit_io( b & 1 );
|
||||
b >>= 1;
|
||||
if ( j )
|
||||
b |= 0x80;
|
||||
} while ( --i );
|
||||
return b;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief byte read on onewire
|
||||
* @param [in] uint8_t b
|
||||
* @return
|
||||
* @date 20/06/2011
|
||||
*/
|
||||
uint8_t ow_byte_rd( void ) {
|
||||
// read by sending 0xff (a dontcare?)
|
||||
return ow_byte_wr( 0xFF );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief search romcode
|
||||
* @param [in] uint8_t diff
|
||||
* @param [out] id romcode
|
||||
* @return next_diff or OW_LAST_DEVICE or OW_DATA_ERR or OW_PRESENCE_ERR
|
||||
* @date 20/06/2011
|
||||
*/
|
||||
uint8_t ow_rom_search( uint8_t diff, uint8_t id[] ) {
|
||||
uint8_t i, j, next_diff;
|
||||
uint8_t b;
|
||||
|
||||
if ( ow_reset() )
|
||||
return OW_PRESENCE_ERR; // error, no device found
|
||||
ow_byte_wr( OW_SEARCH_ROM ); // ROM search command
|
||||
next_diff = OW_LAST_DEVICE; // unchanged on last device
|
||||
i = OW_ROMCODE_SIZE * 8; // 8 bytes
|
||||
do {
|
||||
j = 8; // 8 bits
|
||||
do {
|
||||
b = ow_bit_io( 1 ); // read bit
|
||||
if ( ow_bit_io( 1 ) ) { // read complement bit
|
||||
if ( b ) // 11
|
||||
return OW_DATA_ERR; // data error
|
||||
} else {
|
||||
if ( !b ) { // 00 = 2 devices
|
||||
if ( diff > i || ((*id & 1) && diff != i) ) {
|
||||
b = 1; // now 1
|
||||
next_diff = i; // next pass 0
|
||||
}
|
||||
}
|
||||
}
|
||||
ow_bit_io( b ); // write bit
|
||||
*id >>= 1;
|
||||
if ( b )
|
||||
*id |= 0x80; // store bit
|
||||
--i;
|
||||
} while ( --j );
|
||||
id++; // next byte
|
||||
} while ( i );
|
||||
return next_diff; // to continue search
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief write command
|
||||
* @param [in] command
|
||||
* @param [in] id romcode
|
||||
* @date 20/06/2011
|
||||
*/
|
||||
uint8_t ow_command( uint8_t command, uint8_t id[] ) {
|
||||
uint8_t i;
|
||||
|
||||
ow_reset();
|
||||
if ( id ) {
|
||||
ow_byte_wr( OW_MATCH_ROM ); // to a single device
|
||||
i = OW_ROMCODE_SIZE;
|
||||
do {
|
||||
ow_byte_wr( *id );
|
||||
++id;
|
||||
} while ( --i );
|
||||
} else {
|
||||
ow_byte_wr( OW_SKIP_ROM ); // to all devices
|
||||
}
|
||||
ow_byte_wr( command );
|
||||
return 0;
|
||||
}
|
||||
/**
|
||||
* @brief parasite enable
|
||||
* @date 20/06/2011
|
||||
*/
|
||||
uint8_t ow_parasite_enable(void) {
|
||||
ow_pin.output();
|
||||
ow_pin = 1;
|
||||
return 0;
|
||||
}
|
||||
/**
|
||||
* @brief parasite disable
|
||||
* @date 20/06/2011
|
||||
*/
|
||||
uint8_t ow_parasite_disable(void) {
|
||||
|
||||
ow_pin.input();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief find Sensors on 1-Wire-Bus
|
||||
* @param [in/out] diff is the result of the last rom-search
|
||||
* @param [out] is the rom-code of the sensor found
|
||||
* @return OW_OK or OW_ERROR
|
||||
*/
|
||||
uint8_t ow_find_sensor(uint8_t *diff, uint8_t id[]) {
|
||||
for (;;)
|
||||
{
|
||||
*diff = ow_rom_search( *diff, &id[0] );
|
||||
if ( *diff==OW_PRESENCE_ERR)
|
||||
return OW_ERROR;
|
||||
if ( *diff==OW_DATA_ERR )
|
||||
return OW_ERROR;
|
||||
if ( *diff == OW_LAST_DEVICE )
|
||||
return OW_OK ;
|
||||
if ( id[0] == DS18B20_ID || id[0] == DS18S20_ID )
|
||||
return OW_OK ;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief output byte d (least sig bit first)
|
||||
* @param [in] d output byte (least sig bit first)
|
||||
* @return OW_OK
|
||||
*/
|
||||
uint8_t OneWireOutByte(uint8_t d) { // output byte d (least sig bit first).
|
||||
for (int n=8; n!=0; n--) {
|
||||
if ((d & 0x01) == 1) { // test least sig bit
|
||||
ow_pin.output();
|
||||
ow_pin = 0;
|
||||
wait_us(5);
|
||||
ow_pin.input();
|
||||
wait_us(80);
|
||||
} else {
|
||||
ow_pin.output();
|
||||
ow_pin = 0;
|
||||
wait_us(80);
|
||||
ow_pin.input();
|
||||
}
|
||||
d=d>>1; // now the next bit is in the least sig bit position.
|
||||
}
|
||||
return OW_OK;
|
||||
}
|
||||
/**
|
||||
* @brief read byte, least sig byte first
|
||||
* @return byte, least sig byte first
|
||||
*/
|
||||
uint8_t OneWireInByte(void) { // read byte, least sig byte first
|
||||
uint8_t d = 0, b;
|
||||
for (int n=0; n<8; n++) {
|
||||
ow_pin.output();
|
||||
ow_pin = 0;
|
||||
wait_us(5);
|
||||
ow_pin.input();
|
||||
wait_us(5);
|
||||
b =ow_pin;
|
||||
wait_us(50);
|
||||
d = (d >> 1) | (b << 7); // shift d to right and insert b in most sig bit position
|
||||
}
|
||||
return d;
|
||||
}
|
||||
|
||||
64
DS18B20/onewire.h
Normal file
64
DS18B20/onewire.h
Normal file
@@ -0,0 +1,64 @@
|
||||
/**
|
||||
* @file onewire.h
|
||||
* @brief library 1-Wire(www.maxim-ic.com)
|
||||
* @author Maciej Rajtar (Published 10 May 2010 www.mbed.org)
|
||||
* @author Frederic BLANC
|
||||
*/
|
||||
#include "mbed.h"
|
||||
#ifndef _onewire_
|
||||
#define _onewire_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
//#define DEBUG 1
|
||||
//#define DEBUG_L1 1
|
||||
#define ONEWIRE_PIN D8
|
||||
|
||||
#define MAXSENSORS 16
|
||||
|
||||
// rom-code size including CRC
|
||||
#define OW_ROMCODE_SIZE 8
|
||||
|
||||
#define OW_OK 0x00
|
||||
#define OW_ERROR 0x01
|
||||
#define OW_START_FAIL 0x02
|
||||
#define OW_ERROR_CRC 0x03
|
||||
#define OW_ERROR_BAD_ID 0x04
|
||||
#define OW_BUSY 0x05
|
||||
|
||||
#define OW_MATCH_ROM 0x55
|
||||
#define OW_SKIP_ROM 0xCC
|
||||
#define OW_SEARCH_ROM 0xF0
|
||||
#define OW_READ_ROM 0x33
|
||||
#define OW_CONDITIONAL_SEARCH 0xEC
|
||||
#define OW_OVERDRIVE_SKIP_ROM 0x3C
|
||||
#define OW_OVERDRIVE_MATCH_ROM 0x69
|
||||
|
||||
#define OW_SHORT_CIRCUIT 0xFF
|
||||
#define OW_SEARCH_FIRST 0xFF // start new search
|
||||
#define OW_PRESENCE_ERR 0x01
|
||||
#define OW_DATA_ERR 0xFE
|
||||
#define OW_LAST_DEVICE 0x00 // last device found
|
||||
// 0x01 ... 0x40: continue searching
|
||||
|
||||
//PinName pin;
|
||||
|
||||
uint8_t search_sensors(uint8_t *nSensors,uint8_t *gSensorIDs );
|
||||
uint8_t ow_PullUp(void);
|
||||
uint8_t ow_show_id( uint8_t id[], size_t n ,char *text);
|
||||
uint8_t ow_test_pin (void);
|
||||
uint8_t ow_reset(void);
|
||||
uint8_t ow_rom_search( uint8_t diff, uint8_t id[] );
|
||||
uint8_t ow_command( uint8_t command, uint8_t id[] );
|
||||
uint8_t ow_find_sensor(uint8_t *diff, uint8_t id[]);
|
||||
uint8_t ow_parasite_enable(void);
|
||||
uint8_t ow_parasite_disable(void);
|
||||
uint8_t ow_bit_io( uint8_t b );
|
||||
uint8_t ow_byte_wr( uint8_t b );
|
||||
uint8_t ow_byte_rd( void );
|
||||
|
||||
|
||||
}
|
||||
#endif
|
||||
Reference in New Issue
Block a user