PIC死循环
PIC endless loop
我正在尝试对 PIC16F887 进行编程,但遇到了这个有趣的问题。我希望 LED 闪烁一次并永远停止,但它会重新开始并且永远不会停止,尽管看门狗被禁用。这是代码。提前致谢。
我用 MPLAB v8.84 编写了这篇文章,并使用 PICkit2 和 Hi-Tech C 编译器进行了编程。
#include <htc.h>
#include <pic.h>
#define _XTAL_FREQ 800000
//__CONFIG(0x3FF5);
//functions
void INITgeneral(void);
void ledshow (void);
void main(void) {
INITgeneral();
ledshow();
return;
}
void INITgeneral(void)
{
TRISA = 0;
TRISB = 0;
TRISC = 0;
TRISD = 0;
TRISE = 0;
PORTA = 0;
PORTB = 0;
PORTC = 0;
PORTD = 0;
PORTE = 0;
}
void ledshow(void)
{
__delay_ms(400);
RD0 = 1;
__delay_ms(400);
RD0 = 0;
}
built-in模拟器对于查找此类问题很有帮助,值得学习。
在“查看”选项卡下 select“反汇编列表”。请注意,从对 ledshow()
的调用返回后的下一条指令是 GOTO 0
指令,它将程序计数器加载为零,即复位向量。这就是你无休止地执行程序的原因。
要停止此行为,请将 main()
中的 return
替换为无限循环 while(1){};
我正在尝试对 PIC16F887 进行编程,但遇到了这个有趣的问题。我希望 LED 闪烁一次并永远停止,但它会重新开始并且永远不会停止,尽管看门狗被禁用。这是代码。提前致谢。
我用 MPLAB v8.84 编写了这篇文章,并使用 PICkit2 和 Hi-Tech C 编译器进行了编程。
#include <htc.h>
#include <pic.h>
#define _XTAL_FREQ 800000
//__CONFIG(0x3FF5);
//functions
void INITgeneral(void);
void ledshow (void);
void main(void) {
INITgeneral();
ledshow();
return;
}
void INITgeneral(void)
{
TRISA = 0;
TRISB = 0;
TRISC = 0;
TRISD = 0;
TRISE = 0;
PORTA = 0;
PORTB = 0;
PORTC = 0;
PORTD = 0;
PORTE = 0;
}
void ledshow(void)
{
__delay_ms(400);
RD0 = 1;
__delay_ms(400);
RD0 = 0;
}
built-in模拟器对于查找此类问题很有帮助,值得学习。
在“查看”选项卡下 select“反汇编列表”。请注意,从对 ledshow()
的调用返回后的下一条指令是 GOTO 0
指令,它将程序计数器加载为零,即复位向量。这就是你无休止地执行程序的原因。
要停止此行为,请将 main()
中的 return
替换为无限循环 while(1){};