2017-04-23 53 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. 閱讀數據表並確保端口設置正確,尤其是使用模擬選擇寄存器的模擬端口。

(我的名聲不夠高發表評論,我們對此深感抱歉。)