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

C 微控制器编程-程序不退出循环,c,for-loop,microcontroller,pic,mplab,C,For Loop,Microcontroller,Pic,Mplab,我在我的实验板上有一个简单的PIC16F18877电路设置,我成功地让一个LED在无限循环中闪烁。我试图将相同的代码放入for循环中,该循环只应执行5次,但LED一直闪烁 我的代码(带有XC8编译器的MPLAB): #包括 #定义频率8000000 int main() { TRISD1=0; 对于(int i=0;i

我在我的实验板上有一个简单的PIC16F18877电路设置,我成功地让一个LED在无限
循环中闪烁。我试图将相同的代码放入
for
循环中,该循环只应执行5次,但LED一直闪烁

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

#包括
#定义频率8000000
int main()
{
TRISD1=0;
对于(int i=0;i<5;i++)
{
RD1=1;
__延迟μms(500);
RD1=0;
__延迟μms(500);
}
返回0;
}

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

最有可能的是,从
main
返回到启动代码,并最终(偶然或故意)返回到重置向量,从一开始就启动程序


如果你想让MCU“停止”实际上是“什么也不做”,你需要强迫它进入一个无限循环,而不是
返回
。然而,这在MCU上不是一种常见的方法。

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

最有可能的是,从
main
返回到启动代码,并最终(偶然或故意)返回到重置向量,从一开始就启动程序


如果你想让MCU“停止”实际上是“什么也不做”,你需要强迫它进入一个无限循环,而不是
返回
。然而,这在MCU上不是一种常见的方法。

如果您不在这里的操作系统上,您能否向我们展示反汇编以显示对main的调用及其返回的内容?或者,如果在主端之前放置一个无限循环(当(1)继续时;)会有5次闪烁吗?

如果您不在这里的操作系统上,能否向我们展示反汇编以显示对主端的调用及其返回的内容?或者,如果在主端之前放置一个无限循环(当(1)继续时;),会有5次闪烁吗


我尝试在for循环之后添加一个while循环,但出现了一些奇怪的情况。它似乎同时执行for和while循环。灯光会正常闪烁,然后快速闪烁,就像口吃,然后正常闪烁,等等。。但它从未停止闪烁

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

  • 检查PIC配置位,它们是否设置正确?请参阅microchip program文件夹/docs/chips中的文档
  • 确保振荡器设置正确
  • 阅读数据表,确保端口设置正确,尤其是使用模拟选择寄存器的模拟端口
  • (我的声誉不高,无法发表评论,对此我深表歉意。)


    我尝试在for循环之后添加一个while循环,但出现了一些奇怪的情况。它似乎同时执行for和while循环。灯光会正常闪烁,然后快速闪烁,就像口吃,然后正常闪烁,等等。。但它从未停止闪烁

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

  • 检查PIC配置位,它们是否设置正确?请参阅microchip program文件夹/docs/chips中的文档
  • 确保振荡器设置正确
  • 阅读数据表,确保端口设置正确,尤其是使用模拟选择寄存器的模拟端口

  • (我的名声不够好,对此我深表歉意。)

    不太可能,当然:“在执行到main()的末尾后,编译器添加的代码跳回重置向量。然后设备再次执行运行时启动代码和main()函数。”-来源:.@不重要这些天到底什么才是真正确定的?死亡和税收,就像它们一直以来一样。我试图在for循环之后添加一个while循环,但奇怪的事情发生了。它似乎同时执行for和while循环。灯光会正常闪烁,然后快速闪烁,就像口吃,然后正常闪烁,等等。。但它从未停止闪烁——当然也不可能:“在执行到main()的末尾后,编译器添加的代码跳回重置向量。然后设备再次执行运行时启动代码和main()函数。”-来源:。@不重要这些天真正确定的是什么?死亡和税收,我试着在for循环之后添加一个while循环,结果发生了一些奇怪的事情。它似乎同时执行for和while循环。灯光会正常闪烁,然后快速闪烁,就像口吃,然后正常闪烁,等等。。但它从未停止闪烁
    #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;
    }