我正在尝试设置一个延迟0.25秒的计时器1并且遇到了困难。
我使用以下计算来获得寄存器值:
FCPU = FOSC / 4 = 16 MHz / 4 = 4 MHz
Ftimer = FCPU /预分频器= 4MHz / 8 = 0.5 MHz
Ttimer = 1 / Ftimer = 1 / 0.5 MHz = 2 us
计数=所需延迟/ Ftimer = 0.25 / 2 us = 125000
此特定芯片具有以下预分频值:
定时器0:2,4,8,16,32,64,128,256
计时器1:1,2,4,8
计时器2:1,4,16
由于这个计数对于16位寄存器而言太大了,我的计算错了吗?或者我只是因为我想要的那个特殊延迟而运气不好?
答案 0 :(得分:0)
如果你想要纯粹的硬件解决方案,那你就不走运了。你并不遥远,如果你的应用程序允许它,你的CPU速度减半将给你你想要的间隔。另一种选择是使用软件计数器来跟踪溢出次数。在上面的示例中,您希望在每次第二次溢出时执行操作。
答案 1 :(得分:0)
您始终可以使用与计时器绑定的中断。
在该中断上设置计数器,然后在计数器达到所需数量后运行该过程。
它不是最优雅的解决方案,但通常它对PIC来说非常有效。
答案 2 :(得分:0)
请投票的人请提供反馈意见。如果问题显示没有研究,不清楚或没有用,那么你就会投票。我的问题不属于这些类别。正如你所看到的,除非你是盲人,否则别人会明白我在问什么。
为了回答我原来的问题,我原来的心态只能从硬件中产生我想要的延迟。我甚至没有想过使用“滴答计数器”,就像mplab所说的那样。基本上,滴答计数器计算最大延迟发生的次数,以尽可能接近所需的延迟。
例如,
如果我有一个32 MHz振荡器,4个预分频器为4,寄存器大小为8的时钟分频器
我会:
32/4 = 8 MHz(时钟分频器) 8/4 = 2 MHz(预分频器)
所以我的指令频率是2 MHz 这是1/8000000 = 0.0000005秒的指令周期。 这也是我给出当前振荡频率,时钟分频器和预分频器时的最小延迟。
因为我有一个8位寄存器,其最大十进制值为256 我的最大延迟为256 * 0.0000005 = 0.000128秒
如果我所希望的延迟不在这些范围内,那么它太大了,我会得到负的寄存器值
延迟计数=所需延迟/定时器周期 如果我想要一个250毫秒的延迟,那将是0.25 / 0.0000005,这将给我一个远远大于8位寄存器的值。
对于PR寄存器值,我们将采用256 - 计数,如果计数远远大于最大寄存器值,则会给出负数。
为了计算在给定我们可能具有的最大延迟的情况下产生所需延迟所需的滴答值,我们将采取所需的延迟/最大延迟。
所以0.25 / 0.000128 = 1,953.125 向上/向下舍入我们得到以下值:
截至1954年:0.250112
降至1953年:0.249984
因此,根据我们需要的准确程度,看起来1954将是正确的计时器。
因此,在32 MHz振荡器,4分频器,预分频器为4,寄存器大小为8,最大值为256的情况下,延迟时间为0.25秒,最大延迟为0.000128秒1954年的计数器计数器导致延迟
1954 * 0.000128 = 0.250112秒
感谢您的帮助!