本帖最后由 ailingg 于 2017-12-3 17:20 编辑
最近调试看门狗复位,根据数据手册上复位标志的定义读取看门狗复位标志nTO,发现始终为1。翻遍数据手册都是说WDT复位时nTO为0,
没有其他特别提到的使用条件,但在main函数读取始终为1,网络搜索缘由也无果。
后来调试时查看汇编,WDT复位后nTO确实为0,但进入main函数之前执行了“CLRWDT”语句,致使进入main函数后nTO复位为1。问题
找到,只要在进入main函数前读取status即可,只是在C编程中无从着手,要到startup.as中进行汇编处理。最怕汇编了,在XC8编译器用户
指南中搜索“reset”,找到了相关问题阐述,原来人家早有了处理,也不知道说是自己学的肤浅还是这个小问题藏的挺深。
所谓的使能resetbits子选项,就是下图的红框所示,还挺不好找。
变量声明也不是XC8用户指南里说的那样,在pic.h末尾已经声明,如下,
/* The below reflect the state of TO and PD, respectively, which would otherwise
be trashed by startup code. */
extern __bank0 unsigned char __resetbits;
extern __bank0 __bit __powerdown;
extern __bank0 __bit __timeout;
在startup.as中的处理,如下,
psect init
start
; Save the TO, PD bit states before they are cleared by clrwdt instruction
global ___resetbits
global ___powerdown
global ___timeout
___resetbits equ 32
___powerdown equ (___resetbits*8)+3
___timeout equ (___resetbits*8)+4
clrf STATUS ;select bank 0
movf STATUS,w
movwf ___resetbits
psect end_init
global start_initialization
ljmp start_initialization ;jump to C runtime clear & initialization
|