00001
00024
00025 #include "Main.h"
00026 #include "RTC.h"
00027
00028
00029 unsigned char MaxDate[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
00030
00031
00035 void RTC_init(void)
00036 {
00037 Delay(1000);
00038
00039 __disable_interrupt();
00040
00041 TIMSK2 = 0;
00042
00043 ASSR = (1<<AS2);
00044
00045 TCNT2 = 0;
00046 TCCR2A = (1<<CS22) | (1<<CS20);
00047
00048 while(ASSR & (0x01 | 0x04));
00049
00050 TIFR2 = 0xFF;
00051 TIMSK2 = (1<<TOIE2);
00052
00053 __enable_interrupt();
00054
00055
00056 HOUR = 8;
00057 MINUTE = 0;
00058 SECOND = 0;
00059 DAY = 4;
00060 MONTH = 11;
00061 YEAR_LO = 2;
00062 YEAR_HI = 20;
00063 }
00064
00065
00068 void Time_update(void)
00069 {
00070 unsigned char LeapYear = FALSE;
00071
00072
00073
00074 if(SECOND > 59)
00075 {
00076 SECOND = 0;
00077 MINUTE++;
00078
00079 if(MINUTE > 59)
00080 {
00081 MINUTE = 0;
00082 HOUR++;
00083
00084 if(HOUR > 23)
00085 {
00086 HOUR = 0;
00087 DAY++;
00088
00089 if(MONTH == 2)
00090 {
00091
00092 if(!YEAR_LO)
00093 {
00094 if(!(YEAR_HI%4))
00095 LeapYear = TRUE;
00096 }
00097 else if(!(YEAR_LO%4) & (YEAR_LO != 0))
00098 LeapYear = TRUE;
00099 }
00100
00101 if(DAY > (MaxDate[MONTH] + LeapYear))
00102 {
00103 DAY = 1;
00104 MONTH++;
00105
00106 if(MONTH > 12)
00107 {
00108 MONTH = 1;
00109 YEAR_LO++;
00110
00111 if(YEAR_LO > 99)
00112 {
00113 YEAR_LO = 0;
00114 YEAR_HI++;
00115
00116 if(YEAR_HI > 99)
00117 YEAR_HI = 0;
00118 }
00119 }
00120 }
00121 }
00122 }
00123 }
00124 }
00125
00126
00129 #pragma vector = TIMER2_OVF_vect
00130 __interrupt void TIMER2_OVF_interrupt(void)
00131 {
00132 SECOND++;
00133 }
00134