會員登陸
帳號:

密碼:

記住我



忘記密碼?

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


正在流覽:   1 名訪客





PIC18 如何使用多中斷
初級會員
註冊日期:
4月19日 23:58:04
所屬群組:
註冊會員
文章: 30
等級: 4; EXP: 22
HP : 0 / 80
MP : 10 / 136
離線
請問大家是如何使用多個中斷

MCU:PIC18F45 内部8MHz
X IDE:3.5
目的:
1-使用INT1 偵測下降緣,利用TIMER0算時間
2-使用TIMER1進行條件偵測 (10ms一次)
3-INT0 INT2搭配按鍵(未來要做)

問題:中斷分別拆開單獨跑,可以運行。三個擺在一起跑,就會卡住
要如何使用多個中斷

void interrupt low_priority Low_ISR(void)
{
PIR1bits.TMR1IF=0;
TMR1H = (0xFFFF-Timer_Count)/256;
TMR1L = (0xFFFF-Timer_Count)%256;
LATD++;
}

void interrupt HIGHISR(void)
{
if (PIR1bits.TMR0IF==1)
{
PIR1bits.TMR0If=0;

}

if (INTCON3bits.INT1IF==1)
{
INTCON3bits.INT1IF=0;

}

}
優先權
IPR1bits.TMR1IP=0;
INTCON3bits.INTIP=1;
IPR1bits.TMR2IP=1;
OSCCON=0X70;

6月20日 22:17:28
轉換PDF檔 列印


Re: PIC18 如何使用多中斷
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14528
等級: 73; EXP: 10
HP : 1081 / 1802
MP : 4842 / 76619
離線
底下這三個位元有設定嗎?

RCONbits.IPEN = 1; // 啟用高、低優先權控制機制
INTCONbits.GIEH = 1; // 開啟高優先權中斷總控制位元
INTCONbits.GIEL = 1; // 開啟低優先權中斷總控制位元

IPEN 必須設成 1 後才會啟用高、低優先權的動作。
修改一下中斷成是加個 LED 看看中斷的發生行為。

void interrupt low_priority Low_ISR(void)
{
PIR1bits.TMR1IF=0;
TMR1H = (0xFFFF-Timer_Count)/256;
TMR1L = (0xFFFF-Timer_Count)%256;
LATD0 = ! LATD0;
}

void interrupt HIGHISR(void)
{
if (PIR1bits.TMR0IF==1)
{
PIR1bits.TMR0If=0;
LATD1 = ! LATD1; // Timer1 發生中斷 LED 轉態一次
}

if (INTCON3bits.INT1IF==1)
{
INTCON3bits.INT1IF=0;
LATD2 = ! LATD2;// INT1 發生中斷 LED 轉態一次

}

6月21日 10:13:14
轉換PDF檔 列印


Re: PIC18 如何使用多中斷
初級會員
註冊日期:
4月19日 23:58:04
所屬群組:
註冊會員
文章: 30
等級: 4; EXP: 22
HP : 0 / 80
MP : 10 / 136
離線
hi
謝謝
我錯誤的原因是INTCONbits.GIEH = 1;未設定
可以使用rtos的功能

6月24日 10:00:34
轉換PDF檔 列印


Re: PIC18 如何使用多中斷
初級會員
註冊日期:
4月19日 23:58:04
所屬群組:
註冊會員
文章: 30
等級: 4; EXP: 22
HP : 0 / 80
MP : 10 / 136
離線
void interrupt low_priority Low_ISR(void)
{
PIR1bits.TMR1IF=0;
TMR1H = (0xFFFF-Timer_Count)/256;
TMR1L = (0xFFFF-Timer_Count)%256;
TM1_counter++;
LATD0 = ! LATD0;

if (TM1_counter ==1000)TM1_counter=0;
}

void interrupt HIGHISR(void)
{
if (PIR1bits.TMR0IF==1)
{
PIR1bits.TMR0If=0;
TMR0H = (0xFFFF-Timer_Count)/256;
TMR0L = (0xFFFF-Timer_Count)%256;
TM0_counter++;
LATD1 = ! LATD1; // Timer1 發生中斷 LED 轉態一次
}

if (INTCON3bits.INT1IF==1)
{
INTCON3bits.INT1IF=0;
LATD2 = ! LATD2;// INT1 發生中斷 LED 轉態一次

}

問題1: 進入HIGHISR 中斷,TM1_counter就不會進行累計,假設HIGHISR 整個流程需要1ms,TM1_counter會在1ms後開始累計,對嗎?
所以這個是造成計時上的誤差主因,對嗎
if (TM1_counter ==1000)TM1_counter=0;-->這裡也是造成誤差的原因對嗎


問題2: 進入HIGHISR 中斷,TM0_counter,要等
if (INTCON3bits.INT1IF==1)結束才開始累計,對嗎?

如果 INT處理時間超過TMR02的中斷進入時間,TMR02也會造成誤差,對嗎

6月26日 22:33:12
轉換PDF檔 列印


Re: PIC18 如何使用多中斷
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14528
等級: 73; EXP: 10
HP : 1081 / 1802
MP : 4842 / 76619
離線
問題1: 進入HIGHISR 中斷,TM1_counter就不會進行累計,假設HIGHISR 整個流程需要1ms,TM1_counter會在1ms後開始累計,對嗎? (是的,會漏掉一次)

所以這個是造成計時上的誤差主因,對嗎 (如果HIGH_ISR 占用的執行時過長就會受影響,還有當 Timer1 中斷發生到重新載入 Timer1 的計數值時也會出現幾個時脈的延遲,如果要很準確的計時請改用 Auto_Reload 功能的 Timer2 。)

if (TM1_counter ==1000)TM1_counter=0;-->這裡也是造成誤差的原因對嗎

Ans: Timer1 是屬於硬體得計數不容易受影響,但依你的程式來看使用 if (TM1_counter ==1000)TM1_counter=0; 建議修改成 >= 1000 會比較好。為避免因高優先權佔據時間過久,Timer0 的處理時間要短一點。另外 Timer1 的中斷時間可以設慢一點,而 TM1_counter 可以不用到 1000。


問題2: 進入HIGHISR 中斷,TM0_counter,要等
if (INTCON3bits.INT1IF==1)結束才開始累計,對嗎? (要等到 Timer0 的值重新載入後才會加一)
如果 INT處理時間超過TMR02的中斷進入時間,TMR02也會造成誤差,對嗎 (是的)

6月27日 10:48:56
轉換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