Ryan Bancroft / DS1620
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers DS1620.cpp Source File

DS1620.cpp

00001 // Library for the DS1620 digital thermometer
00002 // Copyright (C) <2015> Ryan Bancroft
00003 //
00004 // This program is free software: you can redistribute it and/or modify
00005 // it under the terms of the GNU General Public License as published by
00006 // the Free Software Foundation, either version 3 of the License, or
00007 // (at your option) any later version.
00008 //
00009 // This program is distributed in the hope that it will be useful,
00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012 // GNU General Public License for more details.
00013 //
00014 // For copy of the GNU General Public License
00015 // see <http://www.gnu.org/licenses/>.
00016 
00017 #include "mbed.h"
00018 #include "DS1620.h"
00019 
00020 #define WRITE_COMPLETE_TIME_MS   (100)        // time for write to complete (100 msec) 
00021 
00022 // Constructor
00023 DS1620::DS1620(PinName dq, PinName clk, PinName rst) : _dq(dq), _clk(clk), _rst(rst)
00024 {
00025     // Initialize members  
00026     _dq.input(); 
00027     _clk = 1;
00028     _rst = 0;
00029     _clockDelay = CLOCK_DELAY;
00030 }
00031 
00032 // Destructor
00033 DS1620::~DS1620()
00034 {
00035 
00036 }
00037 
00038 float DS1620::getTemperature()
00039 {
00040     float temp = 0.0;
00041     unsigned short rawTemp = readTemperatureRaw();
00042     temp = rawTemp / 2.0f;
00043     if (rawTemp >= 0x100) {
00044         temp -= 256.0f;
00045     }
00046     return temp;
00047 }
00048 
00049 float DS1620::getHighResolutionTemperature()
00050 {
00051     float temp = 0.0f;
00052     unsigned short rawTemp, counter, slope = 0;
00053     rawTemp = readTemperatureRaw();
00054     counter = readCounter();
00055     loadSlope();
00056     slope = readCounter();
00057     
00058     temp = (rawTemp >> 1) - 0.25f;
00059     if (rawTemp >= 0x100) {
00060         temp -= 256.0f;
00061     }
00062     temp += ((float)slope - (float)counter) / (float)slope;   
00063     return temp;
00064 }
00065 
00066 unsigned short DS1620::readTemperatureRaw()
00067 {
00068     unsigned short temp = 0;
00069     unsigned char tempLSB, tempMSB = 0;
00070     
00071     _rst = 1;
00072     shiftOut(READ_TEMPERATURE);
00073     tempLSB = shiftIn();
00074     tempMSB = shiftIn();
00075     _rst = 0;
00076     temp = tempMSB * 256;
00077     temp += tempLSB;
00078     return temp;
00079 }
00080         
00081 unsigned char DS1620::readConfig()
00082 {
00083     unsigned char data = 0;
00084     _rst = 1;
00085     shiftOut(READ_CONFIG);
00086     data = shiftIn();
00087     _rst = 0;
00088     return data;
00089 }
00090 
00091 void DS1620::writeConfig(unsigned char config)
00092 {
00093     _rst = 1;
00094     shiftOut(WRITE_CONFIG);
00095     shiftOut(config);
00096     _rst = 0;
00097     wait_ms(WRITE_COMPLETE_TIME_MS);  // wait for write to complete
00098 }
00099     
00100 unsigned short DS1620::readTLRaw()
00101 {
00102     unsigned short temp = 0;
00103     unsigned char tempLSB, tempMSB = 0;
00104     
00105     _rst = 1;
00106     shiftOut(READ_TL);
00107     tempLSB = shiftIn();
00108     tempMSB = shiftIn();
00109     _rst = 0;
00110     temp = tempMSB * 256;
00111     temp += tempLSB;
00112     return temp;
00113 }
00114 
00115 void DS1620::writeTLRaw(unsigned short temperature)
00116 {
00117     unsigned char tempMSB, tempLSB = 0;
00118     tempLSB = temperature & 0xFF;
00119     tempMSB = (temperature >> 8) & 0xFF;
00120     _rst = 1;
00121     shiftOut(WRITE_TL);
00122     shiftOut(tempLSB);
00123     shiftOut(tempMSB);
00124     _rst = 0;
00125     wait_ms(WRITE_COMPLETE_TIME_MS);  // wait for write to complete
00126 }   
00127     
00128         
00129 unsigned short DS1620::readTHRaw()
00130 {
00131     unsigned short temp = 0;
00132     unsigned char tempLSB, tempMSB = 0;
00133     
00134     _rst = 1;
00135     shiftOut(READ_TH);
00136     tempLSB = shiftIn();
00137     tempMSB = shiftIn();
00138     _rst = 0;
00139     temp = tempMSB * 256;
00140     temp += tempLSB;
00141     return temp;
00142 }
00143 
00144 void DS1620::writeTHRaw(unsigned short temperature)
00145 {
00146     unsigned char tempMSB, tempLSB = 0;
00147     tempLSB = temperature & 0xFF;
00148     tempMSB = (temperature >> 8) & 0xFF;
00149     _rst = 1;
00150     shiftOut(WRITE_TH);
00151     shiftOut(tempLSB);
00152     shiftOut(tempMSB);
00153     _rst = 0;
00154     wait_ms(WRITE_COMPLETE_TIME_MS);  // wait for write to complete
00155 }
00156         
00157 unsigned short DS1620::readCounter()
00158 {
00159     unsigned short temp = 0;
00160     unsigned char tempLSB, tempMSB = 0;
00161     
00162     _rst = 1;
00163     shiftOut(READ_COUNTER);
00164     tempLSB = shiftIn();
00165     tempMSB = shiftIn();
00166     _rst = 0;
00167     temp = tempMSB * 256;
00168     temp += tempLSB;
00169     return temp;
00170 }
00171         
00172 unsigned short DS1620::readSlope()
00173 {
00174     unsigned short temp = 0;
00175     unsigned char tempLSB, tempMSB = 0;
00176     
00177     _rst = 1;
00178     shiftOut(READ_SLOPE);
00179     tempLSB = shiftIn();
00180     tempMSB = shiftIn();
00181     _rst = 0;
00182     temp = tempMSB * 256;
00183     temp += tempLSB;
00184     return temp;
00185 }
00186 
00187 void DS1620::loadSlope()
00188 {
00189     _rst = 1;
00190     shiftOut(LOAD_SLOPE);
00191     _rst = 0;
00192 }
00193         
00194 void DS1620::startConversion()
00195 {
00196     _rst = 1;
00197     shiftOut(START_CONVERT);
00198     _rst = 0;
00199 }
00200 
00201 void DS1620::stopConversion()
00202 {
00203     _rst = 1;
00204     shiftOut(STOP_CONVERT);
00205     _rst = 0;
00206 }
00207 
00208 void DS1620::setSerialClockFrequency(clock_frequencies_t frequency) 
00209 {
00210     _clockDelay = frequency;
00211 }
00212 
00213 unsigned char DS1620::shiftIn()
00214 {
00215     unsigned char temp = 0;
00216     unsigned char data = 0;
00217     _dq.input();
00218     for(int x=0;x<8;x++) {
00219         _clk = 0;
00220         wait_us(_clockDelay);
00221         temp = _dq;
00222         temp = temp << 7;
00223         data = data >> 1;
00224         data = data | temp;
00225         _clk = 1;
00226         wait_us(_clockDelay);
00227     }
00228     return data;   
00229 }
00230 
00231 void DS1620::shiftOut(unsigned char data)
00232 {
00233     _dq.output();
00234     for(int x=0;x<8;x++){
00235         _clk = 0;
00236         _dq = data & 0x01;
00237         wait_us(_clockDelay);
00238         _clk = 1;
00239         wait_us(_clockDelay);
00240         data = data >> 1;
00241     }
00242     _dq.input();
00243 }