會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





啟動訊號的寫法
初級會員
註冊日期:
2016/05/03 21:00
所屬群組:
註冊會員
文章: 38
等級: 4; EXP: 94
HP : 0 / 98
MP : 12 / 689
離線
大家好,不好意思又來發問了。
想在程式中加入一個啟動功能,用了一個10K電阻將腳位Pull-High,開關壓下時,腳位對地,接收到0訊號後,觸發啟動flag,程式才開始運作。


第一個問題是,main()裡面的程式會重複執行嗎? 因為我一直理解是main{}裡面的程式只有在Reset時執行一次,之後循環執行while(1){}的程式,但假如我的while(1)沒有觸發的話 main{}會重複執行嗎?

因為我原本的寫法如下,後來想想不對,這樣我Reset後中斷始能的判斷式應該只掃一次,在去按開關應該沒效了才對,但是我用ICD3模擬卻發現可以觸發,這顛覆了我一直以來的觀念..
void main(void)
{
SYSTEM_Initialize();

if(IO_RA5_PORT == 0)
{
// Enable the Global Interrupts
INTERRUPT_GlobalInterruptEnable();

// Enable the Peripheral Interrupts
INTERRUPT_PeripheralInterruptEnable();
FlagReg1.Start_FLAG = 1;

}

if(FlagReg1.Start_FLAG)
{
while (1)
{
程式內容;
}
}
}

第二個問題:
因為我的程式中有很多中斷程式,所以我把中斷始能的程式也拉到主程式的while(1)裡面寫,但是TMR的計時器好像還是有在跑,是不是要把SYSTEM_Initialize();也放到if(IO_RA5_PORT == 0)裡面? 還是各位高手有更精湛的寫法可以讓小弟學習呢,謝謝。

void main(void)
{
SYSTEM_Initialize();

while (1)
{
if(IO_RA5_PORT == 0)
{
// Enable the Global Interrupts
INTERRUPT_GlobalInterruptEnable();

// Enable the Peripheral Interrupts
INTERRUPT_PeripheralInterruptEnable();
FlagReg1.Start_FLAG = 1;

}
if(FlagReg1.Start_FLAG)
{
程式內容;
}
}
}

6月29日 11:47:34
轉換PDF檔 列印


Re: 啟動訊號的寫法
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14480
等級: 73; EXP: 3
HP : 1080 / 1800
MP : 4826 / 75805
離線
我只能說,這樣的中斷控制架構會讓你陷入泥沼中無法自拔。

中斷對初學者而言應該是簡單就好,一般是在程式初始時就設定中斷的使用,不要在主程式裡再去做複雜的判斷來決定中斷的開啟。

6月29日 15:15:57
轉換PDF檔 列印


Re: 啟動訊號的寫法
資深會員
註冊日期:
2004/08/16 13:52
來自 台灣台南
所屬群組:
註冊會員
文章: 773
等級: 25; EXP: 9
HP : 0 / 602
MP : 257 / 24829
離線
問題1 建議你用燒錄的試試看,模擬器不準.
問題2 判斷IO的有沒按下去做你要做的事情就好了,不要去動中斷.

7月02日 14:52:27
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
Microchip連結

網頁捷徑
2018 Winter Elite 報名
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project