//============================================================================== //Gets the full time. "Hours:Minutes:Seconds" <<01:35:12>> //*RTCbuf: Save all time in this variable. //Return 0 if time is in 24 format. //Return 1 if time is in 24 format. //Return 2 if time is in AM format. //Return 3 if time is in PM format. //============================================================================== unsigned char DS3231_GetTime(unsigned char *RTCbuf){ unsigned char byte0, byte1; unsigned char byte2[5]; byte0 = DS3231_GetInfo(HOURS); byte1 = (byte0 & 96) >> 5; switch(byte1){ case 0: case 1: byte0 = BCDToDecimal(byte0); break; case 2: case 3: byte0 = BCDToDecimal(byte0 & 31); break; default:break; }; sprintf(byte2,"%02d", byte0); *RTCbuf = byte2[0]; RTCbuf++; *RTCbuf = byte2[1]; RTCbuf++; *RTCbuf = ':'; RTCbuf++; Nop(); Nop(); byte0 = BCDToDecimal(DS3231_GetInfo(MINUTES)); sprintf(byte2,"%02d", byte0); *RTCbuf = byte2[0]; RTCbuf++; *RTCbuf = byte2[1]; RTCbuf++; *RTCbuf = ':'; RTCbuf++; byte0 = BCDToDecimal(DS3231_GetInfo(SECONDS)); sprintf(byte2,"%02d", byte0); *RTCbuf = byte2[0]; RTCbuf++; *RTCbuf = byte2[1]; RTCbuf++; *RTCbuf = NULL; return(byte1); }
void DS3231_GetCalendar(unsigned char *RTCbuf){ unsigned char byte0; unsigned char byte1[5]; byte0 = BCDToDecimal(DS3231_GetInfo(DAY)); switch(byte0){ case 1:*RTCbuf = 'M'; RTCbuf++; *RTCbuf = 'o'; RTCbuf++; *RTCbuf = 'n'; RTCbuf++; break; case 2:*RTCbuf = 'T'; RTCbuf++; *RTCbuf = 'u'; RTCbuf++; *RTCbuf = 'e'; RTCbuf++; break; case 3:*RTCbuf = 'W'; RTCbuf++; *RTCbuf = 'e'; RTCbuf++; *RTCbuf = 'd'; RTCbuf++; break; case 4:*RTCbuf = 'T'; RTCbuf++; *RTCbuf = 'h'; RTCbuf++; *RTCbuf = 'u'; RTCbuf++; break; case 5:*RTCbuf = 'F'; RTCbuf++; *RTCbuf = 'r'; RTCbuf++; *RTCbuf = 'i'; RTCbuf++; break; case 6:*RTCbuf = 'S'; RTCbuf++; *RTCbuf = 'a'; RTCbuf++; *RTCbuf = 't'; RTCbuf++; break; case 7:*RTCbuf = 'S'; RTCbuf++; *RTCbuf = 'u'; RTCbuf++; *RTCbuf = 'n'; RTCbuf++; break; default:break; }; *RTCbuf = '.'; RTCbuf++; *RTCbuf = ' '; RTCbuf++; byte0 = BCDToDecimal(DS3231_GetInfo(DATE)); sprintf(byte1,"%02d", byte0); *RTCbuf = byte1[0]; RTCbuf++; *RTCbuf = byte1[1]; RTCbuf++; *RTCbuf = ' '; RTCbuf++; byte0 = BCDToDecimal(DS3231_GetInfo(MONTH)); switch(byte0){ case 1: *RTCbuf = 'J'; RTCbuf++; *RTCbuf = 'a'; RTCbuf++; *RTCbuf = 'n'; RTCbuf++; break; case 2: *RTCbuf = 'F'; RTCbuf++; *RTCbuf = 'e'; RTCbuf++; *RTCbuf = 'b'; RTCbuf++; break; case 3: *RTCbuf = 'M'; RTCbuf++; *RTCbuf = 'a'; RTCbuf++; *RTCbuf = 'r'; RTCbuf++; break; case 4: *RTCbuf = 'A'; RTCbuf++; *RTCbuf = 'p'; RTCbuf++; *RTCbuf = 'r'; RTCbuf++; break; case 5: *RTCbuf = 'M'; RTCbuf++; *RTCbuf = 'a'; RTCbuf++; *RTCbuf = 'y'; RTCbuf++; break; case 6: *RTCbuf = 'J'; RTCbuf++; *RTCbuf = 'u'; RTCbuf++; *RTCbuf = 'n'; RTCbuf++; break; case 7: *RTCbuf = 'J'; RTCbuf++; *RTCbuf = 'u'; RTCbuf++; *RTCbuf = 'l'; RTCbuf++; break; case 8: *RTCbuf = 'A'; RTCbuf++; *RTCbuf = 'u'; RTCbuf++; *RTCbuf = 'g'; RTCbuf++; break; case 9: *RTCbuf = 'S'; RTCbuf++; *RTCbuf = 'e'; RTCbuf++; *RTCbuf = 'p'; RTCbuf++; break; case 10:*RTCbuf = 'O'; RTCbuf++; *RTCbuf = 'c'; RTCbuf++; *RTCbuf = 't'; RTCbuf++; break; case 11:*RTCbuf = 'N'; RTCbuf++; *RTCbuf = 'o'; RTCbuf++; *RTCbuf = 'v'; RTCbuf++; break; case 12:*RTCbuf = 'D'; RTCbuf++; *RTCbuf = 'e'; RTCbuf++; *RTCbuf = 'c'; RTCbuf++; break; default:break; }; *RTCbuf = '.'; RTCbuf++; *RTCbuf = ' '; RTCbuf++; byte0 = BCDToDecimal(DS3231_GetInfo(YEAR)); sprintf(byte1,"%02d", byte0); *RTCbuf = byte1[0]; RTCbuf++; *RTCbuf = byte1[1]; RTCbuf++; *RTCbuf = NULL; Nop(); Nop(); }
void _ISRFAST _INT2Interrupt(void) #endif { //LED1 = ~LED1; if (SA02_VIBRA_INTPIN_IF) { uint8_t rtc_min; uint16_t rtc_sec; // get current time from RTC mRtccClearRtcPtr(); rtc_sec = BCDToDecimal(RTCVALL); rtc_min = BCDToDecimal(RTCVALH); rtc_sec += rtc_min*SEC_IN_MIN; //printf("int_cnt: %lu time: %d start_time: %d\n", int_cnt, rtc_sec, sec_start); if (isInInterval(sec_start, rtc_sec)) { // we have enough interrupts in given shaking interval if (int_cnt++ >= INTERRUPTS_FOR_ONE_SHAKE) { accel_int = TRUE; int_cnt = 0; //printf("=== Vibra interrupt ===\n"); } delay_ms(25); } else { sec_start = rtc_sec; // save new starting time int_cnt = 0; } SA02_VIBRA_INTPIN_IF = 0; } // RTC interrupt if ((PIR3bits.RTCCIF) && (PIE3bits.RTCCIE)) { PIR3bits.RTCCIF = 0; PIE3bits.RTCCIE = 0; RtccWrOn(); mRtccOff(); mRtccWrOff(); //printf("RTC INT\n"); } if (HW_isIRQ0Active()) { HW_irq0occurred(); HW_clearIRQ0(); } if (HW_isIRQ1Active()) { HW_irq1occurred(); HW_clearIRQ1(); } //LED1 = ~LED1; }
// ============================================================================== // Makes a change of 12hr to 24hr, or 24hr to 12hr. // ============================================================================== void DS3231_HourMode(void){ unsigned char byte0, byte1; byte0 = DS3231_GetInfo(HOURS); switch((byte0 & 96) >> 5){ case 0: case 1:byte1 = BCDToDecimal(byte0); if(byte1 == 0) { byte1 = 12; byte1 = DecimalToBCD(byte1); byte1 = byte1 | MODE_12HOUR_PM; break; }else if(byte1 > 12) { byte1 = byte1 - 12; byte1 = DecimalToBCD(byte1); byte1 = byte1 | MODE_12HOUR_PM; break; }else if(byte1 < 13) { byte1 = DecimalToBCD(byte1); byte1 = byte1 | MODE_12HOUR_AM; break; } break; case 2:byte1 = byte0 & 31; break; case 3:byte1 = byte0 & 31; byte1 = BCDToDecimal(byte1); byte1 = byte1 + 12; if(byte1 == 24){byte1 = 0;} byte1 = DecimalToBCD(byte1); break; default:break;} DS3231_SetInfo(HOURS, byte1); }
//----------------------------------------------------------------------------- // TimecodeToString // CString CTimecode::TimecodeToString(void) { CString Timecode = TEXT("FF:FF:FF:FF"); if (m_Timecode.wFrameRate && (m_InvalidTimecodeBCD != m_Timecode.dwFrames)) { int Hours = BCDToDecimal((m_Timecode.dwFrames & 0xFF000000) >> 24); int Minutes = BCDToDecimal((m_Timecode.dwFrames & 0x00FF0000) >> 16); int Seconds = BCDToDecimal((m_Timecode.dwFrames & 0x0000FF00) >> 8); int Frames = BCDToDecimal(m_Timecode.dwFrames & 0x000000FF); Timecode.Empty(); TCHAR buf[8] = {0}; if (10 > Hours) { Timecode += "0"; } Timecode += _itot(Hours, buf, 10); Timecode += ":"; if (10 > Minutes) { Timecode += "0"; } Timecode += _itot(Minutes, buf, 10); Timecode += ":"; if (10 > Seconds) { Timecode += "0"; } Timecode += _itot(Seconds, buf, 10); Timecode += (ED_FORMAT_SMPTE_30DROP == m_Timecode.wFrameRate) ? ";" : ":"; if (10 > Frames) { Timecode += "0"; } Timecode += _itot(Frames, buf, 10); }
//============================================================================== // Increments RTC reg data (increments existing values) in the RTC. // [ A selected byte: minutes, seconds, hours, day, date, month and year .... ] // // byte0: Sets data to increment. // //============================================================================== void DS3231_IncrData(unsigned char selectBYTE){ unsigned char btemp; unsigned char byte1; btemp = 0; byte1 = 0; switch(selectBYTE){ case 0x00: case 0x01: byte1 = BCDToDecimal(DS3231_GetInfo(selectBYTE)); // SECs or MINs byte1++; if (byte1 == 60) byte1 = 0; DS3231_SetInfo(selectBYTE, DecimalToBCD(byte1)); break; case 0x03: byte1 = BCDToDecimal(DS3231_GetInfo(selectBYTE)); // "DAY" ( 1 - 7 ) byte1++; if(byte1 == 8) byte1 = 1; DS3231_SetInfo(selectBYTE, DecimalToBCD(byte1)); break; case 0x04: byte1 = BCDToDecimal(DS3231_GetInfo(selectBYTE)); // "DATE" byte1++; if(byte1 == 32) {byte1 = 1;} DS3231_SetInfo(selectBYTE, DecimalToBCD(byte1)); break; case 0x05: byte1 = DS3231_GetInfo(selectBYTE); // "MONTH" byte1 = BCDToDecimal(byte1 & 127); byte1++; if(byte1 == 13) {byte1 = 1;} DS3231_SetInfo(selectBYTE, DecimalToBCD(byte1)); break; case 0x06: byte1 = BCDToDecimal(DS3231_GetInfo(selectBYTE)); // "YEAR" (byte) byte1++; if (byte1 == 100) byte1 = 0; DS3231_SetInfo(selectBYTE, DecimalToBCD(byte1)); break; // // IF the "selectBYTE" is 0x02, then "parse" the value ... // // 7 6 5 4 3 2 1 0 NOTES // 0 1 0 10 hr bit HOUR ( 1 - 12 ) AM 12 hr mode // 0 1 1 10 hr bit PM // 0 0 20 hr ? HOUR ? 0 - 23 ? // // byte1 AND 0x60 // case 0x02: { btemp = DS3231_GetInfo(selectBYTE); btemp = btemp >> 5; switch( btemp ){ case 0: case 1:byte1 = BCDToDecimal(DS3231_GetInfo(selectBYTE)); byte1++; if(byte1 == 24){byte1 = 0;} DS3231_SetInfo(selectBYTE, DecimalToBCD(byte1)); break; case 2:byte1 = BCDToDecimal(byte1 & 31); byte1++; if(byte1 == 13){byte1 = 1;} byte1 = DecimalToBCD(byte1); byte1 = byte1 | 64; DS3231_SetInfo(selectBYTE, byte1); break; case 3: byte1 = BCDToDecimal(byte1 & 31); byte1++; if(byte1 == 13) byte1 = 1; byte1 = DecimalToBCD(byte1); byte1 = byte1 | 96; DS3231_SetInfo(selectBYTE, byte1); break; default:break; }; }; break; default: break; }; Nop(); Nop(); }