00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef WIN32
00019 #include <io.h>
00020 #include <sig-avr.h>
00021 #include <interrupt.h>
00022 #include <progmem.h>
00023 #endif
00024
00025 #include "global.h"
00026 #include "timer.h"
00027
00028
00029
00030
00031 short __attribute__ ((progmem)) TimerPrescaleFactor[] = {0,0,3,6,8,10};
00032
00033
00034
00035 volatile unsigned long Timer0PauseReg;
00036 volatile unsigned long Timer0Reg0;
00037 volatile unsigned long Timer0Reg1;
00038 volatile unsigned long Timer2Reg0;
00039 volatile unsigned long Timer2Reg1;
00040
00041 typedef void (*voidFuncPtr)(void);
00042 volatile static voidFuncPtr TimerIntFunc[TIMER_NUM_INTERRUPTS];
00043
00044
00045
00046
00047 void delay(unsigned short us)
00048 {
00049 unsigned short delay_loops;
00050 register unsigned short i;
00051
00052 delay_loops = (us+3)/5*CYCLES_PER_US;
00053
00054
00055 for (i=0; i < delay_loops; i++) {};
00056 }
00057
00058 void timerInit(void)
00059 {
00060 u08 intNum;
00061
00062 for(intNum=0; intNum<TIMER_NUM_INTERRUPTS; intNum++)
00063 timerDetach(intNum);
00064
00065
00066 timer0Init();
00067 timer1Init();
00068 timer2Init();
00069
00070 sei();
00071 }
00072
00073 void timer0Init()
00074 {
00075
00076 timer0SetPrescaler( TIMER0PRESCALE );
00077 outp(0, TCNT0);
00078 sbi(TIMSK, TOIE0);
00079
00080 Timer0Reg0 = 0;
00081 Timer0Reg1 = 0;
00082 }
00083
00084 void timer1Init(void)
00085 {
00086
00087 timer1SetPrescaler( TIMER1PRESCALE );
00088 outp(0, TCNT1H);
00089 outp(0, TCNT1L);
00090 sbi(TIMSK, TOIE1);
00091 }
00092
00093 void timer2Init(void)
00094 {
00095
00096 timer2SetPrescaler( TIMER2PRESCALE );
00097 outp(0, TCNT2);
00098 sbi(TIMSK, TOIE2);
00099
00100 Timer2Reg0 = 0;
00101 Timer2Reg1 = 0;
00102 }
00103
00104 void timer0SetPrescaler(u08 prescale)
00105 {
00106
00107 outp( (inp(TCCR0) & ~TIMER_PRESCALE_MASK) | prescale, TCCR0);
00108 }
00109
00110 void timer1SetPrescaler(u08 prescale)
00111 {
00112
00113 outp( (inp(TCCR1B) & ~TIMER_PRESCALE_MASK) | prescale, TCCR1B);
00114 }
00115
00116 void timer2SetPrescaler(u08 prescale)
00117 {
00118
00119 outp( (inp(TCCR2) & ~TIMER_PRESCALE_MASK) | prescale, TCCR2);
00120 }
00121
00122 void timerAttach(u08 interruptNum, void (*userFunc)(void) )
00123 {
00124
00125 if(interruptNum < TIMER_NUM_INTERRUPTS)
00126 {
00127
00128
00129 TimerIntFunc[interruptNum] = userFunc;
00130 }
00131 }
00132
00133 void timerDetach(u08 interruptNum)
00134 {
00135
00136 if(interruptNum < TIMER_NUM_INTERRUPTS)
00137 {
00138
00139 TimerIntFunc[interruptNum] = 0;
00140 }
00141 }
00142
00143 void timerPause(unsigned short pause_ms)
00144 {
00145
00146
00147
00148 u16 prescaleDiv = 1<<(PRG_RDB(TimerPrescaleFactor+inp(TCCR0)));
00149 u32 pause = (pause_ms*(F_CPU/(prescaleDiv*256)))/1000;
00150
00151 Timer0PauseReg = 0;
00152 while(Timer0PauseReg < pause);
00153 }
00154
00155 void timer0ClearOverflowCount(void)
00156 {
00157
00158 Timer0Reg0 = 0;
00159 Timer0Reg1 = 0;
00160 }
00161
00162 long timer0GetOverflowCount(void)
00163 {
00164
00165
00166 return Timer0Reg0;
00167 }
00168
00169 void timer2ClearOverflowCount(void)
00170 {
00171
00172 Timer2Reg0 = 0;
00173 Timer2Reg1 = 0;
00174 }
00175
00176 long timer2GetOverflowCount(void)
00177 {
00178
00179
00180 return Timer2Reg0;
00181 }
00182
00183
00184 void timer1PWMInit(u08 bitRes)
00185 {
00186
00187
00188
00189
00190 if(bitRes == 9)
00191 {
00192 sbi(TCCR1A,PWM11);
00193 cbi(TCCR1A,PWM10);
00194 }
00195 else if( bitRes == 10 )
00196 {
00197 sbi(TCCR1A,PWM11);
00198 sbi(TCCR1A,PWM10);
00199 }
00200 else
00201 {
00202 cbi(TCCR1A,PWM11);
00203 sbi(TCCR1A,PWM10);
00204 }
00205
00206
00207 sbi(TCCR1B,CTC1);
00208
00209 sbi(TCCR1A,COM1A1);
00210 cbi(TCCR1A,COM1A0);
00211
00212 sbi(TCCR1A,COM1B1);
00213 cbi(TCCR1A,COM1B0);
00214
00215 outp(0, OCR1AH);
00216 outp(0, OCR1AL);
00217
00218 outp(0, OCR1BH);
00219 outp(0, OCR1BL);
00220 }
00221
00222 void timer1PWMOff(void)
00223 {
00224
00225 cbi(TCCR1A,PWM11);
00226 cbi(TCCR1A,PWM10);
00227
00228 cbi(TCCR1B,CTC1);
00229
00230 cbi(TCCR1A,COM1A1);
00231 cbi(TCCR1A,COM1A0);
00232
00233 cbi(TCCR1A,COM1B1);
00234 cbi(TCCR1A,COM1B0);
00235 }
00236
00237 void timer1PWMASet(u16 pwmDuty)
00238 {
00239
00240
00241
00242
00243
00244 outp( (pwmDuty>>8), OCR1AH);
00245 outp( (pwmDuty&0x00FF), OCR1AL);
00246 }
00247
00248 void timer1PWMBSet(u16 pwmDuty)
00249 {
00250
00251
00252
00253
00254
00255 outp( (pwmDuty>>8), OCR1BH);
00256 outp( (pwmDuty&0x00FF), OCR1BL);
00257 }
00258
00259
00260 SIGNAL(SIG_OVERFLOW0)
00261 {
00262 Timer0Reg0++;
00263 if(!Timer0Reg0)
00264 Timer0Reg1++;
00265
00266
00267 Timer0PauseReg++;
00268
00269
00270 if(TimerIntFunc[TIMER0OVERFLOW_INT])
00271 TimerIntFunc[TIMER0OVERFLOW_INT]();
00272 }
00273
00274
00275 SIGNAL(SIG_OVERFLOW1)
00276 {
00277
00278 if(TimerIntFunc[TIMER1OVERFLOW_INT])
00279 TimerIntFunc[TIMER1OVERFLOW_INT]();
00280 }
00281
00282
00283 SIGNAL(SIG_OVERFLOW2)
00284 {
00285 Timer2Reg0++;
00286 if(!Timer2Reg0)
00287 Timer2Reg1++;
00288
00289
00290 if(TimerIntFunc[TIMER2OVERFLOW_INT])
00291 TimerIntFunc[TIMER2OVERFLOW_INT]();
00292 }
00293
00294
00295 SIGNAL(SIG_OUTPUT_COMPARE1A)
00296 {
00297
00298 if(TimerIntFunc[TIMER1OUTCOMPAREA_INT])
00299 TimerIntFunc[TIMER1OUTCOMPAREA_INT]();
00300 }
00301
00302
00303 SIGNAL(SIG_OUTPUT_COMPARE1B)
00304 {
00305
00306 if(TimerIntFunc[TIMER1OUTCOMPAREB_INT])
00307 TimerIntFunc[TIMER1OUTCOMPAREB_INT]();
00308 }
00309
00310 SIGNAL(SIG_INPUT_CAPTURE1)
00311 {
00312
00313 if(TimerIntFunc[TIMER1INPUTCAPTURE_INT])
00314 TimerIntFunc[TIMER1INPUTCAPTURE_INT]();
00315 }
00316
00317
00318
00319
00320
00321 SIGNAL(SIG_OUTPUT_COMPARE2)
00322 {
00323
00324
00325 if(TimerIntFunc[TIMER2OUTCOMPARE_INT])
00326 TimerIntFunc[TIMER2OUTCOMPARE_INT]();
00327 }
00328
00329
00330
00331 void timer2SetRTCMode(void)
00332 {
00333 sbi(ASSR,AS2);
00334 }
00335
00336 void timer2EnableOutputCompare(void)
00337 {
00338 sbi(TIMSK, OCIE2);
00339 }
00340
00341 void timer2SetOutCompare(u08 compare)
00342 {
00343 outp(compare,OCR2);
00344 }