diff --git a/DS2417.pdf b/DS2417.pdf new file mode 100644 index 0000000..1dd9bc8 Binary files /dev/null and b/DS2417.pdf differ diff --git a/main.c b/main.c index ce48ceb..6bebd39 100644 --- a/main.c +++ b/main.c @@ -2,6 +2,8 @@ #include #include "ow.h" #include "ow-temp.h" +#include "ow-time.h" +#include int main (void) { @@ -9,24 +11,46 @@ int main (void) unsigned char devs[80]; unsigned char* tempsensor=NULL; unsigned char* clock=NULL; + time_t t; +// unsigned char c1, c2; devcount=ow_enumeratedevices(devs, 10); + +/*// + for (c1=0; c1 short ow_temp_read(unsigned char* devid, unsigned char format) { @@ -7,7 +8,10 @@ short ow_temp_read(unsigned char* devid, unsigned char format) unsigned char i; if (!ow_temp_idcheck(devid)) - return OW_ERR_INVALIDDEVICE; + { + errno=EINVAL; + return -1; + } ow_selectdevice(devid); ow_writebyte(68); // ask for a temperature reading ow_wait(); // wait for operation to complete @@ -17,6 +21,7 @@ short ow_temp_read(unsigned char* devid, unsigned char format) data[i]=ow_readbyte(); rawtemp=(short)(data[0]+((int)data[1]<<8)); + errno=0; switch (format) { case OW_TEMP_FAHRENHEIT: diff --git a/ow-time.c b/ow-time.c new file mode 100644 index 0000000..58fb8b5 --- /dev/null +++ b/ow-time.c @@ -0,0 +1,46 @@ +#include "ow-time.h" +#include + +time_t ow_time_read(unsigned char* devid) +{ + time_t t; + unsigned char i; + + if (!ow_time_idcheck(devid)) + { + errno=EINVAL; + return -1; + } + ow_selectdevice(devid); + ow_writebyte(102); // read clock + ow_readbyte(); // skip first byte returned + for (i=0; i<4; i++) // read time + ((unsigned char*)&t)[i]=ow_readbyte(); + ow_reset(); + errno=0; + return t; +} + +void ow_time_set(unsigned char* devid, time_t newtime) +{ + unsigned char i; + + if (!ow_time_idcheck(devid)) + { + errno=EINVAL; + return; + } + ow_selectdevice(devid); + ow_writebyte(153); // set clock + ow_writebyte(12); // device control: start oscillator + for (i=0; i<4; i++) // write time + ow_writebyte(((unsigned char*)&newtime)[i]); + ow_reset(); + errno=0; + return; +} + +unsigned char ow_time_idcheck(unsigned char* devid) +{ + return (devid[0]==39)?1:0; +} diff --git a/ow-time.h b/ow-time.h new file mode 100644 index 0000000..cbd0b07 --- /dev/null +++ b/ow-time.h @@ -0,0 +1,13 @@ +#ifndef OW_TIME_H +#define OW_TIME_H + +#include "ow.h" +#include + +// 1-Wire real-time clock functions + +time_t ow_time_read(unsigned char* devid); +void ow_time_set(unsigned char* devid, time_t newtime); +unsigned char ow_time_idcheck(unsigned char* devid); + +#endif // OW_TIME_H diff --git a/ow.h b/ow.h index e1fdb71..014c373 100644 --- a/ow.h +++ b/ow.h @@ -17,8 +17,4 @@ void ow_selectdevice(unsigned char* devid); unsigned char ow_crc(unsigned char* data, unsigned char len); unsigned char ow_enumeratedevices(unsigned char* devids, unsigned char maxdevs); -// common 1-Wire constants - -#define OW_ERR_INVALIDDEVICE -32767 - #endif // OW_H