Files
Jérôme Delacotte 7b30d6e298 first commit
2025-03-06 11:15:32 +01:00

711 lines
72 KiB
C++

/*
'@ @@@: @@@@@@ @@` '@@
.@@@@@# @`@@@@@. @@ @@# @'@
@@@. `@ ;@ .@@ @@ @.@ @.@
`@ @@ @@ @+ @@ @ @ @.@
@` @: @` @` @@ @ @@@.@
@# ;@@@@@@@@ @ @@ @ #@,.@
'@ @ @@ @ .@ .@
;@ @@. @@@
`@ `@@. +@@ @@`@@
@@@' @@@ @@; @@ @@
@@ ,@@#@@ ,@@@ @@
@@ #@ , @+
@@ .#@@@@@@@@@@@` @,
@ @@@@@+, `:+@@ @@
#@ @: @@ '@
@@ @# @. @,
@@ `@ `@ ++ @
`@ # @+ @@ ;@@@ @@
@+ @@@ .@ ` @` .@@@@@ @,
+@ @@@@@ @+'@@, @@@#@ @@@@@@@ '@
@. @@@@@@+ `@@@@ :@'@; @@@@@@@@@ @@ .+`
@@ @@@@@@@@` @; @@ #@@@@@@@@@, @@@@@@@
@@@: `@ +@@@@@@@@@ +@ @. `@@@@@@@@@@ '` @
@,@@@@; @@@@@@@@@@ @: @@ +@ ;@@@@@@@@@# @;
@ @@@@@@@@@@, #@ @@@@ @# #@@@@@@@@@ @@
'@ @@@@@@@@@@ @, @``@` `@ @@@@@@@@@@, `@
@@ ;@@@@@@@@@+ @@ @@ @@ @@ @@@@@@@@@@@ @`
@, @@@@@@@@@@@ @. .@ @# @' @@@@@@@@@@@@ @@:
@ @@@@@@@@@@@@ @@ @@ ,@ :@'@@@@@@@@@@@@ :@@@`
@@# @@@@@@@@@@@@,@` ;@ '@@' @@ @@@@@:@@@@@@@@` @'
;@@@ ;@@@@@@@@@@@@@@ @'@@.,@@,@; @@@@@ #@@@@@@@` @
@ @@@@@@@@' @@@@@ #@@+ ;@@@.@@@@. @@@; @
@ .;+@ '@@@@#@'@ ;@@@@@@@ @
@ @@@@@@:@ +@;@@@@@ @
@` @@@@@@:@ #@@@@@@@@ @@@: @
@` .@@@# @@@@@@+@ @@@@@@+ @;+@+@@@@@@ @
@` @@@@@;;@ @@.@@@@@@# :@@@@@@` ;@@# .@ @@+
@` '@, @.@ @@@@@@@@' @@@@@@@@@ @@, +@ :@@@.
`@@` ;@ @@# +@@@@@@ @@@ @@@@@ @+ @ @+ @@
+@@@ `@ .@ @, @@@@@ @@@@@ `@ @ '@
#@: @ @@ #@@@@. @@@@@ @@ .@ @#
@ @ @ @@@@@ @@@@@ :@ @@ @`
@; @# +@ .@@@@@.@@@@# `@: @ @
#@ ,@ @@ @@@@@@@@@@ @# @@ , @@
@ @, @# @@@@@@@@# @` `@ @@@@@@;
@@@@@@@ :@ @ '@@@@@@@ +@ @# ;@
#;. @@ @@ @@ @@@@@@@.@ @@ @@ @;
`@ @+ @@ #@@@@@@@@@@@+ @+ @@ +@
@@ @@ #@ @@@@@@@@@@@@@ `@.@@ @:
@. @@.:@ @@@@@@@@@@@@@# '@# +@
'@ #@@, #@@@@@@@@@@@@@@ @;
@; @@@@@@@@@@@@@@@' `@`
`@ @@@@@@@@@@@@@@@@ #@
@+ '@@@@@@@@@@@@@@@@ @@
@@ '@@@@@@@@@@@: @:
@@ ' @@
+@; `@; @@@@ @@
:@+ ,@'@@ ;@@ @@# @@
.@@ :@; @@@ @@: .@@@
@@@; @@: `@@ '
@; ;@@ .@
'@ +@@@@@@@. @
@@ .@###@@@@@ @`
@; @@ @. @+
@` @ @@ ,@@
@@@. ;@ `@;@@@@@`
:@@@@@# @@@.
@@@@@ @@@@@@ @@@@@@ @@@ @@@ @@@@@ @@@@@ @@@@@@: @@@@@
@@@@@@@ @@@@@@@ @@@@@@ @@@ @@@ @@@@@@@ @@@@@@@ @@@@@@@: @@@@@
@@@ @@@ @@@@@@@ @@@@@@ @@@ @@@ @@@ @@@ @@@ @@@ @@ @@@ @@@@@
@@@ @@@ @@@ @@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@ @@ @@@
@@@ @@@ @@@@@@@ @@@ @@@@@@@ @@@ @@@ @@@ @@@ @@ @@ @@@
@@@ @@@ @@@@@@@ @@@@@ @@@@@@@ @@@ @@@ @@@ @@ @@ @@@@@
@@@ @@@ @@@@@@@ @@@@@ @@@@@@@ @@@ @@@ @@@ @@ @@ @@@@@
@@@ @@@ @@@@ @@@ @@ @@@@ @@@ @@@ @@@ @@@ @@ @@ @@@
@@@ @@@ @@@@ @@@ @@ @@@@ @@@ @@@ @@@ @@@ @@ @@ @@@
@@@ @@@ @@@@ @@@ @@ @@@@ @@@ @@@ @@@ @@@ @@ @@@ @@@
@@@@@@@ @@@@ @@@@@@ @@ @@@ @@@@@@@ @@@@@@@ @@@@@@@ @@@@@
@@@@@ @@@@ @@@@@@ @@ @@@ @@@@@ @@@@@ @@@@@@ @@@@@
*/
//=======================================================================================================//|
// //|
// BEGINNNING OF FILE //|
// //|
//=======================================================================================================//|
//=======================================================================================================//|
// //|
// TITLE: DS1302 Real Time Clock //|
// FILENAME: virtuabotixRTC.h //|
// PREPARED FOR: Virtuabotic, LLC //|
// PROGRAMMER(S): Arduino.cc user "Krodal" //|
// Joseph Datillo //|
// T. Daniel Murphy //|
// DEVELOPMENT DATE: 06 January 2014 //|
// COMPILER USED: Arduino 1.0.5 and xCode 5.0.2 (Version 5A3005) //|
// TARGET PLATFORM: Versilino and Arduino Microcontrollers //|
// //|
//=======================================================================================================//|
//=======================================================================================================//|
// //|
// Program Description Begin //|
// //|
//=======================================================================================================//|
// //|
// This file defines the functions declared within the associated header file. This allows for the //|
// structure of the Real Time Clock to be defined, set, updated, then accessed. //|
// //|
//=======================================================================================================//|
// //|
// Program Description End //|
// //|
//=======================================================================================================//|
//=======================================================================================================//|
// //|
// This is the Revision Section Begin //|
// //|
//=======================================================================================================//|
// //|
// Date Programmer Revisions Made //|
// //|
// XX June 2012 Krodal Original //|
// XX March 2013 Krodal Added bcd2bin, bin2bcd_h, and bin2bcd_l functions//|
// 07 January 2014 Joseph Datillo Converted file into library format. //|
// T. Daniel Murphy Added functions to allow for user implentation //|
// as a library, vice a stand alone program. //|
// Added function for converting time into current //|
// UNIX time. //|
// //|
//=======================================================================================================//|
// //|
// Revision Section End //|
// //|
//=======================================================================================================//|
//=======================================================================================================//|
// //|
// Acknowledgements Begin //|
// //|
//=======================================================================================================//|
// //|
// The original program was provided by Arduino.cc user Kodal on URL: //|
// http://playground.arduino.cc/Main/DS1302 //|
// //|
//=======================================================================================================//|
// //|
// Acknowledgements End //|
// //|
//=======================================================================================================//|
//=======================================================================================================//|
// //|
// Reference Links Begin //|
// //|
//=======================================================================================================//|
//|
// Datasheet: http://www.hobbytronics.co.uk/datasheets/DS1302.pdf //|
// GET UPDATES: https://www.virtuabotix.com/resources.php?product=versalino //|
//|
//=======================================================================================================//|
// //|
// Reference Links End //|
// //|
//=======================================================================================================//|
//=======================================================================================================//|
// //|
// Include files required for Program Function Begin //|
// //|
//=======================================================================================================//|
//|
#include "virtuabotixRTC.h" //|
//|
//=======================================================================================================//|
// //|
// Include files required for Program Function End //|
// //|
//=======================================================================================================//|
//=======================================================================================================//|
// //|
// Defines Required for Library Begin //|
// //|
//=======================================================================================================//|
//|
//+++++++++++++++++++++++++++++++++++++++++ Set Pin Assignments +++++++++++++++++++++++++++++++++++++++++//|
#define DS1302_SCLK_PIN SCLK // Arduino pin for the Serial Clock //|
#define DS1302_IO_PIN IO // Arduino pin for the Data I/O //|
#define DS1302_CE_PIN C_E // Arduino pin for the Chip Enable //|
//|
//++++++++++++++++++++++++++++++++++++++++++ Conversion Macros ++++++++++++++++++++++++++++++++++++++++++//|
// Macros to convert the bcd values of the registers to normal integer variables. The code uses //|
// seperate variables for the high byte and the low byte of the bcd, so these macros handle both bytes //|
// seperately. //|
#define bcd2bin(h,l) (((h)*10) + (l)) //|
#define bin2bcd_h(x) ((x)/10) //|
#define bin2bcd_l(x) ((x)%10) //|
//|
//+++++++++++++++++++++++++++++++++++++++++ Set Register Names ++++++++++++++++++++++++++++++++++++++++++//|
// Since the highest bit is always '1', the registers start at 0x80. If the register is read, the //|
// lowest bit should be '1'. //|
#define DS1302_SECONDS 0x80 //|
#define DS1302_MINUTES 0x82 //|
#define DS1302_HOURS 0x84 //|
#define DS1302_DATE 0x86 //|
#define DS1302_MONTH 0x88 //|
#define DS1302_DAY 0x8A //|
#define DS1302_YEAR 0x8C //|
#define DS1302_CLOCK_BURST 0xBE //|
#define DS1302_CLOCK_BURST_WRITE 0xBE //|
#define DS1302_CLOCK_BURST_READ 0xBF //|
#define DS1302_RAMSTART 0xC0 //|
#define DS1302_RAMEND 0xFC //|
#define DS1302_RAM_BURST 0xFE //|
#define DS1302_RAM_BURST_WRITE 0xFE //|
#define DS1302_RAM_BURST_READ 0xFF //|
//|
//+++++++++++++++++++++++++++++++++++++++++++++ Bit Defines +++++++++++++++++++++++++++++++++++++++++++++//|
// Defines for the bits, to be able to change between bit number and binary definition. By using the //|
// bit number, using the DS1302 is like programming an AVR microcontroller. But instead of using //|
// "(1<<X)", or "_BV(X)", the Arduino "bit(X)" is used. //|
#define DS1302_D0 0 //|
#define DS1302_D1 1 //|
#define DS1302_D2 2 //|
#define DS1302_D3 3 //|
#define DS1302_D4 4 //|
#define DS1302_D5 5 //|
#define DS1302_D6 6 //|
#define DS1302_D7 7 //|
//|
//++++++++++++++++++++++++++++++++++++++++++++++++ Random Bits ++++++++++++++++++++++++++++++++++++++++++//|
// Bit for reading (bit in address) //|
#define DS1302_READBIT DS1302_D0 // READBIT=1: read instruction //|
//|
// Bit for clock (0) or ram (1) area, called R/C-bit (bit in address) //|
#define DS1302_RC DS1302_D6 //|
//|
// Seconds Register //|
#define DS1302_CH DS1302_D7 // 1 = Clock Halt, 0 = start //|
//|
// Hour Register //|
#define DS1302_AM_PM DS1302_D5 // 0 = AM, 1 = PM //|
#define DS1302_12_24 DS1302 D7 // 0 = 24 hour, 1 = 12 hour //|
//|
// Enable Register //|
#define DS1302_WP DS1302_D7 // 1 = Write Protect, 0 = enabled //|
//|
// Trickle Register //|
#define DS1302_ROUT0 DS1302_D0 //|
#define DS1302_ROUT1 DS1302_D1 //|
#define DS1302_DS0 DS1302_D2 //|
#define DS1302_DS1 DS1302_D2 //|
#define DS1302_TCS0 DS1302_D4 //|
#define DS1302_TCS1 DS1302_D5 //|
#define DS1302_TCS2 DS1302_D6 //|
#define DS1302_TCS3 DS1302_D7 //|
//|
//=======================================================================================================//|
// //|
// Defines Required for Library End //|
// //|
//=======================================================================================================//|
//============================================================================================================//|
// //|
// virtuabotixRTC Class Functions Begin //|
// //|
//============================================================================================================//|
//=======================================================================================================//| |
// //| |
// virtuabotixRTC Function Begin //| |
// //| |
//=======================================================================================================//| |
// //| |
// This is the CONSTRUCTOR of the class. It sets the pins assignments for the component, as well as //| |
// the Clock Enable and the trickle charge disablement. //| |
// //| |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//| |
virtuabotixRTC::virtuabotixRTC(uint8_t inSCLK, uint8_t inIO, uint8_t inC_E) { //| |
SCLK = inSCLK; //| |
IO = inIO; //| |
C_E = inC_E; //| |
DS1302_write (DS1302_ENABLE, 0); // Sets the Clock Enable to ON. //| |
DS1302_write (DS1302_TRICKLE, 0x00); // Disable Trickle Charger. //| |
} //| |
//=======================================================================================================//| |
// //| |
// virtuabotixRTC Function End //| |
// //| |
//=======================================================================================================//| |
// |
// |
//=======================================================================================================//| |
// //| |
// ds1302_struct Structure Begin //| |
// //| |
//=======================================================================================================//| |
// //| |
// This is the structure of the rtc object. This assigns how many bits, and their location for each of //| |
// the elements within the time data. //| |
// //| |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//| |
//++++++++++++++++++++ This struct sets the format for the Time fields on the DS1302 ++++++++++++++++++++//| |
struct ds1302_struct { //| |
uint8_t Seconds:4; // 4-bits to hold low decimal digits 0-9 //| |
uint8_t Seconds10:3; // 3-bits to hold high decimal digit 0-5 //| |
uint8_t CH:1; // 1-bit to hold CH = Clock Halt //| |
uint8_t Minutes:4; // 4-bits to hold low decimal digits 0-9 //| |
uint8_t Minutes10:3; // 3-bits to hold high decimal digit 0-5 //| |
uint8_t reserved1:1; //| |
union { //| |
struct { // 24-hour section //| |
uint8_t Hour:4; // 4-bits to hold low decimal digits 0-9 //| |
uint8_t Hour10:2; // 2-bits to hold high decimal digits 0-2 //| |
uint8_t reserved2:1; //| |
uint8_t hour_12_24:1; // 1-bit to set 0 for 24 hour format //| |
} h24; //| |
struct { // 12 hour section //| |
uint8_t Hour:4; // 4-bits to hold low decimal digits 0-9 //| |
uint8_t Hour10:1; // 2-bits to hold high decimal digits 0-2 //| |
uint8_t AM_PM:1; // 1-bit to set AM or PM, 0 = AM, 1 = PM //| |
uint8_t reserved2:1; //| |
uint8_t hour_12_24:1; // 1-bit to set 1 for 12 hour format //| |
} h12; //| |
}; //| |
uint8_t Date:4; // 4-bits to hold low decimal digits 0-9 //| |
uint8_t Date10:2; // 2-bits to hold high decimal digits 0-3 //| |
uint8_t reserved3:2; //| |
uint8_t Month:4; // 4-bits to hold low decimal digits 0-9 //| |
uint8_t Month10:1; // 3-bits to hold high decimal digits 0-5 //| |
uint8_t reserved4:3; //| |
uint8_t Day:3; // 3-bits to hold decimal digit 1-7 //| |
uint8_t reserved5:5; //| |
uint8_t Year:4; // 4-bits to hold high decimal digit 20 //| |
uint8_t Year10:4; // 4-bits to hold high decimal digit 14 //| |
uint8_t reserved6:7; //| |
uint8_t WP:1; // WP = Write Protect //| |
}; //| |
//+++++++++++++++++++++++++++++++++ instantiation of the struct object ++++++++++++++++++++++++++++++++++//| |
ds1302_struct rtc; // Creates the Real Time Clock object //| |
//| |
//=======================================================================================================//| |
// //| |
// ds1302_struct Structure End //| |
// //| |
//=======================================================================================================//| |
// |
// |
//=======================================================================================================//| |
// //| |
// DS1302_clock_burst_read Function Begin //| |
// //| |
//=======================================================================================================//| |
// //| |
// This function reads 8 bytes clock data in burst mode from the DS1302. This function may be called //| |
// as the first function, also the pinMode is set. //| |
// //| |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//| |
void virtuabotixRTC::DS1302_clock_burst_read( uint8_t *p) { //| |
int i; //| |
_DS1302_start(); //| |
//| |
// Instead of the address, the CLOCK_BURST_READ command is issued the I/O-line is released for the data //| |
_DS1302_togglewrite( DS1302_CLOCK_BURST_READ, true); //| |
//| |
for( i=0; i<8; i++) { //| |
*p++ = _DS1302_toggleread(); //| |
} //| |
_DS1302_stop(); //| |
} //| |
//| |
//=======================================================================================================//| |
// //| |
// DS1302_clock_burst_read Function End //| |
// //| |
//=======================================================================================================//| |
// |
// |
//=======================================================================================================//| |
// //| |
// DS1302_clock_burst_write Function Begin //| |
// //| |
//=======================================================================================================//| |
// //| |
// This function writes 8 bytes clock data in burst mode to the DS1302. This function may be called //| |
// as the first function, also the pinMode is set. //| |
// //| |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//| |
void virtuabotixRTC::DS1302_clock_burst_write( uint8_t *p) { //| |
int i; //| |
_DS1302_start(); //| |
//| |
// Instead of the address, the CLOCK_BURST_WRITE command is issued. The I/O-line is not released //| |
_DS1302_togglewrite( DS1302_CLOCK_BURST_WRITE, false); //| |
//| |
for( i=0; i<8; i++) { //| |
// the I/O-line is not released //| |
_DS1302_togglewrite( *p++, false); //| |
} //| |
_DS1302_stop(); //| |
} //| |
//| |
//=======================================================================================================//| |
// //| |
// DS1302_clock_burst_write Function End //| |
// //| |
//=======================================================================================================//| |
// |
// |
//=======================================================================================================//| |
// //| |
// DS1302_read Function Begin //| |
// //| |
//=======================================================================================================//| |
// //| |
// This function reads a byte from the DS1302 (clock or ram). The address could be like "0x80" or //| |
// "0x81", the lowest bit is set anyway. This function may be called as the first function, also the //| |
// pinMode is set. //| |
// //| |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//| |
uint8_t virtuabotixRTC::DS1302_read(int address) { //| |
uint8_t data; //| |
//| |
// set lowest bit (read bit) in address //| |
bitSet( address, DS1302_READBIT); //| |
//| |
_DS1302_start(); //| |
// the I/O-line is released for the data //| |
_DS1302_togglewrite( address, true); //| |
data = _DS1302_toggleread(); //| |
_DS1302_stop(); //| |
//| |
return (data); //| |
} //| |
//| |
//=======================================================================================================//| |
// //| |
// DS1302_read Function End //| |
// //| |
//=======================================================================================================//| |
// |
// |
//=======================================================================================================//| |
// //| |
// DS1302_write Function Begin //| |
// //| |
//=======================================================================================================//| |
// //| |
// This function writes a byte to the DS1302 (clock or ram). The address could be like "0x80" or //| |
// "0x81", the lowest bit is cleared anyway. This function may be called as the first function, //| |
// also the pinMode is set. //| |
// //| |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//| |
void virtuabotixRTC::DS1302_write( int address, uint8_t data) { //| |
// clear lowest bit (read bit) in address //| |
bitClear( address, DS1302_READBIT); //| |
//| |
_DS1302_start(); //| |
//| |
// don't release the I/O-line //| |
_DS1302_togglewrite( address, false); //| |
//| |
// don't release the I/O-line //| |
_DS1302_togglewrite( data, false); //| |
_DS1302_stop(); //| |
} //| |
//| |
//=======================================================================================================//| |
// //| |
// DS1302_write Function End //| |
// //| |
//=======================================================================================================//| |
// |
// |
//=======================================================================================================//| |
// //| |
// _DS1302_start Function Begin //| |
// //| |
//=======================================================================================================//| |
// //| |
// A helper function to setup the start condition. An 'init' function is not used. But now the //| |
// pinMode is set every time. That's not a big deal, and it's valid. At startup, the pins of the //| |
// Arduino are high impedance. Since the DS1302 has pull-down resistors, the signals are low //| |
// (inactive) until the DS1302 is used. //| |
// //| |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//| |
void virtuabotixRTC::_DS1302_start( void ) { //| |
digitalWrite( DS1302_CE_PIN, LOW ); // default, not enabled //| |
pinMode( DS1302_CE_PIN, OUTPUT ); //| |
//| |
digitalWrite( DS1302_SCLK_PIN, LOW ); // default, clock low //| |
pinMode( DS1302_SCLK_PIN, OUTPUT ); //| |
//| |
pinMode( DS1302_IO_PIN, OUTPUT ); //| |
//| |
digitalWrite( DS1302_CE_PIN, HIGH ); // start the session //| |
delayMicroseconds( 4 ); // tCC = 4us //| |
} //| |
//| |
//=======================================================================================================//| |
// //| |
// _DS1302_start Function End //| |
// //| |
//=======================================================================================================//| |
// |
// |
//=======================================================================================================//| |
// //| |
// _DS1302_stop Function Begin //| |
// //| |
//=======================================================================================================//| |
// //| |
// A helper function to finish the communication. //| |
// //| |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//| |
void virtuabotixRTC::_DS1302_stop( void ) { //| |
// Set CE low //| |
digitalWrite( DS1302_CE_PIN, LOW ); //| |
//| |
delayMicroseconds( 4 ); // tCWH = 4us //| |
} //| |
//| |
//=======================================================================================================//| |
// //| |
// _DS1302_stop Function End //| |
// //| |
//=======================================================================================================//| |
// |
// |
//=======================================================================================================//| |
// //| |
// _DS1302_toggleread Function Begin //| |
// //| |
//=======================================================================================================//| |
// //| |
// A helper function for reading a byte with bit toggle. This function assumes that the SCLK is still //| |
// high. //| |
// //| |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//| |
uint8_t virtuabotixRTC::_DS1302_toggleread( void ) { //| |
uint8_t i, data; //| |
data = 0; //| |
//| |
// Issue a clock pulse for the next databit. If the 'togglewrite' function was used before this //| |
// function, the SCLK is already high. //| |
for( i = 0; i <= 7; i++ ) { //| |
digitalWrite( DS1302_SCLK_PIN, HIGH ); //| |
delayMicroseconds( 1) ; //| |
//| |
// Clock down, data is ready after some time. //| |
digitalWrite( DS1302_SCLK_PIN, LOW ); //| |
delayMicroseconds( 1 ); // tCL=1000ns, tCDD=800ns //| |
//| |
// read bit, and set it in place in 'data' variable //| |
bitWrite( data, i, digitalRead( DS1302_IO_PIN ) ); //| | //| |
} //| |
return( data ); //| |
} //| |
//| |
//=======================================================================================================//| |
// //| |
// _DS1302_toggleread Function End //| |
// //| |
//=======================================================================================================//| |
// |
// |
//=======================================================================================================//| |
// //| |
// _DS1302_togglewrite Function Begin //| |
// //| |
//=======================================================================================================//| |
// //| |
// A helper function for writing a byte with bit toggle. The 'release' parameter is for a read after //| |
// this write. It will release the I/O-line and will keep the SCLK high. //| |
// //| |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//| |
void virtuabotixRTC::_DS1302_togglewrite( uint8_t data, uint8_t release) { //| |
int i; //| |
//| |
for( i = 0; i <= 7; i++ ) { //| |
// set a bit of the data on the I/O-line //| |
digitalWrite( DS1302_IO_PIN, bitRead(data, i) ); //| |
delayMicroseconds( 1 ); // tDC = 200ns //| |
//| |
// clock up, data is read by DS1302 //| |
digitalWrite( DS1302_SCLK_PIN, HIGH ); //| |
delayMicroseconds( 1 ); // tCH = 1000ns, tCDH = 800ns //| |
//| |
// If this write is followed by a read, the I/O-line should be released after the last bit, before the //| |
// clock line is made low. This is according the datasheet. I have seen other programs that don't //| |
// release the I/O-line at this moment, and that could cause a shortcut spike on the I/O-line. //| |
if( release && i == 7 ) { //| |
pinMode( DS1302_IO_PIN, INPUT ); //| |
} else { //| |
digitalWrite( DS1302_SCLK_PIN, LOW ); //| |
delayMicroseconds( 1 ); // tCL=1000ns, tCDD=800ns //| |
} //| |
} //| |
} //| |
//| |
//=======================================================================================================//| |
// //| |
// _DS1302_togglewrite Function End //| |
// //| |
//=======================================================================================================//| |
// |
// |
//=======================================================================================================//| |
// //| |
// setDS1302Time Function Begin //| |
// //| |
//=======================================================================================================//| |
// //| |
// A function to set the initial time within the DS1302 Real Time Clock. //| |
// //| |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//| |
void virtuabotixRTC::setDS1302Time(uint8_t seconds, uint8_t minutes, uint8_t hours, uint8_t dayofweek, //| |
uint8_t dayofmonth, uint8_t month, int year) { //| |
//| |
//+++++++++++++++++++++++++++++++++++++++ Variable Declarations +++++++++++++++++++++++++++++++++++++++++//| |
seconds = seconds; //| |
minutes = minutes; //| |
hours = hours; //| |
dayofweek = dayofweek; //| |
dayofmonth = dayofmonth; //| |
month = month; //| |
year = year; //| |
//| |
//++++++++++++++++++++ This will fill the output array of the rtc object with ZEROs +++++++++++++++++++++//| |
memset ((char *) &rtc, 0, sizeof(rtc)); //| |
//| |
//+++++++++++++++++++ This contains the conversion to BCD, and assigns to the elements ++++++++++++++++++//| |
rtc.Seconds = bin2bcd_l( seconds); //| |
rtc.Seconds10 = bin2bcd_h( seconds); //| |
rtc.CH = 0; // 1 for Clock Halt, 0 to run //| |
rtc.Minutes = bin2bcd_l( minutes); //| |
rtc.Minutes10 = bin2bcd_h( minutes); //| |
rtc.h24.Hour = bin2bcd_l( hours); //| |
rtc.h24.Hour10 = bin2bcd_h( hours); //| |
rtc.h24.hour_12_24 = 0; // 0 for 24 hour format //| |
rtc.Date = bin2bcd_l( dayofmonth); //| |
rtc.Date10 = bin2bcd_h( dayofmonth); //| |
rtc.Month = bin2bcd_l( month); //| |
rtc.Month10 = bin2bcd_h( month); //| |
rtc.Day = dayofweek; //| |
rtc.Year = bin2bcd_l( year - 2000); //| |
rtc.Year10 = bin2bcd_h( year - 2000); //| |
rtc.WP = 0; //| |
//| |
//+++++++++++++++++++++++++++++++ Write all clock data at once (burst mode) +++++++++++++++++++++++++++++//| |
DS1302_clock_burst_write( (uint8_t *) &rtc); //| |
} //| |
//| |
//=======================================================================================================//| |
// //| |
// setDS1302Time Function End //| |
// //| |
//=======================================================================================================//| |
// |
// |
//=======================================================================================================//| |
// //| |
// updateTime Function Begin //| |
// //| |
//=======================================================================================================//| |
// //| |
// A function that updates the time. All other functions that access the time after the initial set //| |
// will call this function for the actual updating time. This is the only function that updates the //| |
// time to the current data. //| |
// //| |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//| |
void virtuabotixRTC::updateTime() { //| |
//| |
DS1302_clock_burst_read( (uint8_t *) &rtc); // Read all clock data at once (burst mode). //| |
//| |
char buffer[80]; // the code uses 70 characters. //| |
seconds = ( rtc.Seconds10 * 10 ) + rtc. Seconds; //| |
minutes = ( rtc. Minutes10 * 10 ) + rtc.Minutes; //| |
hours = ( rtc.h24.Hour10 * 10 ) + rtc.h24.Hour; //| |
dayofweek = ( rtc.Day ); //| |
dayofmonth = ( rtc.Date10 * 10 ) + rtc.Date; //| |
month = ( rtc.Month10 * 10 ) + rtc.Month; //| |
year = ( rtc.Year10 * 10 ) + rtc.Year + 2000; //| |
} //| |
//| |
//=======================================================================================================//| |
// //| |
// updateTime Function End //| |
// //| |
//=======================================================================================================//| |
// |
// |
//============================================================================================================//|
// //|
// virtuabotixRTC Class Functions End //|
// //|
//============================================================================================================//|