微控制器编程 - 程序不退出for循环

时间:2017-04-23 17:29:56

标签: c for-loop microcontroller pic mplab

我的面包板上有一个简单的PIC16F18877电路设置,我已成功获得一个LED在无限while循环内闪烁。我试图将相同的代码放在for循环中,该循环应该只执行5次,但LED会一直闪烁。

我的代码(带有XC8编译器的MPLAB):

#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;
}

3 个答案:

答案 0 :(得分:5)

您期望CPU从main返回时从哪里跳转?或者更确切地说,当你不告诉它该怎么做时,你期望它做什么?在台式计算机上,程序通常会返回到操作系统 - 在嵌入式系统上,没有。

最有可能的是,从main的返回返回到启动代码,最终(无意中&#34;意外&#34;或故意)到重置向量,从头开始启动程序。

如果您希望MCU停止&#34;停止&#34;实际上,&#34;什么都不做&#34;你需要强制它进入无限循环而不是return。然而,这不是MCU的常用方法。

答案 1 :(得分:1)

  

我尝试在for循环之后添加一个while循环,并发生了一些奇怪的事情。它似乎同时执行for和while循环。灯会闪烁链接正常,然后快速闪烁,几乎像口吃然后正常闪烁等等。但它永远不会停止闪烁

检查看门狗定时器。如果已设置,则mcu将在设定的时钟周期后重置,并反复运行代码。您可以使用CLRWDT()来重置看门狗定时器或只关闭WDT。 我强烈建议您完成这些步骤,以确保mcu按预期执行:

  1. 检查PIC配置位,它们是否正确设置?请参阅microchip program folder / docs / chips
  2. 中的文档
  3. 确保振荡器设置正确。
  4. 阅读数据表并确保端口设置正确,尤其是使用模拟选择寄存器的模拟端口。
  5. (我的声誉不足以发表评论,对此感到抱歉。)

答案 2 :(得分:0)

你不在这里的操作系统,你能告诉我们反汇编来显示对main的调用以及它返回的内容吗?或者如果你在主要结束之前放置一个无限循环(而(1)继续;)你会得到5次闪烁吗?