Optimization of original DS1620 library - calls to wait(float) changed to wait_us(int) + resolving several warnings.
Dependents: EXAMPLE_Nucleo_mbed_RTOS_test_code
Fork of DS1620 by
DS1620.cpp
- Committer:
- dzoni
- Date:
- 2015-12-12
- Revision:
- 2:35526d3a8a04
- Parent:
- 0:45c93163189a
File content as of revision 2:35526d3a8a04:
// Library for the DS1620 digital thermometer // Copyright (C) <2015> Ryan Bancroft // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // For copy of the GNU General Public License // see <http://www.gnu.org/licenses/>. #include "mbed.h" #include "DS1620.h" #define WRITE_COMPLETE_TIME_MS (100) // time for write to complete (100 msec) // Constructor DS1620::DS1620(PinName dq, PinName clk, PinName rst) : _dq(dq), _clk(clk), _rst(rst) { // Initialize members _dq.input(); _clk = 1; _rst = 0; _clockDelay = CLOCK_DELAY; } // Destructor DS1620::~DS1620() { } float DS1620::getTemperature() { float temp = 0.0; unsigned short rawTemp = readTemperatureRaw(); temp = rawTemp / 2.0f; if (rawTemp >= 0x100) { temp -= 256.0f; } return temp; } float DS1620::getHighResolutionTemperature() { float temp = 0.0f; unsigned short rawTemp, counter, slope = 0; rawTemp = readTemperatureRaw(); counter = readCounter(); loadSlope(); slope = readCounter(); temp = (rawTemp >> 1) - 0.25f; if (rawTemp >= 0x100) { temp -= 256.0f; } temp += ((float)slope - (float)counter) / (float)slope; return temp; } unsigned short DS1620::readTemperatureRaw() { unsigned short temp = 0; unsigned char tempLSB, tempMSB = 0; _rst = 1; shiftOut(READ_TEMPERATURE); tempLSB = shiftIn(); tempMSB = shiftIn(); _rst = 0; temp = tempMSB * 256; temp += tempLSB; return temp; } unsigned char DS1620::readConfig() { unsigned char data = 0; _rst = 1; shiftOut(READ_CONFIG); data = shiftIn(); _rst = 0; return data; } void DS1620::writeConfig(unsigned char config) { _rst = 1; shiftOut(WRITE_CONFIG); shiftOut(config); _rst = 0; wait_ms(WRITE_COMPLETE_TIME_MS); // wait for write to complete } unsigned short DS1620::readTLRaw() { unsigned short temp = 0; unsigned char tempLSB, tempMSB = 0; _rst = 1; shiftOut(READ_TL); tempLSB = shiftIn(); tempMSB = shiftIn(); _rst = 0; temp = tempMSB * 256; temp += tempLSB; return temp; } void DS1620::writeTLRaw(unsigned short temperature) { unsigned char tempMSB, tempLSB = 0; tempLSB = temperature & 0xFF; tempMSB = (temperature >> 8) & 0xFF; _rst = 1; shiftOut(WRITE_TL); shiftOut(tempLSB); shiftOut(tempMSB); _rst = 0; wait_ms(WRITE_COMPLETE_TIME_MS); // wait for write to complete } unsigned short DS1620::readTHRaw() { unsigned short temp = 0; unsigned char tempLSB, tempMSB = 0; _rst = 1; shiftOut(READ_TH); tempLSB = shiftIn(); tempMSB = shiftIn(); _rst = 0; temp = tempMSB * 256; temp += tempLSB; return temp; } void DS1620::writeTHRaw(unsigned short temperature) { unsigned char tempMSB, tempLSB = 0; tempLSB = temperature & 0xFF; tempMSB = (temperature >> 8) & 0xFF; _rst = 1; shiftOut(WRITE_TH); shiftOut(tempLSB); shiftOut(tempMSB); _rst = 0; wait_ms(WRITE_COMPLETE_TIME_MS); // wait for write to complete } unsigned short DS1620::readCounter() { unsigned short temp = 0; unsigned char tempLSB, tempMSB = 0; _rst = 1; shiftOut(READ_COUNTER); tempLSB = shiftIn(); tempMSB = shiftIn(); _rst = 0; temp = tempMSB * 256; temp += tempLSB; return temp; } unsigned short DS1620::readSlope() { unsigned short temp = 0; unsigned char tempLSB, tempMSB = 0; _rst = 1; shiftOut(READ_SLOPE); tempLSB = shiftIn(); tempMSB = shiftIn(); _rst = 0; temp = tempMSB * 256; temp += tempLSB; return temp; } void DS1620::loadSlope() { _rst = 1; shiftOut(LOAD_SLOPE); _rst = 0; } void DS1620::startConversion() { _rst = 1; shiftOut(START_CONVERT); _rst = 0; } void DS1620::stopConversion() { _rst = 1; shiftOut(STOP_CONVERT); _rst = 0; } void DS1620::setSerialClockFrequency(clock_frequencies_t frequency) { _clockDelay = frequency; } unsigned char DS1620::shiftIn() { unsigned char temp = 0; unsigned char data = 0; _dq.input(); for(int x=0;x<8;x++) { _clk = 0; wait_us(_clockDelay); temp = _dq; temp = temp << 7; data = data >> 1; data = data | temp; _clk = 1; wait_us(_clockDelay); } return data; } void DS1620::shiftOut(unsigned char data) { _dq.output(); for(int x=0;x<8;x++){ _clk = 0; _dq = data & 0x01; wait_us(_clockDelay); _clk = 1; wait_us(_clockDelay); data = data >> 1; } _dq.input(); }