微控制器编程 - 程序不能退出循环
问题描述:
我的面包板上有一个简单的PIC16F18877电路设置,并且我已经成功地获得了一个LED在无限的while
循环内闪烁。我试图在for
循环内放入相同的代码,该代码只能执行5次,但LED灯一直闪烁。微控制器编程 - 程序不能退出循环
我的代码(MPLAB与XC8编译):
#include <xc.h>
#define _XTAL_FREQ 8000000
int main()
{
TRISD1 = 0;
for (int i = 0; i < 5; i++)
{
RD1 = 1;
__delay_ms(500);
RD1 = 0;
__delay_ms(500);
}
return 0;
}
答
你预计CPU跳到从main
回报?或者说,当你不告诉它该做什么时,你期望它做什么?在台式计算机上,程序通常会返回到操作系统 - 在嵌入式系统上,没有。
最有可能的是,从main
返回的结果返回到启动代码,并最终(或者“意外”或故意)返回到重置向量,从头开始您的程序。
如果您希望MCU实际上“停止”,则“无需执行任何操作”,您需要强制它进入无限循环而不是return
。但是,这不是MCU上的常见方法。
答
你不在操作系统上,你能告诉我们反汇编显示调用main和它返回的内容吗?或者如果你在主结束之前放了一个无限循环(while(1)continue;)你会有5次闪烁吗?
答
我试着在for循环之后添加一个while循环,并且发生了一些奇怪的事情。它似乎是同时执行for和while循环。灯会闪烁链路正常,然后快速闪烁,几乎像一个口吃,然后正常闪烁,等等..但它从来没有停止闪烁
检查看门狗定时器。如果已设置,则在设定的时钟周期数量后,MCU将重置并重复运行代码。您可以使用CLRWDT()来重置看门狗定时器或关闭WDT。 我强烈建议要经过这些步骤,以确保MCU不会如期望的那样
- 检查PIC配置位,他们是正确安装?请参阅微芯片程序文件夹中的文档/ docs/chips
- 确保振荡器设置正确。
- 阅读数据表并确保端口设置正确,尤其是使用模拟选择寄存器的模拟端口。
(我的名声不够高发表评论,我们对此深感抱歉。)
没有可能,当然:“执行到的主()结束后,由编译器添加的代码跳回复位向量,然后设备再次执行运行时启动代码和main()函数。“ - 资料来源:http://ww1.microchip.com/downloads/en/DeviceDoc/50002173A.pdf。 – Unimportant
@重要的是,这些日子真的很重要吗? – tofro
死亡和税收,就像他们一直拥有的一样。 – Unimportant