提到单片机,很多人第一反应是51或者STM32,PIC在国内的知名度相对低一些。其实Microchip的PIC系列在工控和汽车电子领域用得挺广,特别是8位的PIC16和PIC18,抗干扰能力强,价格也不贵。如果你手上正好有块PIC的开发板,想入门玩一玩,这篇文章说说我踩过的一些坑。
首先是选型。PIC的型号命名有一定规律,前缀PIC10、12、16、18、24、32代表不同系列,数字越大一般功能越强。8位机里PIC16F877A是经典款,资源适中,教程也多,适合新手。注意型号后缀,F代表Flash程序存储器,C代表OTP一次性可编程,现在基本都用F系列了。后缀的A、B表示版本修订,引脚兼容,但内部资源可能略有差异,看数据手册确认。
开发环境用MPLAB X IDE,这是Microchip官方免费提供的,基于NetBeans框架,支持Windows、Linux和Mac。安装的时候顺便把XC8编译器也装上,这是专门给8位PIC用的C编译器。MPLAB X自带代码配置器MCC,图形化界面点几下就能生成外设初始化代码,对新手很友好。不过自动生成的代码有时候比较冗余,老手可能更喜欢自己写寄存器配置。
PIC的烧录工具叫PICKit,现在常用的是PICKit3和PICKit4。接线很简单:VDD、VSS、PGD、PGC、MCLR,对应单片机的电源、地、数据、时钟和复位。烧录前检查一下配置位,特别是振荡器选项和看门狗。如果配置位设成外部晶振但板子上没焊晶振,程序下进去单片机就不干活了,新手很容易在这里卡半天。
PIC的C语言跟标准C差不多,但有些细节要注意。比如寄存器操作要区分Bank,PIC16F877A的寄存器分布在不同的Bank里,STATUS寄存器的RP0和RP1位决定当前Bank。直接写TRISA等于0x00可能不生效,因为TRISA在Bank1,而开机默认在Bank0,需要先切Bank。MPLAB X的XC8编译器有内置宏来处理这个,比如TRISA0等于0,编译器自动帮你切Bank,但理解原理还是有必要的。
中断系统是另一个容易出问题的地方。PIC16只有一个中断入口,所有中断源共用。进中断后要先查INTCON和PIR寄存器,判断是谁触发的中断,再分别处理。处理完记得清中断标志,不然一退出中断又马上进去了,程序卡死在中断里出不来。中断里不要放太耗时的操作,快进快出,复杂处理放主循环里用标志位触发。
最后说几个调试技巧。程序跑飞或者没反应,先查电源和晶振,这是基本功。然后用LED闪灯法定位:在主循环里加个LED翻转,看程序有没有跑起来。如果LED不闪,可能是复位了或者进死循环;如果闪得太快或者太慢,看门狗或者延时函数可能有问题。MPLAB X支持在线调试,用PICKit4可以单步执行、设断点、看寄存器,比printf大法效率高多了。
上一篇:Protel 99SE元件库使用技巧:找元件建库改封装
下一篇:没有了