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(TIMSK, 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
00184 void timer0ClearOverflowCount(void)
00185 {
00186
00187 Timer0Reg0 = 0;
00188 Timer0Reg1 = 0;
00189 }
00190
00191 long timer0GetOverflowCount(void)
00192 {
00193
00194
00195 return Timer0Reg0;
00196 }
00197
00198 void timer2ClearOverflowCount(void)
00199 {
00200
00201 Timer2Reg0 = 0;
00202 Timer2Reg1 = 0;
00203 }
00204
00205 long timer2GetOverflowCount(void)
00206 {
00207
00208
00209 return Timer2Reg0;
00210 }
00211
00212
00213 void timer1PWMInit(u08 bitRes)
00214 {
00215
00216
00217
00218
00219 if(bitRes == 9)
00220 {
00221 sbi(TCCR1A,WGMA1);
00222 cbi(TCCR1A,WGMA0);
00223 }
00224 else if( bitRes == 10 )
00225 {
00226 sbi(TCCR1A,WGMA1);
00227 sbi(TCCR1A,WGMA0);
00228 }
00229 else
00230 {
00231 cbi(TCCR1A,WGMA1);
00232 sbi(TCCR1A,WGMA0);
00233 }
00234
00235
00236
00237
00238 outb(OCR1AH, 0);
00239 outb(OCR1AL, 0);
00240
00241 outb(OCR1BH, 0);
00242 outb(OCR1BL, 0);
00243
00244 outb(OCR1CH, 0);
00245 outb(OCR1CL, 0);
00246 }
00247
00248 void timer1PWMOff(void)
00249 {
00250
00251 cbi(TCCR1A,WGMA1);
00252 cbi(TCCR1A,WGMA0);
00253
00254
00255
00256 timer1PWMAOff();
00257 timer1PWMBOff();
00258 timer1PWMCOff();
00259 }
00260
00261 void timer1PWMAOn(void)
00262 {
00263
00264
00265 sbi(TCCR1A,COMA1);
00266 cbi(TCCR1A,COMA0);
00267 }
00268
00269 void timer1PWMBOn(void)
00270 {
00271
00272
00273 sbi(TCCR1A,COMB1);
00274 cbi(TCCR1A,COMB0);
00275 }
00276
00277 void timer1PWMCOn(void)
00278 {
00279
00280
00281 sbi(TCCR1A,COMC1);
00282 cbi(TCCR1A,COMC0);
00283 }
00284
00285 void timer1PWMAOff(void)
00286 {
00287
00288
00289 cbi(TCCR1A,COMA1);
00290 cbi(TCCR1A,COMA0);
00291 }
00292
00293 void timer1PWMBOff(void)
00294 {
00295
00296
00297 cbi(TCCR1A,COMB1);
00298 cbi(TCCR1A,COMB0);
00299 }
00300
00301 void timer1PWMCOff(void)
00302 {
00303
00304
00305 cbi(TCCR1A,COMC1);
00306 cbi(TCCR1A,COMC0);
00307 }
00308
00309 void timer1PWMASet(u16 pwmDuty)
00310 {
00311
00312
00313
00314
00315
00316 outp( (pwmDuty>>8), OCR1AH);
00317 outp( (pwmDuty&0x00FF), OCR1AL);
00318 }
00319
00320 void timer1PWMBSet(u16 pwmDuty)
00321 {
00322
00323
00324
00325
00326
00327 outp( (pwmDuty>>8), OCR1BH);
00328 outp( (pwmDuty&0x00FF), OCR1BL);
00329 }
00330
00331 void timer1PWMCSet(u16 pwmDuty)
00332 {
00333
00334
00335
00336
00337
00338 outp( (pwmDuty>>8), OCR1CH);
00339 outp( (pwmDuty&0x00FF), OCR1CL);
00340 }
00341
00342
00343 void timer3PWMInit(u08 bitRes)
00344 {
00345
00346
00347
00348
00349 if(bitRes == 9)
00350 {
00351 sbi(TCCR3A,WGMA1);
00352 cbi(TCCR3A,WGMA0);
00353 }
00354 else if( bitRes == 10 )
00355 {
00356 sbi(TCCR3A,WGMA1);
00357 sbi(TCCR3A,WGMA0);
00358 }
00359 else
00360 {
00361 cbi(TCCR3A,WGMA1);
00362 sbi(TCCR3A,WGMA0);
00363 }
00364
00365
00366
00367
00368 outb(OCR3AH, 0);
00369 outb(OCR3AL, 0);
00370
00371 outb(OCR3BH, 0);
00372 outb(OCR3BL, 0);
00373
00374 outb(OCR3CH, 0);
00375 outb(OCR3CL, 0);
00376 }
00377
00378 void timer3PWMOff(void)
00379 {
00380
00381 cbi(TCCR3A,WGMA1);
00382 cbi(TCCR3A,WGMA0);
00383
00384
00385
00386 timer3PWMAOff();
00387 timer3PWMBOff();
00388 timer3PWMCOff();
00389 }
00390
00391 void timer3PWMAOn(void)
00392 {
00393
00394
00395 sbi(TCCR3A,COMA1);
00396 cbi(TCCR3A,COMA0);
00397 }
00398
00399 void timer3PWMBOn(void)
00400 {
00401
00402
00403 sbi(TCCR3A,COMB1);
00404 cbi(TCCR3A,COMB0);
00405 }
00406
00407 void timer3PWMCOn(void)
00408 {
00409
00410
00411 sbi(TCCR3A,COMC1);
00412 cbi(TCCR3A,COMC0);
00413 }
00414
00415 void timer3PWMAOff(void)
00416 {
00417
00418
00419 cbi(TCCR3A,COMA1);
00420 cbi(TCCR3A,COMA0);
00421 }
00422
00423 void timer3PWMBOff(void)
00424 {
00425
00426
00427 cbi(TCCR3A,COMB1);
00428 cbi(TCCR3A,COMB0);
00429 }
00430
00431 void timer3PWMCOff(void)
00432 {
00433
00434
00435 cbi(TCCR3A,COMC1);
00436 cbi(TCCR3A,COMC0);
00437 }
00438
00439 void timer3PWMASet(u16 pwmDuty)
00440 {
00441
00442
00443
00444
00445
00446 outp( (pwmDuty>>8), OCR3AH);
00447 outp( (pwmDuty&0x00FF), OCR3AL);
00448 }
00449
00450 void timer3PWMBSet(u16 pwmDuty)
00451 {
00452
00453
00454
00455
00456
00457 outp( (pwmDuty>>8), OCR3BH);
00458 outp( (pwmDuty&0x00FF), OCR3BL);
00459 }
00460
00461 void timer3PWMCSet(u16 pwmDuty)
00462 {
00463
00464
00465
00466
00467
00468 outp( (pwmDuty>>8), OCR3CH);
00469 outp( (pwmDuty&0x00FF), OCR3CL);
00470 }
00471
00472
00473
00474 TIMER_INTERRUPT_HANDLER(SIG_OVERFLOW0)
00475 {
00476 Timer0Reg0++;
00477 if(!Timer0Reg0)
00478 Timer0Reg1++;
00479
00480
00481 if(TimerIntFunc[TIMER0OVERFLOW_INT])
00482 TimerIntFunc[TIMER0OVERFLOW_INT]();
00483 }
00484
00485
00486 TIMER_INTERRUPT_HANDLER(SIG_OVERFLOW1)
00487 {
00488
00489 if(TimerIntFunc[TIMER1OVERFLOW_INT])
00490 TimerIntFunc[TIMER1OVERFLOW_INT]();
00491 }
00492
00493
00494 TIMER_INTERRUPT_HANDLER(SIG_OVERFLOW2)
00495 {
00496 Timer2Reg0++;
00497 if(!Timer2Reg0)
00498 Timer2Reg1++;
00499
00500
00501 TimerPauseReg++;
00502
00503
00504 if(TimerIntFunc[TIMER2OVERFLOW_INT])
00505 TimerIntFunc[TIMER2OVERFLOW_INT]();
00506 }
00507
00508
00509 TIMER_INTERRUPT_HANDLER(SIG_OVERFLOW3)
00510 {
00511
00512 if(TimerIntFunc[TIMER3OVERFLOW_INT])
00513 TimerIntFunc[TIMER3OVERFLOW_INT]();
00514 }
00515
00516
00517 TIMER_INTERRUPT_HANDLER(SIG_OUTPUT_COMPARE0)
00518 {
00519
00520 if(TimerIntFunc[TIMER0OUTCOMPARE_INT])
00521 TimerIntFunc[TIMER0OUTCOMPARE_INT]();
00522 }
00523
00524
00525 TIMER_INTERRUPT_HANDLER(SIG_OUTPUT_COMPARE1A)
00526 {
00527
00528 if(TimerIntFunc[TIMER1OUTCOMPAREA_INT])
00529 TimerIntFunc[TIMER1OUTCOMPAREA_INT]();
00530 }
00531
00532
00533 TIMER_INTERRUPT_HANDLER(SIG_OUTPUT_COMPARE1B)
00534 {
00535
00536 if(TimerIntFunc[TIMER1OUTCOMPAREB_INT])
00537 TimerIntFunc[TIMER1OUTCOMPAREB_INT]();
00538 }
00539
00540
00541 TIMER_INTERRUPT_HANDLER(SIG_OUTPUT_COMPARE1C)
00542 {
00543
00544 if(TimerIntFunc[TIMER1OUTCOMPAREC_INT])
00545 TimerIntFunc[TIMER1OUTCOMPAREC_INT]();
00546 }
00547
00548
00549 TIMER_INTERRUPT_HANDLER(SIG_INPUT_CAPTURE1)
00550 {
00551
00552 if(TimerIntFunc[TIMER1INPUTCAPTURE_INT])
00553 TimerIntFunc[TIMER1INPUTCAPTURE_INT]();
00554 }
00555
00556
00557 TIMER_INTERRUPT_HANDLER(SIG_OUTPUT_COMPARE2)
00558 {
00559
00560 if(TimerIntFunc[TIMER2OUTCOMPARE_INT])
00561 TimerIntFunc[TIMER2OUTCOMPARE_INT]();
00562 }
00563
00564
00565 TIMER_INTERRUPT_HANDLER(SIG_OUTPUT_COMPARE3A)
00566 {
00567
00568 if(TimerIntFunc[TIMER3OUTCOMPAREA_INT])
00569 TimerIntFunc[TIMER3OUTCOMPAREA_INT]();
00570 }
00571
00572
00573 TIMER_INTERRUPT_HANDLER(SIG_OUTPUT_COMPARE3B)
00574 {
00575
00576 if(TimerIntFunc[TIMER1OUTCOMPAREB_INT])
00577 TimerIntFunc[TIMER1OUTCOMPAREB_INT]();
00578 }
00579
00580
00581 TIMER_INTERRUPT_HANDLER(SIG_OUTPUT_COMPARE3C)
00582 {
00583
00584 if(TimerIntFunc[TIMER3OUTCOMPAREC_INT])
00585 TimerIntFunc[TIMER3OUTCOMPAREC_INT]();
00586 }
00587
00588
00589 TIMER_INTERRUPT_HANDLER(SIG_INPUT_CAPTURE3)
00590 {
00591
00592 if(TimerIntFunc[TIMER3INPUTCAPTURE_INT])
00593 TimerIntFunc[TIMER3INPUTCAPTURE_INT]();
00594 }