PIC 笔记之 定时器模块

Timer0 模块是 8 位定时器 / 计数器

1、定时器模式
寄存器 TMR0 会在每个指令周期递增,当从 0xFF 递增到 0x00 的时候便会产生中断,通过中断间隔定时执行任务。

8 位定时器能延时的范围

震荡频率越高,速度越快,频率越低,速度越慢,根据指令周期需要 4 个震荡周期,选用最低频率 125KHZ 可以计算一条指令需要消耗 1/125000*4,即 32us。 8 位定时器最多能递增 256 个指令周期,也就能延时 32*256 = 8192us。 而 Timer0 模块有8个预分频比选项,范围从 1:2 至 1:256,所以可以把频率再降低,1/(125000/256)*4,即一条指令就可以使用 8192us,那么递增 256 个周期就能延时 8192*256 = 2097152us。用同样方法计算最高频率 32MHZ,一条指令仅需 1/32000000*4 = 0.125us (1s = 1000000us

8 位定时器延时计算

比如想要延时 1000us,如何计算 TMR0 初始值?如果执行一条指令需要 32us, 那么 1000us, 就可以执行 1000/32 = 31.25 条指令,但是指令无法用分数来执行的,所以选择恰当的震荡频率是必要的。这里选用 4MHZ 频率,执行一条指令刚好使用 1us, 1000us 就要使用 1000 条指令,但是又已经远超了 8 位 TMR0 的取值范围(256)。怎么办呢? 可以使用笨方法,一个一个频率去计算测试。还有一种通过计算可知,频率都是以2的倍数递增,指令周期以2的倍数递减,比如,当频率为 1MHZ 时,指令周期为 4us,为 2MHZ 时,指令周期为 2us,为 4MHZ 时,指令周期为 1us。那么可以发现 1000/8 = 125,刚好值在 TMR0 范围。所以设置指令周期为 8us 的频率即可,即 500KHZ。1000us 需要 125 个指令周期,TMR0 就需要递增 125 次才能产生中断。TMR0 的值为 255 – 125 = 130,TMR0 的值从 130 开始递增,递增 125 次,当达到 255 再递增时就产生了中断。有一个公式很方便的计算 TMR0 的初始值:
TMRO = 255 - 延时时间(s)*震荡频率/4