打印
[PIC®/AVR®/dsPIC®产品]

PIC16(L)F1826——定时器使用

[复制链接]
11746|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 JackTang1994 于 2021-9-17 17:40 编辑

#技术资源# #申请原创#

硬件平台:PIC16(L)F1826
软件平台:MPLAB X IDE V5.5、MPLAB Code Configurator V4

说明:由于MCC软件已经是一个非常成熟可视化芯片外设配置工具,所以现在我们为了提高开发效率都很少自己写芯片的外设配置代码了。寄存器相关的介绍就省略了,如果大家有兴趣可以自行阅读手册,了解寄存器的配置及使用。

参考资料:
PIC16(L)F1826数据手册:https://www.microchip.com/content/dam/mchp/documents/OTH/ProductDocuments/DataSheets/41391D.pdf
示例工程: Interrupt_Demo.X.zip (352.09 KB)

手册查看时钟源
时钟源从第5章的时钟介绍中可以得知,时钟模式类型有哪些,这个在后面看时钟树图以及设置MCC配置时需要使用到。


时钟树显示了整个MCU系统的时钟来源,通过IRCF<3:0>、FOSC<2:0>、SCS<1:0>这些位来设置时钟来源。比如:我们这里使用内部时钟16MHZ。
时钟源路径就是图中红线标出来所示。


定时器时钟源
定时器0的时钟来源:FOSC/4、T0CKI引脚的输入时钟、CPSCLK(电容传感器的时钟源)。这里我们选择FOSC/4时钟源(内部CPU的4分频时钟)即16HZ/4=4HZ。
定时器

说明:此框图要根据MCC软件中关于TIMER0的配置修改过的,原图中Fosc/4直接接到了Sync 2 TCY框这里。我个人认为这种接法是不对的,所以修改了。如有理解不对的地方,还请各位帮忙解惑下。谢谢!

MCC配置——外设添加
添加定时器TIMER0
Device Resource和Module窗口两个都可以添加外设,随便选择哪个窗口来添加外设TIMER0都行。


GPIO配置
GPIO就按照下图设置,具体添加请看我以前的**
设置RA1为为输出模式,用于驱动LED灯


1. 时钟源配置
选择Oscillator Module为INTOSC oscillator表示使用内部oscillator;System Clock Select选择INTOSC使用内部时钟作为系统时钟;Internal Clock选择16MHZ表示使用内部16MHZ时钟频率。

2. 定时器配置
结合上面分析的TIMER0时钟框图。
  • 这里选择Clock Source为Fosc/4即系统时钟的4分频(16MHZ / 4 = 4MHZ)。
  • 使能分频并选择分频系数为1:256即256分频(4MHZ / 256 = 15.625KHZ)。
  • 使能中断,并设置定时器中断周期为2ms。
  • Callback function这里选择1,因为我们用的定时器0的硬件延时(内部8位的计数器)。如果想在2ms基础上增加延时时间,那么可以设置Callback function这里的值(2ms整数倍)。如:需要定时1秒,那么Callback function的值就为 1秒(1000ms) / 2ms = 500


3. 中断配置
在Interrupt Module窗口勾选TMR0,使能定时器0的中断


生成工程代码
点击左侧的Generate按钮,生成配置好的工程代码


代码编写
1. 取消main函数中的中断使能代码的注释
2. 打开tim0.c文件,在文件开头处添加#include "mcc.h"头文件(LED操作函数在里面)
在TMR0_DefaultInterruptHandler函数中添加以下代码LED_Toggle();
void TMR0_DefaultInterruptHandler(void){
代码调试
  • 设置工程为Simulator软件仿真。
  • 点击Window菜单 >> Debugging >> IO View
  • 点击运行按钮,运行程序。然后再点击此按钮旁边的暂停按钮将程序暂停。然后观察IO View窗口中TMR0寄存器的值。此数值会变化表示定时器0已经开始运行并开始计数定时的了。


添加断点
在tim0.c文件中TMR0_DefaultInterruptHandler函数中LED_Toggle()前面添加断点。然后全速运行程序,发现程序会在断点处停止。表示已经产生了定时0中断,且中为时间为2ms




MCC-外设添加.PNG (305.96 KB )

MCC-外设添加.PNG

使用特权

评论回复
沙发
gaoyang9992006| | 2021-9-17 16:07 | 只看该作者

你这个用法是错误的,请注意上面那个函数。。。。参数是函数指针的那个函数,要用那个函数才对。虽然你这也能达到效果。

使用特权

评论回复
板凳
JackTang1994|  楼主 | 2021-9-17 17:37 | 只看该作者
gaoyang9992006 发表于 2021-9-17 16:07
你这个用法是错误的,请注意上面那个函数。。。。参数是函数指针的那个函数,要用那个函数才对。虽然你这 ...

TMR0_Initialize函数中注册的回调函数就是这个TMR0_DefaultInterruptHandler有什么不对?

使用特权

评论回复
地板
gaoyang9992006| | 2021-9-17 18:57 | 只看该作者
JackTang1994 发表于 2021-9-17 17:37
TMR0_Initialize函数中注册的回调函数就是这个TMR0_DefaultInterruptHandler有什么不对?
...

看来你不懂函数指针的用法。人家设计的是你可以调用函数指针去注册一个,这里是让你设置默认情况的。如果不在主函数注册一个函数指针到那个地址,才调用这个。

使用特权

评论回复
5
gaoyang9992006| | 2021-9-17 19:00 | 只看该作者
给你在另外一个贴说了,让你去看我的那个帖子里的代码,你估计都没去看。

使用特权

评论回复
6
JackTang1994|  楼主 | 2021-9-17 21:54 | 只看该作者
gaoyang9992006 发表于 2021-9-17 19:00
给你在另外一个贴说了,让你去看我的那个帖子里的代码,你估计都没去看。 ...

嗯嗯。你的方式确实优雅些

使用特权

评论回复
7
地瓜patch| | 2021-9-17 23:12 | 只看该作者
cube挺好用的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

61

帖子

0

粉丝