00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef WIN32
00019 #include <avr/io.h>
00020 #include <avr/signal.h>
00021 #include <avr/interrupt.h>
00022 #include <avr/pgmspace.h>
00023 #endif
00024
00025 #include "global.h"
00026 #include "timer128.h"
00027
00028
00029
00030
00031 short __attribute__ ((progmem)) TimerPrescaleFactor[] = {0,0,3,6,8,10};
00032
00033
00034 short __attribute__ ((progmem)) TimerRTCPrescaleFactor[] = {0,0,3,5,6,7,8,10};
00035
00036
00037
00038 volatile unsigned long TimerPauseReg;
00039 volatile unsigned long Timer0Reg0;
00040 volatile unsigned long Timer0Reg1;
00041 volatile unsigned long Timer2Reg0;
00042 volatile unsigned long Timer2Reg1;
00043
00044 typedef void (*voidFuncPtr)(void);
00045 volatile static voidFuncPtr TimerIntFunc[TIMER_NUM_INTERRUPTS];
00046
00047
00048
00049
00050 void delay(unsigned short us)
00051 {
00052 unsigned short delay_loops;
00053 register unsigned short i;
00054
00055 delay_loops = (us+3)/5*CYCLES_PER_US;
00056
00057
00058 for (i=0; i < delay_loops; i++) {};
00059 }
00060
00061 void timerInit(void)
00062 {
00063 u08 intNum;
00064
00065 for(intNum=0; intNum<TIMER_NUM_INTERRUPTS; intNum++)
00066 timerDetach(intNum);
00067
00068
00069 timer0Init();
00070 timer1Init();
00071 timer2Init();
00072 timer3Init();
00073
00074 sei();
00075 }
00076
00077 void timer0Init()
00078 {
00079
00080 timer0SetPrescaler( TIMER0PRESCALE );
00081 outp(0, TCNT0);
00082 sbi(TIMSK, TOIE0);
00083
00084 timer0ClearOverflowCount();
00085 }
00086
00087 void timer1Init(void)
00088 {
00089
00090 timer1SetPrescaler( TIMER1PRESCALE );
00091 outp(0, TCNT1H);
00092 outp(0, TCNT1L);
00093 sbi(TIMSK, TOIE1);
00094 }
00095
00096 void timer2Init(void)
00097 {
00098
00099 timer2SetPrescaler( TIMER2PRESCALE );
00100 outp(0, TCNT2);
00101 sbi(TIMSK, TOIE2);
00102
00103 timer2ClearOverflowCount();
00104 }
00105
00106 void timer3Init(void)
00107 {
00108
00109 timer3SetPrescaler( TIMER3PRESCALE );
00110 outp(0, TCNT3H);
00111 outp(0, TCNT3L);
00112 sbi(ETIMSK, TOIE3);
00113 }
00114
00115 void timer0SetPrescaler(u08 prescale)
00116 {
00117
00118 outp( (inp(TCCR0) & ~TIMER_PRESCALE_MASK) | prescale, TCCR0);
00119 }
00120
00121 void timer1SetPrescaler(u08 prescale)
00122 {
00123
00124 outp( (inp(TCCR1B) & ~TIMER_PRESCALE_MASK) | prescale, TCCR1B);
00125 }
00126
00127 void timer2SetPrescaler(u08 prescale)
00128 {
00129
00130 outp( (inp(TCCR2) & ~TIMER_PRESCALE_MASK) | prescale, TCCR2);
00131 }
00132
00133 void timer3SetPrescaler(u08 prescale)
00134 {
00135
00136 outp( (inp(TCCR3B) & ~TIMER_PRESCALE_MASK) | prescale, TCCR3B);
00137 }
00138
00139 void timerAttach(u08 interruptNum, void (*userFunc)(void) )
00140 {
00141
00142 if(interruptNum < TIMER_NUM_INTERRUPTS)
00143 {
00144
00145
00146 TimerIntFunc[interruptNum] = userFunc;
00147 }
00148 }
00149
00150 void timerDetach(u08 interruptNum)
00151 {
00152
00153 if(interruptNum < TIMER_NUM_INTERRUPTS)
00154 {
00155
00156 TimerIntFunc[interruptNum] = 0;
00157 }
00158 }
00159
00160 void timerPause(unsigned short pause_ms)
00161 {
00162
00163 u08 timerThres;
00164 u32 ticRateHz;
00165 u32 pause;
00166
00167
00168 timerThres = inb(TCNT2);
00169
00170 TimerPauseReg = 0;
00171
00172
00173 ticRateHz = F_CPU/(1<<(PRG_RDB(TimerPrescaleFactor+inp(TCCR2))));
00174
00175 if( ticRateHz > 1000000)
00176 pause = pause_ms*(ticRateHz/1000);
00177 else
00178 pause = (pause_ms*ticRateHz)/1000;
00179
00180
00181 while( ((TimerPauseReg<<8) | inb(TCNT2)) < (pause+timerThres) )
00182 {
00183 if( TimerPauseReg < (pause>>8));
00184 {
00185
00186 set_sleep_mode(SLEEP_MODE_IDLE);
00187 sleep_mode();
00188 }
00189 }
00190 }
00191
00192 void timer0ClearOverflowCount(void)
00193 {
00194
00195 Timer0Reg0 = 0;
00196 Timer0Reg1 = 0;
00197 }
00198
00199 long timer0GetOverflowCount(void)
00200 {
00201
00202
00203 return Timer0Reg0;
00204 }
00205
00206 void timer2ClearOverflowCount(void)
00207 {
00208
00209 Timer2Reg0 = 0;
00210 Timer2Reg1 = 0;
00211 }
00212
00213 long timer2GetOverflowCount(void)
00214 {
00215
00216
00217 return Timer2Reg0;
00218 }
00219
00220
00221 void timer1PWMInit(u08 bitRes)
00222 {
00223
00224
00225
00226
00227 if(bitRes == 9)
00228 {
00229 sbi(TCCR1A,WGMA1);
00230 cbi(TCCR1A,WGMA0);
00231 }
00232 else if( bitRes == 10 )
00233 {
00234 sbi(TCCR1A,WGMA1);
00235 sbi(TCCR1A,WGMA0);
00236 }
00237 else
00238 {
00239 cbi(TCCR1A,WGMA1);
00240 sbi(TCCR1A,WGMA0);
00241 }
00242
00243
00244
00245
00246 outb(OCR1AH, 0);
00247 outb(OCR1AL, 0);
00248
00249 outb(OCR1BH, 0);
00250 outb(OCR1BL, 0);
00251
00252 outb(OCR1CH, 0);
00253 outb(OCR1CL, 0);
00254 }
00255
00256 void timer1PWMOff(void)
00257 {
00258
00259 cbi(TCCR1A,WGMA1);
00260 cbi(TCCR1A,WGMA0);
00261
00262
00263
00264 timer1PWMAOff();
00265 timer1PWMBOff();
00266 timer1PWMCOff();
00267 }
00268
00269 void timer1PWMAOn(void)
00270 {
00271
00272
00273 sbi(TCCR1A,COMA1);
00274 cbi(TCCR1A,COMA0);
00275 }
00276
00277 void timer1PWMBOn(void)
00278 {
00279
00280
00281 sbi(TCCR1A,COMB1);
00282 cbi(TCCR1A,COMB0);
00283 }
00284
00285 void timer1PWMCOn(void)
00286 {
00287
00288
00289 sbi(TCCR1A,COMC1);
00290 cbi(TCCR1A,COMC0);
00291 }
00292
00293 void timer1PWMAOff(void)
00294 {
00295
00296
00297 cbi(TCCR1A,COMA1);
00298 cbi(TCCR1A,COMA0);
00299 }
00300
00301 void timer1PWMBOff(void)
00302 {
00303
00304
00305 cbi(TCCR1A,COMB1);
00306 cbi(TCCR1A,COMB0);
00307 }
00308
00309 void timer1PWMCOff(void)
00310 {
00311
00312
00313 cbi(TCCR1A,COMC1);
00314 cbi(TCCR1A,COMC0);
00315 }
00316
00317 void timer1PWMASet(u16 pwmDuty)
00318 {
00319
00320
00321
00322
00323
00324 outp( (pwmDuty>>8), OCR1AH);
00325 outp( (pwmDuty&0x00FF), OCR1AL);
00326 }
00327
00328 void timer1PWMBSet(u16 pwmDuty)
00329 {
00330
00331
00332
00333
00334
00335 outp( (pwmDuty>>8), OCR1BH);
00336 outp( (pwmDuty&0x00FF), OCR1BL);
00337 }
00338
00339 void timer1PWMCSet(u16 pwmDuty)
00340 {
00341
00342
00343
00344
00345
00346 outp( (pwmDuty>>8), OCR1CH);
00347 outp( (pwmDuty&0x00FF), OCR1CL);
00348 }
00349
00350
00351 void timer3PWMInit(u08 bitRes)
00352 {
00353
00354
00355
00356
00357 if(bitRes == 9)
00358 {
00359 sbi(TCCR3A,WGMA1);
00360 cbi(TCCR3A,WGMA0);
00361 }
00362 else if( bitRes == 10 )
00363 {
00364 sbi(TCCR3A,WGMA1);
00365 sbi(TCCR3A,WGMA0);
00366 }
00367 else
00368 {
00369 cbi(TCCR3A,WGMA1);
00370 sbi(TCCR3A,WGMA0);
00371 }
00372
00373
00374
00375
00376 outb(OCR3AH, 0);
00377 outb(OCR3AL, 0);
00378
00379 outb(OCR3BH, 0);
00380 outb(OCR3BL, 0);
00381
00382 outb(OCR3CH, 0);
00383 outb(OCR3CL, 0);
00384 }
00385
00386 void timer3PWMOff(void)
00387 {
00388
00389 cbi(TCCR3A,WGMA1);
00390 cbi(TCCR3A,WGMA0);
00391
00392
00393
00394 timer3PWMAOff();
00395 timer3PWMBOff();
00396 timer3PWMCOff();
00397 }
00398
00399 void timer3PWMAOn(void)
00400 {
00401
00402
00403 sbi(TCCR3A,COMA1);
00404 cbi(TCCR3A,COMA0);
00405 }
00406
00407 void timer3PWMBOn(void)
00408 {
00409
00410
00411 sbi(TCCR3A,COMB1);
00412 cbi(TCCR3A,COMB0);
00413 }
00414
00415 void timer3PWMCOn(void)
00416 {
00417
00418
00419 sbi(TCCR3A,COMC1);
00420 cbi(TCCR3A,COMC0);
00421 }
00422
00423 void timer3PWMAOff(void)
00424 {
00425
00426
00427 cbi(TCCR3A,COMA1);
00428 cbi(TCCR3A,COMA0);
00429 }
00430
00431 void timer3PWMBOff(void)
00432 {
00433
00434
00435 cbi(TCCR3A,COMB1);
00436 cbi(TCCR3A,COMB0);
00437 }
00438
00439 void timer3PWMCOff(void)
00440 {
00441
00442
00443 cbi(TCCR3A,COMC1);
00444 cbi(TCCR3A,COMC0);
00445 }
00446
00447 void timer3PWMASet(u16 pwmDuty)
00448 {
00449
00450
00451
00452
00453
00454 outp( (pwmDuty>>8), OCR3AH);
00455 outp( (pwmDuty&0x00FF), OCR3AL);
00456 }
00457
00458 void timer3PWMBSet(u16 pwmDuty)
00459 {
00460
00461
00462
00463
00464
00465 outp( (pwmDuty>>8), OCR3BH);
00466 outp( (pwmDuty&0x00FF), OCR3BL);
00467 }
00468
00469 void timer3PWMCSet(u16 pwmDuty)
00470 {
00471
00472
00473
00474
00475
00476 outp( (pwmDuty>>8), OCR3CH);
00477 outp( (pwmDuty&0x00FF), OCR3CL);
00478 }
00479
00480
00481
00482 TIMER_INTERRUPT_HANDLER(SIG_OVERFLOW0)
00483 {
00484 Timer0Reg0++;
00485 if(!Timer0Reg0)
00486 Timer0Reg1++;
00487
00488
00489 if(TimerIntFunc[TIMER0OVERFLOW_INT])
00490 TimerIntFunc[TIMER0OVERFLOW_INT]();
00491 }
00492
00493
00494 TIMER_INTERRUPT_HANDLER(SIG_OVERFLOW1)
00495 {
00496
00497 if(TimerIntFunc[TIMER1OVERFLOW_INT])
00498 TimerIntFunc[TIMER1OVERFLOW_INT]();
00499 }
00500
00501
00502 TIMER_INTERRUPT_HANDLER(SIG_OVERFLOW2)
00503 {
00504 Timer2Reg0++;
00505 if(!Timer2Reg0)
00506 Timer2Reg1++;
00507
00508
00509 TimerPauseReg++;
00510
00511
00512 if(TimerIntFunc[TIMER2OVERFLOW_INT])
00513 TimerIntFunc[TIMER2OVERFLOW_INT]();
00514 }
00515
00516
00517 TIMER_INTERRUPT_HANDLER(SIG_OVERFLOW3)
00518 {
00519
00520 if(TimerIntFunc[TIMER3OVERFLOW_INT])
00521 TimerIntFunc[TIMER3OVERFLOW_INT]();
00522 }
00523
00524
00525 TIMER_INTERRUPT_HANDLER(SIG_OUTPUT_COMPARE0)
00526 {
00527
00528 if(TimerIntFunc[TIMER0OUTCOMPARE_INT])
00529 TimerIntFunc[TIMER0OUTCOMPARE_INT]();
00530 }
00531
00532
00533 TIMER_INTERRUPT_HANDLER(SIG_OUTPUT_COMPARE1A)
00534 {
00535
00536 if(TimerIntFunc[TIMER1OUTCOMPAREA_INT])
00537 TimerIntFunc[TIMER1OUTCOMPAREA_INT]();
00538 }
00539
00540
00541 TIMER_INTERRUPT_HANDLER(SIG_OUTPUT_COMPARE1B)
00542 {
00543
00544 if(TimerIntFunc[TIMER1OUTCOMPAREB_INT])
00545 TimerIntFunc[TIMER1OUTCOMPAREB_INT]();
00546 }
00547
00548
00549 TIMER_INTERRUPT_HANDLER(SIG_OUTPUT_COMPARE1C)
00550 {
00551
00552 if(TimerIntFunc[TIMER1OUTCOMPAREC_INT])
00553 TimerIntFunc[TIMER1OUTCOMPAREC_INT]();
00554 }
00555
00556
00557 TIMER_INTERRUPT_HANDLER(SIG_INPUT_CAPTURE1)
00558 {
00559
00560 if(TimerIntFunc[TIMER1INPUTCAPTURE_INT])
00561 TimerIntFunc[TIMER1INPUTCAPTURE_INT]();
00562 }
00563
00564
00565 TIMER_INTERRUPT_HANDLER(SIG_OUTPUT_COMPARE2)
00566 {
00567
00568 if(TimerIntFunc[TIMER2OUTCOMPARE_INT])
00569 TimerIntFunc[TIMER2OUTCOMPARE_INT]();
00570 }
00571
00572
00573 TIMER_INTERRUPT_HANDLER(SIG_OUTPUT_COMPARE3A)
00574 {
00575
00576 if(TimerIntFunc[TIMER3OUTCOMPAREA_INT])
00577 TimerIntFunc[TIMER3OUTCOMPAREA_INT]();
00578 }
00579
00580
00581 TIMER_INTERRUPT_HANDLER(SIG_OUTPUT_COMPARE3B)
00582 {
00583
00584 if(TimerIntFunc[TIMER1OUTCOMPAREB_INT])
00585 TimerIntFunc[TIMER1OUTCOMPAREB_INT]();
00586 }
00587
00588
00589 TIMER_INTERRUPT_HANDLER(SIG_OUTPUT_COMPARE3C)
00590 {
00591
00592 if(TimerIntFunc[TIMER3OUTCOMPAREC_INT])
00593 TimerIntFunc[TIMER3OUTCOMPAREC_INT]();
00594 }
00595
00596
00597 TIMER_INTERRUPT_HANDLER(SIG_INPUT_CAPTURE3)
00598 {
00599
00600 if(TimerIntFunc[TIMER3INPUTCAPTURE_INT])
00601 TimerIntFunc[TIMER3INPUTCAPTURE_INT]();
00602 }