Du skulle annars kunna skriva om din kod lite och använda en timer till flera olika grejjer. Såg i din tidigare tråd att du lagt togglingen inne i timer-interruptet. Det finns ett annat alternativ ifall det inte är så tidskritiska grejjer som t.ex att blinka med en lysdiod.
Timer drivrutin: (fattas lite delar som init osv men denna är skriven mest för att du ska förstå prinsipen.
Kod: Markera allt
#define TIMER_INST_PER_MILLISEC BOARD_FOSC/(1000*4)
#define U16MS_TO_TICK(time) (uint16)((TIMER_INST_PER_MILLISEC*time)/(256ull))
uint16 timerRead16(void)
{
uint16 tick = 0;
INTCONbits.TMR0IE = 0; // Disable interrupt
tick = TMR0H;
tick <<=8;
tick |= TMR0L;
INTCONbits.TMR0IE = 1;
return tick;
}
uint16 timerGetDiff16( uint16 timestamp )
{
uint16 diff;
diff = timerRead16();
diff = diff - timestamp;
return diff;
}
void timerInit(void)
{
TMR0H = 0;
TMR0L = 0;
INTCONbits.TMR0IE = 0; // Disable interrupt
// Timer0 on, 16-bit, internal timer, 1:256 prescalar
T0CON = 0x86;
}
För att använda ovanstående kod på ett bra sätt kan du skriva:
Kod: Markera allt
void blinkLed(void)
{
static uint16 myTimestamp;
// LEDPIN är en bitmask för din diod
if( PORTB & LEDPIN)
{
// lysdioden är tänd
if( timerGetDiff16( myTimestamp) > U16MS_TO_TICK( 100 )
{
// låt den vara tänd i 100 ms därefter släck
myTimestamp = timerRead16();
PORTB &= ~LEDPIN;
}
}else
{
if( timerGetDiff16( myTimestamp) > U16MS_TO_TICK( 20 )
{
// låt den vara släckt 20 ms därefter tänd
myTimestamp = timerRead16();
PORTB |= LEDPIN;
}
}
}
På detta sättet får möjlighet att hålla koll på tiden i flera små applikationer samtidigt. Nackdelen är att du får inte samma exakthet i tidmätningen jämfört med att använda en timer för varje grejj. Detta pga att det finns risk för att en annan applikation gör något som tar lite längre tid, t.ex räknar ut ett värde på en vektor, läser ett SD-kort etc. Men i ditt fall verkar det hur lungt som helst.