Пример #1
0
//==============================================================================
//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);
}
Пример #2
0
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();
}
Пример #3
0
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;
}
Пример #4
0
// ==============================================================================
// 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);
}
Пример #5
0
//-----------------------------------------------------------------------------
// 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);
    }
Пример #6
0
//==============================================================================
// 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();
}