【发布时间】:2021-04-22 08:09:05
【问题描述】:
我正在使用 Proteus 仿真软件上的以下电路测试我的微控制器 PIC18f4550。
我的目标是打开 LED 一秒钟然后将其关闭。
以下是我的代码:
#include <xc.h>
#define _XTAL_FREQ 8000000
void delay(int t);
void main(void)
{
TRISB = 0x00; // set Port B as output
LATB = 0x00; // set all 8 outputs on Port B to 0
delay(20);
LATB = 1b00000001; // set port B0 to 1
delay(20);
LATB = 1b00000000; // set port B0 to 0
}
void delay(int t)
{
for (int i=0; i<t ; i++)
{
__delay_ms(50); //using xc8 compiler internal delay function - it doesn't like it if delay is too big so it is used inside for loop
}
}
运行模拟时,LED 会一直闪烁。我没有在我的程序中使用任何循环,我只打算打开一次 LED。是什么导致 LED 持续闪烁?
[编辑 1]
我找到了解决我的问题的方法。我只是在代码末尾添加了while(1){},以阻止 PIC 进入无限循环。
【问题讨论】:
-
它在程序内存中循环。它从复位向量开始执行,然后完成执行程序,然后对所有空白程序内存地址执行 NOP 或 RETLW 一次,在 NOP 的情况下,PC 到达内存的末尾:在 RETLW 的情况下,它的堆栈下溢并导致设备复位,然后它再次通过复位向量重新启动(PC = 0)。您使用的是硬件循环而不是软件循环:D.
-
您可能会对微控制器在执行
main()之前运行的代码量感到惊讶——而且该微控制器可能不希望您从main()返回...这样做将重新启动该程序。您可能会有一个您没有注意到的名为 cstart.c(或 .asm)的文件...
标签: c infinite-loop pic mplab xc8