就是忽略了PIC 16F1827 的一个 fail-safe clock monitor。
Fail-safe clock monitor 是一些PIC芯片的新功能, 就是当晶振发生错误后, 启动内部的Internal Oscillator。
如果, 不打算使用这个fail-safe clock monitor, 最好是把他关闭。
我的一个汽车安防产品, 之前是使用16F628A的, 后来转用16F1827, 就只是把源码略做修改, 就出货了。
最近, 客户的客户有投诉, 产品会死机。。
经过检查后, 发现当用手去触摸16F1827 的16脚, 接着, 发现PIC 的反应变得异常的缓慢。。
本来是16Mhz, 正常时LED 闪灯只是0.5~1秒, 现在变成几十秒。。变得超级慢~~
过后想起, 很可能是Fail-safe clock monitor,就看看资料手册, 可以在Fuse 里面关闭。
再查看CCS C 16F1827.h
//////// Program memory: 4096x14 Data RAM: 368 Stack: 16
//////// I/O: 16 Analog Pins: 12
//////// Data EEPROM: 256
//////// C Scratch area: 77 ID Location: 8000
//////// Fuses: LP,XT,HS,RC,INTRC_IO,ECL,ECM,ECH,NOWDT,WDT_SW,WDT_NOSL,WDT
//////// Fuses: PUT,NOPUT,NOMCLR,MCLR,PROTECT,NOPROTECT,CPD,NOCPD,NOBROWNOUT
//////// Fuses: BROWNOUT_SW,BROWNOUT_NOSL,BROWNOUT,CLKOUT,NOCLKOUT,NOIESO
//////// Fuses: IESO,NOFCMEN,FCMEN,WRT,WRT_800,WRT_200,NOWRT,PLL_SW,PLL
//////// Fuses: NOSTVREN,STVREN,BORV25,BORV19,DEBUG,NODEBUG,NOLVP,LVP
////////
复制代码
在第21行, 找到这个Fuse NOFCMEN, 加入到程序的Fuse里, 问题就解决了。
修改后的Fuse
#include <16F1827.H>
#fuses HS, nolvp, PROTECT, WDT, put, brownout, nomclr, NOFCMEN
#use delay(crystal=16MHz, clock=16MHz, restart_wdt)
复制代码
希望PIC 同好, 要注意这个Fuse, 不要犯和我同样的错误哦~转载
|