X-Git-Url: https://oss.titaniummirror.com/gitweb?a=blobdiff_plain;f=tmr.c;h=34a9733e5737aebf2f95e9f0c070fd76ffd0a027;hb=7716131e4924c8bdfed9792e6425353fa69ea8b4;hp=fec23f925482a4776f7580fcf254a5cacd3f12d7;hpb=5fa3659d382d2055d1bdb1c06b6b82dcfc68bb95;p=rgblamp.git diff --git a/tmr.c b/tmr.c index fec23f9..34a9733 100644 --- a/tmr.c +++ b/tmr.c @@ -13,11 +13,11 @@ #include "bit.h" persistent tmr_time_t _tmr_ticks; +tmr_bitno_t _tmr_on; +tmr_bitno_t _tmr_periodic; +static tmr_bitno_t _tmr_flag; static tmr_time_t _tmr_t0[TMR_COUNT]; static tmr_time_t _tmr_elapsed[TMR_COUNT]; -static tmr_bitno_t _tmr_on; -static tmr_bitno_t _tmr_periodic; -static tmr_bitno_t _tmr_fired; /* Timer0 with 1:256 prescale given Fosc (_XTAL_FREQ). * Timer0 is clocked by Fosc/4. @@ -37,7 +37,7 @@ static tmr_bitno_t _tmr_fired; void tmr_init() { - /* Configure Timer0 to overflow every 32 msec. Adjust with + /* Configure Timer0 to overflow every 32 msec. Adjust for * Fosc as set in picinit.[ch]. At 4 MHz, prescale is 1:128. * TMR0CS = 0, PSA = 0, PS = 0b110 */ @@ -52,7 +52,7 @@ void tmr_start(tmr_bitno_t t, tmr_time_t elapsed) ndi(); bit_set(_tmr_on, t); bit_clr(_tmr_periodic, t); - bit_clr(_tmr_fired, t); + bit_clr(_tmr_flag, t); _tmr_t0[t] = _tmr_ticks; _tmr_elapsed[t] = elapsed; nei(); @@ -63,8 +63,8 @@ void tmr_startAt(tmr_bitno_t t, tmr_time_t t0, tmr_time_t elapsed) ndi(); bit_set(_tmr_on, t); bit_clr(_tmr_periodic, t); - bit_clr(_tmr_fired, t); - _tmr_t0[t] = t0 + elapsed; + bit_clr(_tmr_flag, t); + _tmr_t0[t] = t0; nei(); } @@ -73,8 +73,8 @@ void tmr_startPeriodic(tmr_bitno_t t, tmr_time_t elapsed) ndi(); bit_set(_tmr_on, t); bit_set(_tmr_periodic, t); - bit_clr(_tmr_fired, t); - _tmr_t0[t] = _tmr_ticks + elapsed; + bit_clr(_tmr_flag, t); + _tmr_t0[t] = _tmr_ticks; _tmr_elapsed[t] = elapsed; nei(); } @@ -84,24 +84,22 @@ void tmr_startPeriodicAt(tmr_bitno_t t, tmr_time_t t0, tmr_time_t elapsed) ndi(); bit_set(_tmr_on, t); bit_set(_tmr_periodic, t); - bit_clr(_tmr_fired, t); - _tmr_t0[t] = t0 + elapsed; + bit_clr(_tmr_flag, t); + _tmr_t0[t] = t0; _tmr_elapsed[t] = elapsed; nei(); } bit tmr_fired(tmr_bitno_t t) { - /* FIXME: if called from ISR ndi()/nei() is not required */ - static unsigned char last_fired; unsigned char fired; ndi(); - fired = bit_get(_tmr_fired, t) != 0; + fired = bit_get(_tmr_flag, t); if (fired) - bit_clr(_tmr_fired, t); + bit_clr(_tmr_flag, t); nei(); - return fired; + return fired != 0; } void tmr_isr() @@ -110,8 +108,8 @@ void tmr_isr() TMR0IF = 0; _tmr_ticks++; for (tmr_bitno_t t = 0; t < TMR_COUNT; t++) { - if (_tmr_ticks - _tmr_t0[t] <= 0) { - bit_set(_tmr_fired, t); + if (bit_get(_tmr_on, t) && _tmr_ticks - _tmr_t0[t] >= _tmr_elapsed[t]) { + bit_set(_tmr_flag, t); if (bit_get(_tmr_periodic, t)) _tmr_t0[t] += _tmr_elapsed[t]; else