-
PORTA修改为写LATA
根据 读-修改-写 三段原理可以得知
写PORTA的指令时,从PORTA中读取出来的值,事实上是I/O引脚的电压值,而IO引脚的电压值,实际上是收到外部电路的影响的值,因此既有可能是高电位,也有可能是低电位,那么在读取之后,就会修改掉原本不应该修改的位,之后再写入,输出,得到的结果就不是期望值
但是写LATA指令的时候,读LATA的接口是来自于锁存器Q,不会因为外部电路而改变,所以,在写指令的时候是完全覆盖的,因此 我们把原本通过PORTA来控制灯光亮灭的方案改成了使用LATA来控制
- 我们发现修改之后,灯泡保持常量,不能看出是在闪烁还是在常量
因此,我们进行以下调试
我们假定是因为闪烁太快导致的视觉残留
我们进行了以下操作
- 修改了内部振荡器的频率为 31k(最小频率)
-
在循环代码中加入了4行nop,以延长时延时间
发现仍然不行,我们继续debug,发现nop不能放在delay后面,否则将会造成死循环,无法跳出,灯泡常量,修改nop置于delay前面。
调试成功
led灯成功按照期望闪烁
但是仔细观察发现,每闪几下,led灯会突然闪烁一下,而且呈现周期性状况
考虑之前,猜测可能是WDT看门狗的问题
因此修改看门狗配置
通过BANKSEL CONFIG1 发现报错
检查代码发现代码头文件已经写好了CONFIG1的配置
#include "p16f1786.inc"
; CONFIG1
; __config 0xFFFF
__CONFIG _CONFIG1, _FOSC_ECH & _WDTE_ON & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_ON & _CLKOUTEN_OFF & _IESO_ON & _FCMEN_ON
; CONFIG2
; __config 0xFFFF
__CONFIG _CONFIG2, _WRT_OFF & _VCAPEN_OFF & _PLLEN_ON & _STVREN_ON & _BORV_LO & _LPBOR_OFF & _LVP_ON
将WDTE_ON修改为 WDTE_OFF
编译下载,成功,灯泡正常闪烁!!!