Libary for DS18B20 working in MBED-OS
ds18b20.cpp
- Committer:
- Scheinost_Alexander
- Date:
- 2020-11-04
- Revision:
- 0:1abc4873af36
File content as of revision 0:1abc4873af36:
#include "ds18b20.h" OWI::OWI(PinName pin):owi_io(pin) { } void OWI::write0() { owi_io.output(); // timeslot = 70us owi_io.write(0); // owi = 0; wait_us(60); owi_io.input(); wait_us(10); } void OWI::write1() // timeslot = 70us { owi_io.output(); owi_io.write(0); // owi = 0; wait_us(6); owi_io.input(); wait_us(64); } unsigned char OWI::readBit() { unsigned char readbit; owi_io.output(); owi_io.write(0); // owi = 0; wait_us(6); owi_io.input(); wait_us(9); readbit = owi_io.read(); wait_us(55); return readbit; } unsigned char OWI::detectPresence() { core_util_critical_section_enter(); unsigned char presencebit; owi_io.output(); owi_io.write(0); // owi = 0; wait_us(480); owi_io.input(); wait_us(70); presencebit = !owi_io.read(); wait_us(410); core_util_critical_section_exit(); return presencebit; } void OWI::sendByte(unsigned char data) { core_util_critical_section_enter(); unsigned char temp; unsigned char i; for (i = 0; i < 8; i++) { temp = data & 0x01; if (temp) { this->write1(); } else { this->write0(); } data >>= 1; } core_util_critical_section_exit(); } unsigned char OWI::receiveByte() { core_util_critical_section_enter(); unsigned char data; unsigned char i; data = 0x00; for (i = 0; i < 8; i++) { data >>= 1; if (this->readBit()) { data |= 0x80; } } core_util_critical_section_exit(); return data; } DS18B20::DS18B20(PinName pin):DS18B20_OWI(pin) { } float DS18B20::readTemp() { unsigned char msb,lsb; int itemp; float ftemp; DS18B20_OWI.detectPresence(); DS18B20_OWI.sendByte(OWI_SKIP_ROM); DS18B20_OWI.sendByte(DS18S20_START); ThisThread::sleep_for(750); DS18B20_OWI.detectPresence(); DS18B20_OWI.sendByte(OWI_SKIP_ROM); DS18B20_OWI.sendByte(DS18S20_READ_SCRATCH_PAD); lsb = DS18B20_OWI.receiveByte(); msb = DS18B20_OWI.receiveByte(); itemp = (msb<<8)+lsb; ftemp = (float)itemp / 16.0f; return ftemp; }