EDN China > 其它文章 > 嵌入式系统 > 开发工具 > 正文
? 2016博客大赛-不限主题,寻找电子导师,大奖升级??

如何使PIC16Fxxx微控制器拥有8个计时器?

Luis G Uribe C?? 委内瑞拉加拉加斯?? 2010年04月30日 ?? 收藏0

  在嵌入式编程领域,对计时的需求经常会超过微控制器中的可用硬件计时器的有限数量。例如,Microchip公司的PIC16F84A只有一个计时器,但你可以借助Timers8.inc汇编代码创造出8个计时器。

  在等待某个预期的时段结束时,你经常会需要一个计时器,在该时段结束前,它会使你的程序暂停。为完成该任务,你可使用一个简单例程,比如Wait_on 2, .30,意思是2号计时器计时300 ms。时间值等于0.30个节拍,每个节拍为10ms。这样,你就能对输入数据执行防反跳(代码1)。

  如果使用Microchip公司的MPLab汇编程序,那么你无法确定某个参数是常量还是变量,因此你需要两个宏,为每种情形使用一个宏。在以下说明中,如果时间是常量,则使用K,而如果是变量,则使用V,比如Wait_onK或Wait_onV。同样的库还用于Freescale Semiconductor公司的MCHC9S08GP32微控制器中的TBM(时基模块),这个库在CodeWarrior汇编程序中,只使用一个宏——Wait_on。该函数既可处理常量,也可处理变量。

  “tmr”始终代表一个

大小在0和7之间的常量。它指定你对某个情况应用的计时器号码。你必须始终把时间乘以10,因此0.1为10ms。因此可把它用于10 ms至2560 ms的时间。精度为正负一个节拍。如果你需要用20 ms计时器触发某个事件,那么你也许最终只用了10 ms。因此为安全起见,应使用30 ms。最大值将是2560±1 ms,这是可以接受的。

  Timers8.inc对PIC16F84A的TMR0编程。你使用的计时器可以超过8个,或使用16位变量,但应记住:PIC16F84A只有68字节RAM。

  在某些场合,你需要启动某个计时器,但不需要使自己的程序一直暂停到超时。在此情况下,可使用Setimer 7, .20宏。你可启动7号计时器以便持续200 ms,这么做不会使你的程序暂停。当你需要知道各个计时器的状态时,可用TimeOut宏(TimeOut 2, Two_done)测试它们,意思是如果2号计时器已到时,则你将去往“Two_done”标签。你的任何主要代码标签都将适合。否则,你的程序将继续依次执行下一条指令。

  Setimer有两个版本。SetimerK 2,.20把2号计时器设置成计时200 ms,使用恒定时间0.20,而SetimerV 5, var则把5号计时器设置成计时300 ms(例),使用可变时间var,你在此前应该已为它赋值0.30。

  例如,你也许需要在ISR(中断服务例程)中采用若干计时器,来对中断引脚执行防反跳。该情况有些棘手,这是由于为外部INT引脚服务的例程在运行时,总中断处于禁用状态,PIC16F84A中通常是这样,但计时器例程要求你启用中断。该微控制器体系结构使人们很难启用ISR中的中断。但你可用ISRWait_onK或ISRWait_onV来实现自己的目的,正如在ISRWait_onK 7, 3中那样。

  该方法的工作方式与它的“孪生兄弟”Wait_on宏相似,唯一例外是你可在任何ISR中使用该方法——对于这类廉价微控制器,这是很好的附加值。但应小心使用它。由于你是在全局中断被禁用的状态下使ISR中的程序暂停数毫秒,因此中断等待时间会增加。如果你选择了利用预定的延时来对中断信号执行防反跳,那么你很可能将会遭遇同样问题。如果你在主程序中使用具体的计时器号码,那么就不应在ISR中使用它。

  为了使用Timers8.inc库,你必须包含库文件,并在计时器的代码之外定义一些变量。为了找到准确的位置来包含这个库并定义变量,应引用样本代码。请寻找<<< TMR0 <<<,它凸显了代码的相关部分。尤其应检查代码行“CBLOCK”和“INCLUDE <timers8.inc>”。

代码1

  应在你的程序中遵循以下方案:用Init8Timers宏来激活硬件和设置8个软件计时器。这个宏定义了8个变量,即Timer 0到Timer 7,每个变量均使用一个无符号字节。每个计时器均以10 ms为节拍,覆盖10至2560 ms范围。但你无需担心这些变量,这是因为相关的宏将会处理它们。1字节变量TimerFlags的一些位代表0号计时器至7号计时器的就绪状态。你无需处理这个内部变量。

  为了初始化0号至7号的某个计时器,应使用Setimer宏,比如SetimerK 2, .20(设置2号计时器,使它利用恒定时间0.20来计时200 ms)或SetimerV 5, var(设置5号计时器,使它利用值为0.30的可变时间来计时300 ms,0.30被事先存于var中)。各个Setime


上一页12下一页
?? ?? ??


打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮

1.扫描左侧二维码
2.点击右上角的分享按钮
3.选择分享给朋友
?? ??

微控制器? 计时器?

相关文章

我来评论
美国的游客
美国的游客 ??? (您将以游客身份发表,请登录 | 注册)
?
有问题请反馈