- Timestamp:
- 10/17/07 21:24:59 (15 months ago)
- Location:
- ds1337
- Files:
-
- 2 modified
-
ds1337.cpp (modified) (17 diffs)
-
ds1337.h (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
ds1337/ds1337.cpp
r7 r9 36 36 int8_t DS1337::Init(void) 37 37 { 38 delay(500); //Account for the crystal startup time 39 38 40 // Check address and returns false is there is an error 39 41 if (Wire.checkAddress(DS1337_WADDR)) { … … 43 45 44 46 // Start the oscillator if need 45 if (getRegisterBit(DS1337_SP, DS1337_SP_EOSC)) 46 { 47 if (getRegisterBit(DS1337_STATUS, DS1337_STATUS_OSF)) 48 { 49 unsetRegister(DS1337_STATUS, DS1337_STATUS_OSF); 50 } 47 if (getRegisterBit(DS1337_SP, DS1337_SP_EOSC) || getRegisterBit(DS1337_STATUS, DS1337_STATUS_OSF)) 48 { 49 clockStart(); 50 51 51 #if defined(DS1337_USE_ALARM_INTERRUPTS) && !defined(DS1337_USE_SQW_OUTPUT) 52 52 setRegister(DS1337_SP, DS1337_SQW_INTCN); 53 53 #endif 54 55 clockStart();56 54 } 57 55 … … 64 62 int8_t DS1337::Init(void) 65 63 { 66 // Account for the crystal power up! 67 delay(250); 64 delay(500); //Account for the crystal startup time 68 65 69 66 clockExists = true; 70 67 71 68 // Start the oscillator if need 72 if (getRegisterBit(DS1337_SP, DS1337_SP_EOSC)) 73 { 74 if (getRegisterBit(DS1337_STATUS, DS1337_STATUS_OSF)) 75 { 76 unsetRegister(DS1337_STATUS, DS1337_STATUS_OSF); 77 } 78 69 if (getRegisterBit(DS1337_SP, DS1337_SP_EOSC) || getRegisterBit(DS1337_STATUS, DS1337_STATUS_OSF)) 70 { 79 71 clockStart(); 80 81 return DS1337_WADDR; 82 } 83 84 return -1; 72 } 73 74 return DS1337_WADDR; 85 75 } 86 76 #endif … … 123 113 } 124 114 115 void DS1337::clockStart(void) 116 { 117 // Start the oscillator 118 unsetRegister(DS1337_SP, DS1337_SP_EOSC); 119 120 // Reset the status register 121 writeRegister(DS1337_STATUS, B00000000); 122 } 123 125 124 void DS1337::clockRead(void) 126 125 { … … 145 144 if (!clockExists) return; 146 145 146 // Stop the clock 147 clockStop(); 148 147 149 Wire.beginTransmission(DS1337_WADDR); 148 150 Wire.send(0x00); … … 155 157 Wire.endTransmission(); 156 158 157 delay(10); 159 // Restart the oscillator 160 clockStart(); 158 161 } 159 162 … … 268 271 break; 269 272 } // end switch 270 273 271 274 clockSave(); 272 275 } … … 453 456 // SPrint(" "); 454 457 455 // Stop the clock456 //clockStop(); // Uneeded with the ds1337457 458 458 // Save buffer to the RTC 459 459 clockSave(); 460 461 // Restart the oscillator462 //clockStart(); // Uneeded with the ds1337463 460 } 464 461 #endif … … 499 496 { 500 497 unsetRegister(DS1337_STATUS, DS1337_STATUS_A1F); delay(10); 501 if (DS1337callbackFunc ) DS1337callbackFunc[0]();498 if (DS1337callbackFunc[0]) DS1337callbackFunc[0](); 502 499 } 503 500 … … 505 502 { 506 503 unsetRegister(DS1337_STATUS, DS1337_STATUS_A2F); delay(10); 507 if (DS1337callbackFunc ) DS1337callbackFunc[1]();504 if (DS1337callbackFunc[1]) DS1337callbackFunc[1](); 508 505 } 509 506 … … 523 520 if(alarmId == false && timeValue<60) 524 521 { 525 rtc_alarm[DS1337_SEC] = binToBcd(timeValue) & ~DS1337_ALARM_MASK| (rtc_alarm[DS1337_SEC] & DS1337_ALARM_MASK);522 rtc_alarm[DS1337_SEC] = (binToBcd(timeValue) & ~DS1337_ALARM_MASK) | (rtc_alarm[DS1337_SEC] & DS1337_ALARM_MASK); 526 523 } 527 524 break; … … 530 527 if(timeValue < 60) 531 528 { 532 rtc_alarm[DS1337_MIN] = binToBcd(timeValue) & ~DS1337_ALARM_MASK| (rtc_alarm[DS1337_MIN] & DS1337_ALARM_MASK);529 rtc_alarm[DS1337_MIN] = (binToBcd(timeValue) & ~DS1337_ALARM_MASK) | (rtc_alarm[DS1337_MIN] & DS1337_ALARM_MASK); 533 530 } 534 531 break; … … 537 534 if(timeValue < 24) 538 535 { 539 rtc_alarm[DS1337_HR] = binToBcd(timeValue) & ~DS1337_ALARM_MASK| (rtc_alarm[DS1337_HR] & DS1337_ALARM_MASK);536 rtc_alarm[DS1337_HR] = (binToBcd(timeValue) & ~DS1337_ALARM_MASK) | (rtc_alarm[DS1337_HR] & DS1337_ALARM_MASK); 540 537 } 541 538 break; … … 544 541 if(timeValue < 31) 545 542 { 546 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);543 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); 547 544 } 548 545 break; … … 553 550 timeValue = (timeValue>>1)<<1; 554 551 } else 552 // A1M1 555 553 rtc_alarm[DS1337_SEC] = (rtc_alarm[DS1337_SEC] & ~DS1337_ALARM_MASK) | DS1337_ALARM_MASK & timeValue<<7; 556 554 555 // AM2 557 556 rtc_alarm[DS1337_MIN] = (rtc_alarm[DS1337_MIN] & ~DS1337_ALARM_MASK) | DS1337_ALARM_MASK & timeValue<<6; 557 // AM3 558 558 rtc_alarm[DS1337_HR] = (rtc_alarm[DS1337_HR] & ~DS1337_ALARM_MASK) | DS1337_ALARM_MASK & timeValue<<5; 559 // AM4 559 560 rtc_alarm[DS1337_DOW] = (rtc_alarm[DS1337_DOW] & ~DS1337_ALARM_MASK) | DS1337_ALARM_MASK & timeValue<<4; 560 561 561 if (timeValue == DS1337_ALARM_MCH_DOWHRMINSEC )562 if (timeValue == DS1337_ALARM_MCH_DOWHRMINSEC || timeValue == DS1337_ALARM_MCH_DOWHRMIN) 562 563 { 563 rtc_alarm[DS1337_DOW] = rtc_alarm[DS1337_DOW] & ~DS1337_ALARM_DT_MASK| DS1337_ALARM_DT_MASK;564 rtc_alarm[DS1337_DOW] = (rtc_alarm[DS1337_DOW] & ~DS1337_ALARM_DT_MASK) | DS1337_ALARM_DT_MASK; 564 565 } 565 566 } … … 569 570 case DS1337_ALARM_DT: 570 571 { 571 rtc_alarm[DS1337_DOW] = rtc_alarm[DS1337_DOW] & ~DS1337_ALARM_DT_MASK| (timeValue == 1 ? DS1337_ALARM_DT_MASK : 0);572 rtc_alarm[DS1337_DOW] = (rtc_alarm[DS1337_DOW] & ~DS1337_ALARM_DT_MASK) | (timeValue == 1 ? DS1337_ALARM_DT_MASK : 0); 572 573 } 573 574 break; … … 665 666 { 666 667 #ifdef DS1337_USE_OSC_INTEGRITY 667 if (getRegisterBit(DS1337_STATUS, DS1337_STATUS_OSF) )668 if (getRegisterBit(DS1337_STATUS, DS1337_STATUS_OSF) && !getRegisterBit(DS1337_SP, DS1337_SP_EOSC)) 668 669 { 669 670 clockStop(); 670 unsetRegister(DS1337_STATUS, DS1337_STATUS_OSF);671 unsetRegister(DS1337_STATUS, DS1337_STATUS_A1F);672 unsetRegister(DS1337_STATUS, DS1337_STATUS_A2F);673 671 674 672 if (DS1337callbackFunc[2]) DS1337callbackFunc[2](); -
ds1337/ds1337.h
r8 r9 91 91 #define DS1337_ALARM_DT_DATE false 92 92 93 #define DS1337_ALARM_PER_SEC B00001111 94 #define DS1337_ALARM_PER_MIN B00000111 /* Used for alarm 2 only*/ 95 #define DS1337_ALARM_MCH_SEC B00001110 /* Used for alarm 1 only */ 96 #define DS1337_ALARM_MCH_MINSEC B00001100 97 #define DS1337_ALARM_MCH_HRMINSEC B00001000 /* Used for alarm 1 only */ 98 #define DS1337_ALARM_MCH_DATEHRMINSEC B00000000 99 #define DS1337_ALARM_MCH_DOWHRMINSEC B10000000 93 #define DS1337_ALARM_PERA B00001111 94 #define DS1337_ALARM_PER_SEC DS1337_ALARM_PERA /* Used for alarm 1 only*/ 95 #define DS1337_ALARM_PER_MIN DS1337_ALARM_PERA /* Used for alarm 2 only*/ 96 97 #define DS1337_ALARM_MCH_SEC B00001110 /* Used for alarm 1 only */ 98 #define DS1337_ALARM_MCH_MIN B00001100 /* Used for alarm 2 only */ 99 100 #define DS1337_ALARM_MCH_MINSEC B00001100 /* Used for alarm 1 only */ 101 #define DS1337_ALARM_MCH_HRMIN B00001000 /* Used for alarm 2 only */ 102 103 #define DS1337_ALARM_MCH_HRMINSEC B00001000 /* Used for alarm 1 only */ 104 105 #define DS1337_ALARM_MCH_DATEHRMINSEC B00000000 /* Used for alarm 1 only */ 106 #define DS1337_ALARM_MCH_DATEHRMIN B00000000 /* Used for alarm 2 only */ 107 108 #define DS1337_ALARM_MCH_DOWHRMINSEC B10000000 /* Used for alarm 1 only */ 109 #define DS1337_ALARM_MCH_DOWHRMIN B10000000 /* Used for alarm 2 only */ 100 110 101 111 // Alarm mode masks … … 125 135 * Macros 126 136 **/ 127 // Starts the oscillator and delay a little to account for long oscillator startup times128 #define clockStart() unsetRegister(DS1337_SP, DS1337_SP_EOSC); delay(500);129 137 #define clockStop() setRegister(DS1337_SP, DS1337_SP_EOSC) 130 138 … … 214 222 **/ 215 223 int8_t Init(void); 224 225 /** 226 * clockStart: starts the oscillator and reset the fault flag 227 **/ 228 void clockStart(void); 216 229 #ifdef DS1337_USE_OSC_INTEGRITY 217 230 /**