FIXED - All callback functions now work properly
	FIXED - Oscillator startup so that it resets the status register
	FIXED - All alarm mode bitmasks
	MODIF - clockStart() from macro to function
	MODIF - clockSave() to reset the clock so that the status flags are reset
twiLCD:
	MODIF - setClrscreenCallback() renamed clrsSetCallback()

git-svn-id: svn+ssh://oldsvn/home/mlalondesvn/svn/cral@9 3ee9b42a-b53c-0410-a25e-f0b6218d5d5b
master
mlalondesvn 17 years ago
parent aef86bead9
commit 6f7bf7408b

@ -28,7 +28,7 @@
#endif #endif
// Uncomment this to use integrity check functions // Uncomment this to use integrity check functions
//#define DS1337_USE_OSC_INTEGRITY #define DS1337_USE_OSC_INTEGRITY
// Uncomment this to support square wave output // Uncomment this to support square wave output
// If this is enabled, alarm 2 will output it's interrupt on INTA // If this is enabled, alarm 2 will output it's interrupt on INTA

@ -35,6 +35,8 @@ DS1337 RTC = DS1337();
#ifdef WIRE_LIB_SCAN_MOD #ifdef WIRE_LIB_SCAN_MOD
int8_t DS1337::Init(void) int8_t DS1337::Init(void)
{ {
delay(500); //Account for the crystal startup time
// Check address and returns false is there is an error // Check address and returns false is there is an error
if (Wire.checkAddress(DS1337_WADDR)) { if (Wire.checkAddress(DS1337_WADDR)) {
// Possibly set the default registers here // Possibly set the default registers here
@ -42,17 +44,13 @@ int8_t DS1337::Init(void)
clockExists = true; clockExists = true;
// Start the oscillator if need // Start the oscillator if need
if (getRegisterBit(DS1337_SP, DS1337_SP_EOSC)) if (getRegisterBit(DS1337_SP, DS1337_SP_EOSC) || getRegisterBit(DS1337_STATUS, DS1337_STATUS_OSF))
{ {
if (getRegisterBit(DS1337_STATUS, DS1337_STATUS_OSF)) clockStart();
{
unsetRegister(DS1337_STATUS, DS1337_STATUS_OSF);
}
#if defined(DS1337_USE_ALARM_INTERRUPTS) && !defined(DS1337_USE_SQW_OUTPUT) #if defined(DS1337_USE_ALARM_INTERRUPTS) && !defined(DS1337_USE_SQW_OUTPUT)
setRegister(DS1337_SP, DS1337_SQW_INTCN); setRegister(DS1337_SP, DS1337_SQW_INTCN);
#endif #endif
clockStart();
} }
return DS1337_WADDR; return DS1337_WADDR;
@ -63,25 +61,17 @@ int8_t DS1337::Init(void)
#else #else
int8_t DS1337::Init(void) int8_t DS1337::Init(void)
{ {
// Account for the crystal power up! delay(500); //Account for the crystal startup time
delay(250);
clockExists = true; clockExists = true;
// Start the oscillator if need // Start the oscillator if need
if (getRegisterBit(DS1337_SP, DS1337_SP_EOSC)) if (getRegisterBit(DS1337_SP, DS1337_SP_EOSC) || getRegisterBit(DS1337_STATUS, DS1337_STATUS_OSF))
{ {
if (getRegisterBit(DS1337_STATUS, DS1337_STATUS_OSF))
{
unsetRegister(DS1337_STATUS, DS1337_STATUS_OSF);
}
clockStart(); clockStart();
return DS1337_WADDR;
} }
return -1; return DS1337_WADDR;
} }
#endif #endif
@ -122,6 +112,15 @@ uint8_t DS1337::getRegister(uint8_t registerNumber)
return Wire.receive(); return Wire.receive();
} }
void DS1337::clockStart(void)
{
// Start the oscillator
unsetRegister(DS1337_SP, DS1337_SP_EOSC);
// Reset the status register
writeRegister(DS1337_STATUS, B00000000);
}
void DS1337::clockRead(void) void DS1337::clockRead(void)
{ {
if (!clockExists) return; if (!clockExists) return;
@ -144,6 +143,9 @@ void DS1337::clockSave(void)
{ {
if (!clockExists) return; if (!clockExists) return;
// Stop the clock
clockStop();
Wire.beginTransmission(DS1337_WADDR); Wire.beginTransmission(DS1337_WADDR);
Wire.send(0x00); Wire.send(0x00);
@ -154,7 +156,8 @@ void DS1337::clockSave(void)
Wire.endTransmission(); Wire.endTransmission();
delay(10); // Restart the oscillator
clockStart();
} }
void DS1337::clockGet(uint16_t *rtc) void DS1337::clockGet(uint16_t *rtc)
@ -452,14 +455,8 @@ void DS1337::clockSetWithUTS(uint32_t unixTimeStamp, boolean correctedTime)
// Serial.print(tt, DEC); // Serial.print(tt, DEC);
// SPrint(" "); // SPrint(" ");
// Stop the clock
//clockStop(); // Uneeded with the ds1337
// Save buffer to the RTC // Save buffer to the RTC
clockSave(); clockSave();
// Restart the oscillator
//clockStart(); // Uneeded with the ds1337
} }
#endif #endif
@ -498,13 +495,13 @@ void DS1337::alarmChecks(void)
if (getRegisterBit(DS1337_STATUS, DS1337_STATUS_A1F)) if (getRegisterBit(DS1337_STATUS, DS1337_STATUS_A1F))
{ {
unsetRegister(DS1337_STATUS, DS1337_STATUS_A1F); delay(10); unsetRegister(DS1337_STATUS, DS1337_STATUS_A1F); delay(10);
if (DS1337callbackFunc) DS1337callbackFunc[0](); if (DS1337callbackFunc[0]) DS1337callbackFunc[0]();
} }
if (getRegisterBit(DS1337_STATUS, DS1337_STATUS_A2F)) if (getRegisterBit(DS1337_STATUS, DS1337_STATUS_A2F))
{ {
unsetRegister(DS1337_STATUS, DS1337_STATUS_A2F); delay(10); unsetRegister(DS1337_STATUS, DS1337_STATUS_A2F); delay(10);
if (DS1337callbackFunc) DS1337callbackFunc[1](); if (DS1337callbackFunc[1]) DS1337callbackFunc[1]();
} }
return; return;
@ -522,28 +519,28 @@ void DS1337::alarmSet(uint8_t timeSection, uint8_t timeValue)
case DS1337_SEC: case DS1337_SEC:
if(alarmId == false && timeValue<60) if(alarmId == false && timeValue<60)
{ {
rtc_alarm[DS1337_SEC] = binToBcd(timeValue) & ~DS1337_ALARM_MASK | (rtc_alarm[DS1337_SEC] & DS1337_ALARM_MASK); rtc_alarm[DS1337_SEC] = (binToBcd(timeValue) & ~DS1337_ALARM_MASK) | (rtc_alarm[DS1337_SEC] & DS1337_ALARM_MASK);
} }
break; break;
case DS1337_MIN: case DS1337_MIN:
if(timeValue < 60) if(timeValue < 60)
{ {
rtc_alarm[DS1337_MIN] = binToBcd(timeValue) & ~DS1337_ALARM_MASK | (rtc_alarm[DS1337_MIN] & DS1337_ALARM_MASK); rtc_alarm[DS1337_MIN] = (binToBcd(timeValue) & ~DS1337_ALARM_MASK) | (rtc_alarm[DS1337_MIN] & DS1337_ALARM_MASK);
} }
break; break;
case DS1337_HR: case DS1337_HR:
if(timeValue < 24) if(timeValue < 24)
{ {
rtc_alarm[DS1337_HR] = binToBcd(timeValue) & ~DS1337_ALARM_MASK | (rtc_alarm[DS1337_HR] & DS1337_ALARM_MASK); rtc_alarm[DS1337_HR] = (binToBcd(timeValue) & ~DS1337_ALARM_MASK) | (rtc_alarm[DS1337_HR] & DS1337_ALARM_MASK);
} }
break; break;
case DS1337_DOW: case DS1337_DOW:
if(timeValue < 31) if(timeValue < 31)
{ {
rtc_alarm[DS1337_DOW] = binToBcd(timeValue) & ~DS1337_ALARM_MASK & ~DS1337_ALARM_DT_MASK | (rtc_alarm[DS1337_DOW] & DS1337_ALARM_MASK) | (rtc_alarm[DS1337_DOW] & DS1337_ALARM_DT_MASK); rtc_alarm[DS1337_DOW] = (binToBcd(timeValue) & ~DS1337_ALARM_MASK & ~DS1337_ALARM_DT_MASK) | (rtc_alarm[DS1337_DOW] & DS1337_ALARM_MASK) | (rtc_alarm[DS1337_DOW] & DS1337_ALARM_DT_MASK);
} }
break; break;
@ -552,15 +549,19 @@ void DS1337::alarmSet(uint8_t timeSection, uint8_t timeValue)
if (alarmId) { if (alarmId) {
timeValue = (timeValue>>1)<<1; timeValue = (timeValue>>1)<<1;
} else } else
// A1M1
rtc_alarm[DS1337_SEC] = (rtc_alarm[DS1337_SEC] & ~DS1337_ALARM_MASK) | DS1337_ALARM_MASK & timeValue<<7; rtc_alarm[DS1337_SEC] = (rtc_alarm[DS1337_SEC] & ~DS1337_ALARM_MASK) | DS1337_ALARM_MASK & timeValue<<7;
// AM2
rtc_alarm[DS1337_MIN] = (rtc_alarm[DS1337_MIN] & ~DS1337_ALARM_MASK) | DS1337_ALARM_MASK & timeValue<<6; rtc_alarm[DS1337_MIN] = (rtc_alarm[DS1337_MIN] & ~DS1337_ALARM_MASK) | DS1337_ALARM_MASK & timeValue<<6;
// AM3
rtc_alarm[DS1337_HR] = (rtc_alarm[DS1337_HR] & ~DS1337_ALARM_MASK) | DS1337_ALARM_MASK & timeValue<<5; rtc_alarm[DS1337_HR] = (rtc_alarm[DS1337_HR] & ~DS1337_ALARM_MASK) | DS1337_ALARM_MASK & timeValue<<5;
// AM4
rtc_alarm[DS1337_DOW] = (rtc_alarm[DS1337_DOW] & ~DS1337_ALARM_MASK) | DS1337_ALARM_MASK & timeValue<<4; rtc_alarm[DS1337_DOW] = (rtc_alarm[DS1337_DOW] & ~DS1337_ALARM_MASK) | DS1337_ALARM_MASK & timeValue<<4;
if (timeValue == DS1337_ALARM_MCH_DOWHRMINSEC) if (timeValue == DS1337_ALARM_MCH_DOWHRMINSEC || timeValue == DS1337_ALARM_MCH_DOWHRMIN)
{ {
rtc_alarm[DS1337_DOW] = rtc_alarm[DS1337_DOW] & ~DS1337_ALARM_DT_MASK | DS1337_ALARM_DT_MASK; rtc_alarm[DS1337_DOW] = (rtc_alarm[DS1337_DOW] & ~DS1337_ALARM_DT_MASK) | DS1337_ALARM_DT_MASK;
} }
} }
@ -568,7 +569,7 @@ void DS1337::alarmSet(uint8_t timeSection, uint8_t timeValue)
case DS1337_ALARM_DT: case DS1337_ALARM_DT:
{ {
rtc_alarm[DS1337_DOW] = rtc_alarm[DS1337_DOW] & ~DS1337_ALARM_DT_MASK | (timeValue == 1 ? DS1337_ALARM_DT_MASK : 0); rtc_alarm[DS1337_DOW] = (rtc_alarm[DS1337_DOW] & ~DS1337_ALARM_DT_MASK) | (timeValue == 1 ? DS1337_ALARM_DT_MASK : 0);
} }
break; break;
} // end switch } // end switch
@ -664,12 +665,9 @@ void DS1337::clockIntegrityCallback(void (*userFunc)(void))
void DS1337::clockChecks(void) void DS1337::clockChecks(void)
{ {
#ifdef DS1337_USE_OSC_INTEGRITY #ifdef DS1337_USE_OSC_INTEGRITY
if (getRegisterBit(DS1337_STATUS, DS1337_STATUS_OSF)) if (getRegisterBit(DS1337_STATUS, DS1337_STATUS_OSF) && !getRegisterBit(DS1337_SP, DS1337_SP_EOSC))
{ {
clockStop(); clockStop();
unsetRegister(DS1337_STATUS, DS1337_STATUS_OSF);
unsetRegister(DS1337_STATUS, DS1337_STATUS_A1F);
unsetRegister(DS1337_STATUS, DS1337_STATUS_A2F);
if (DS1337callbackFunc[2]) DS1337callbackFunc[2](); if (DS1337callbackFunc[2]) DS1337callbackFunc[2]();

@ -90,13 +90,23 @@
#define DS1337_ALARM_DT_DOW true #define DS1337_ALARM_DT_DOW true
#define DS1337_ALARM_DT_DATE false #define DS1337_ALARM_DT_DATE false
#define DS1337_ALARM_PER_SEC B00001111 #define DS1337_ALARM_PERA B00001111
#define DS1337_ALARM_PER_MIN B00000111 /* Used for alarm 2 only*/ #define DS1337_ALARM_PER_SEC DS1337_ALARM_PERA /* Used for alarm 1 only*/
#define DS1337_ALARM_MCH_SEC B00001110 /* Used for alarm 1 only */ #define DS1337_ALARM_PER_MIN DS1337_ALARM_PERA /* Used for alarm 2 only*/
#define DS1337_ALARM_MCH_MINSEC B00001100
#define DS1337_ALARM_MCH_HRMINSEC B00001000 /* Used for alarm 1 only */ #define DS1337_ALARM_MCH_SEC B00001110 /* Used for alarm 1 only */
#define DS1337_ALARM_MCH_DATEHRMINSEC B00000000 #define DS1337_ALARM_MCH_MIN B00001100 /* Used for alarm 2 only */
#define DS1337_ALARM_MCH_DOWHRMINSEC B10000000
#define DS1337_ALARM_MCH_MINSEC B00001100 /* Used for alarm 1 only */
#define DS1337_ALARM_MCH_HRMIN B00001000 /* Used for alarm 2 only */
#define DS1337_ALARM_MCH_HRMINSEC B00001000 /* Used for alarm 1 only */
#define DS1337_ALARM_MCH_DATEHRMINSEC B00000000 /* Used for alarm 1 only */
#define DS1337_ALARM_MCH_DATEHRMIN B00000000 /* Used for alarm 2 only */
#define DS1337_ALARM_MCH_DOWHRMINSEC B10000000 /* Used for alarm 1 only */
#define DS1337_ALARM_MCH_DOWHRMIN B10000000 /* Used for alarm 2 only */
// Alarm mode masks // Alarm mode masks
#define DS1337_ALARM2_MODE_MASK B00001000 #define DS1337_ALARM2_MODE_MASK B00001000
@ -124,8 +134,6 @@
/** /**
* Macros * Macros
**/ **/
// Starts the oscillator and delay a little to account for long oscillator startup times
#define clockStart() unsetRegister(DS1337_SP, DS1337_SP_EOSC); delay(500);
#define clockStop() setRegister(DS1337_SP, DS1337_SP_EOSC) #define clockStop() setRegister(DS1337_SP, DS1337_SP_EOSC)
#define getRegisterSP() getRegister(DS1337_SP) #define getRegisterSP() getRegister(DS1337_SP)
@ -213,6 +221,11 @@ class DS1337
* If the I2C scan mod is available, it'll verify the RTC is reachable * If the I2C scan mod is available, it'll verify the RTC is reachable
**/ **/
int8_t Init(void); int8_t Init(void);
/**
* clockStart: starts the oscillator and reset the fault flag
**/
void clockStart(void);
#ifdef DS1337_USE_OSC_INTEGRITY #ifdef DS1337_USE_OSC_INTEGRITY
/** /**
* chockSetIntegrityCallback: allow setting the callback function * chockSetIntegrityCallback: allow setting the callback function

@ -17,25 +17,21 @@ extern "C" {
#include "SPrint/staticPrint.h" #include "SPrint/staticPrint.h"
#ifndef CI
#define CI(reg,bit) (reg & ~(bit))
#endif
#ifndef SI
#define SI(reg,bit) (reg | bit)
#endif
#ifndef BV #ifndef BV
#define BV(bit) (1<<(bit)) #define BV(bit) (1<<(bit))
#endif #endif
#ifndef cbi #ifndef cbi
#define cbi(reg,bit) reg &= ~(BV(bit)) #define cbi(reg,bit) reg &= ~(BV(bit))
#endif #endif
#ifndef sbi #ifndef sbi
#define sbi(reg,bit) reg |= (BV(bit)) #define sbi(reg,bit) reg |= (BV(bit))
#endif #endif
#ifndef CI
#define CI(reg,bit) (reg & ~(bit))
#endif
#ifndef SI
#define SI(reg,bit) (reg | bit)
#endif
#ifndef cli #ifndef cli
#define cli() __asm__ __volatile__ ("cli" ::) #define cli() __asm__ __volatile__ ("cli" ::)
#endif #endif

@ -425,7 +425,7 @@ void twiLCD::printInteger(int16_t integer)
#endif #endif
#ifdef LCD_USE_CLRSCREEN_CALLBACK #ifdef LCD_USE_CLRSCREEN_CALLBACK
void twiLCD::setClrscreenCallback(void (*userFunc)(void)) void twiLCD::clrsSetCallback(void (*userFunc)(void))
{ {
twiLCDcallbackFunc[0] = userFunc; twiLCDcallbackFunc[0] = userFunc;
} }

@ -74,7 +74,7 @@
void printString_P(const char *); void printString_P(const char *);
#ifdef LCD_USE_CLRSCREEN_CALLBACK #ifdef LCD_USE_CLRSCREEN_CALLBACK
void setClrscreenCallback(void (*)(void)); void clrsSetCallback(void (*)(void));
#endif #endif
/** /**
* These function are only available on the mega168 for space reasons * These function are only available on the mega168 for space reasons

Loading…
Cancel
Save