00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef WIN32
00023 #include <avr/io.h>
00024 #include <avr/signal.h>
00025 #include <avr/interrupt.h>
00026 #include <avr/pgmspace.h>
00027 #endif
00028
00029 #include "global.h"
00030
00031 #ifdef __AVR_ATmega128__
00032 #include "timer128.h"
00033 #else
00034 #include "timer.h"
00035 #endif
00036
00037 #include "rtc.h"
00038
00039
00040 static char __attribute__ ((progmem)) MonthDayTable[] = {31,28,31,30,31,30,31,31,30,31,30,31};
00041
00042
00043
00044 RtcTimeType RtcTime;
00045
00046 void rtcInit(void)
00047 {
00048
00049
00050 RtcTime.totaltics = 0;
00051 RtcTime.tics = 0;
00052 RtcTime.seconds = 0;
00053 RtcTime.minutes = 0;
00054 RtcTime.hours = 0;
00055 RtcTime.day = 1;
00056 RtcTime.month = 1;
00057 RtcTime.year = 2000;
00058
00059
00060 #ifdef AS2
00061
00062
00063 timer2Init();
00064
00065 timer2SetPrescaler(TIMER_CLK_DIV8);
00066
00067 sbi(ASSR, AS2);
00068
00069
00070 timerAttach(TIMER2OVERFLOW_INT, rtcService);
00071 #else
00072 #ifdef AS0
00073
00074
00075 timer0Init();
00076
00077 timer0SetPrescaler(TIMER_CLK_DIV8);
00078
00079 sbi(ASSR, AS0);
00080
00081
00082 timerAttach(TIMER0OVERFLOW_INT, rtcService);
00083 #endif
00084 #endif
00085 }
00086
00087 void rtcService(void)
00088 {
00089
00090 RtcTime.totaltics++;
00091 RtcTime.tics++;
00092
00093 if(RtcTime.tics == 16)
00094 {
00095 RtcTime.tics = 0;
00096 RtcTime.seconds++;
00097 if(RtcTime.seconds > 59)
00098 {
00099 RtcTime.seconds -= 60;
00100 RtcTime.minutes++;
00101 if(RtcTime.minutes > 59)
00102 {
00103 RtcTime.minutes -= 60;
00104 RtcTime.hours++;
00105 if(RtcTime.hours > 23)
00106 {
00107 RtcTime.hours -= 24;
00108 RtcTime.day++;
00109
00110 if(RtcTime.day == pgm_read_byte(&MonthDayTable[RtcTime.month-1]))
00111 {
00112 RtcTime.day = 1;
00113 RtcTime.month++;
00114 if(RtcTime.month == 13)
00115 {
00116 RtcTime.month = 1;
00117 RtcTime.year++;
00118 }
00119 }
00120 }
00121 }
00122 }
00123 }
00124 }
00125
00126 RtcTimeType* rtcGetTime(void)
00127 {
00128
00129 return &RtcTime;
00130 }
00131