2017-04-23 57 views
0

我的面包板上有一个简单的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; 
} 

回答

5

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

最有可能的是,从main返回的结果返回到启动代码,并最终(或者“意外”或故意)返回到重置向量,从头开始您的程序。

如果您希望MCU实际上“停止”,则“无需执行任何操作”,您需要强制它进入无限循环而不是return。但是,这不是MCU上的常见方法。

+1

没有可能,当然:“执行到的主()结束后,由编译器添加的代码跳回复位向量,然后设备再次执行运行时启动代码和main()函数。“ - 资料来源:http://ww1.microchip.com/downloads/en/DeviceDoc/50002173A.pdf。 – Unimportant

+0

@重要的是,这些日子真的很重要吗? – tofro

+0

死亡和税收,就像他们一直拥有的一样。 – Unimportant

0

你不在操作系统上,你能告诉我们反汇编显示调用main和它返回的内容吗?或者如果你在主结束之前放了一个无限循环(while(1)continue;)你会有5次闪烁吗?

1

我试着在for循环之后添加一个while循环,并且发生了一些奇怪的事情。它似乎是同时执行for和while循环。灯会闪烁链路正常,然后快速闪烁,几乎像一个口吃,然后正常闪烁,等等..但它从来没有停止闪烁

检查看门狗定时器。如果已设置,则在设定的时钟周期数量后,MCU将重置并重复运行代码。您可以使用CLRWDT()来重置看门狗定时器或关闭WDT。 我强烈建议要经过这些步骤,以确保MCU不会如期望的那样

  1. 检查PIC配置位,他们是正确安装?请参阅微芯片程序文件夹中的文档/ docs/chips
  2. 确保振荡器设置正确。
  3. 阅读数据表并确保端口设置正确,尤其是使用模拟选择寄存器的模拟端口。

(我的名声不够高发表评论,我们对此深感抱歉。)