Library_timers
// #include "http://www.byvac.com//mBlib/flb/Library/2016/lib_tmr.bas"
Timer
ConstantsTIMER1 ** This timer from 2.08/76 on is used for scheduling (tasks)
TIMER2
TIMER3
TIMER4
TIMER5
TIMER23 - This is the timer 2 and 3 combination - up to 214 seconds
TIMER45 - This is the timer 4 and 5 combination - up to 214 seconds
A timer has three main parameters, the configuration that is set by timer_init(), the value of the current timer which when enabled is counting up, refered to in the data sheet as TMR register. This is controlled by tmr_clr() and tmr_get() and also the count limit, refered to in the data sheet as PR.
- tmr_init(*tmr(),prescale,limit) Initialises and starts timer [1]
- tmr_stop(*tmr())
- tmr_start(*tmr())
- tmr_get(*tmr()) Gets the count value of the timer (register TMRn)
- tmr_clr(*tmr()) Clears TMR - restes the timer back to 0
- tmr_limit(*tmr(),limit) Sets register PRn [2]
tmr_init(*timer(),prescale,limit) [1]
A timer can be specified by these two values. When the limit is reached the TMR register resets and starts counting up again from zero. Also a flag is set that can be either read or used by the interrupt system.
Calculate period for pre-scale assuming 40MHz perif clock
prescale counts / ms 1 second *32 bits needed Timer 1 pre
256 (7) = 6.4 us 156.25 39063 (250mS) (3)
64 (6) = 1.6 us 625 625000 * (2)
32 (5) = 0.8 us 1250 1250000 *
16 (4) = 0.4 us 2500 2500000 *
8 (3) = 0.2 us 5000 5000000 * (1)
4 (2) = 0.1 us 10000 10000000 *
2 (1) = 0.05 us 20000 20000000 *
1 (0) = 0.025us 40000 40000000 * (0)
The table gives the pre-scale value (in brackets) that can be used for the given counts per mS, timer 1 has different pre-scale values. NOTE: any value over 0xffff (65,635) requires a 32 bit combination timer.
tmr_limit(*tmr(),limit) [2]
This will simply set the PRn resister to some other value from that which was set using the tmr_init() function.
Timer Interrupts
ir_set(*interrupt(), pri,function_name$)
This is the function that will associate a timer interrupt with a user defined function:
*interrupt() is TIMERn
pri is the priority 0 to 7 but 3 should be used
function_name$ is the name of a user defined function, see the example
Example: Make hello world print out every 10 seconds
1) create a function to be called
function hello()
print "\nHello world"
endf
2) Set the timer to interrupt every 10 seconds, this will need a 32 bit timer
tmr_init(*TIMER23(),7,1562500)
3) create an entry into the interrupt table
ir_set(*TIMER23(),3,"hello")
The interrupt beigins imediately and will cause "hello World" to be output every 10 seconds. Note just the "hello" is used to specify the function.