PIC 笔记之 定时器模块

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

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

<span style="color: #0000ff;">8 位定时器能延时的范围</span>

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

<span style="color: #0000ff;">8 位定时器启动</span>

全局中断 GIE = 1,Timer0 中断允许位 TMR0IE = 1,中断标志位 TMR0IF = 0;当中断产生时,TMR0IF  会被置位 1,在处理中断后必须清零。Timer0 初始值设置  TMR0 = ?

<span style="color: #0000ff;">8 位定时器延时计算</span>

比如想要延时 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 初始值计算方法:

1、设置延时的时间 t(单位s)

2、指令周期所用的时间  (1/fosc)*4

3、令周期数量 n =  t/ ((1/fosc)4),简化 t (f/4)

4、初始值 TMR0 = 0xFF - n

以下为定时器 Timer0 预分频寄存器 OPTION_REG 选项:

赞(0) 打赏
取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

    暂无评论...