會員登陸
帳號:

密碼:

記住我



忘記密碼?

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


正在流覽:   2 名訪客





pin18f4520 TIMER0中斷與外部RB0中斷
新會員
註冊日期:
8月22日 19:48:23
所屬群組:
註冊會員
文章: 2
等級: 1; EXP: 2
HP : 0 / 0
MP : 0 / 0
離線
請問兩種不同中斷方式要用什麼方法結合??
還是我的概念錯誤,才無法使用
目前就只能使用一個中斷無法兩個同時使用
內容大概是TIMER中斷執行LED,途中可以使用外部按鈕中斷進行我要的閃爍方式



// --------------------------- 計數中斷
void low_interrupt (void)
{
_asm GOTO timer0_isr _endasm
}
#pragma code

#pragma interrupt timer0_isr

// --------------------------- 按鈕中斷
void high_interrupt (void)
{
_asm GOTO button_isr _endasm
}
#pragma code

#pragma interrupt button_isr


void main(void)
{
PORTD = 0x00;
TRISD = 0;
T0CON = 0b10000101; // 計數器暫存器
INTCON = 0b11110000;
TRISBbits.TRISB0 = 1;
INTCON2bits.INTEDG0 = 1;
WriteTimer0(TMR0_VAL);
INTCONbits.TMR0IF = 0;
INTCONbits.INT0IF = 0;
RCONbits.IPEN = 1;

INTCONbits.PEIE = 1;
INTCONbits.GIE = 1;

while(1);
}

void timer0_isr(void)
{
INTCONbits.TMR0IF = 0;
WriteTimer0(TMR0_VAL);
PORTD = LED_mode[LED_status];
if (LED_count < 4)
{
time_increase++;
if (time_increase == 4)
{
time_increase = 0;
LED_status++;
LED_count++;
}
}
else
{
time_increase++;
if (time_increase == 2)
{
time_increase = 0;
LED_status--;
LED_count++;
}
}
if (LED_count == 9)
{
LED_count = 0;
LED_status = 0;
}
}

void button_isr(void)
{
// INTCONbits.INT0IF = 0;
// if (PORTBbits.RB0 == 0)
// {
// button_increase++;
// if (button_increase >= 4)
// {
PORTD = 0x81;
// }
// }
// else
// {
// button_increase = 0;
// }
}

9月06日 17:53:14
轉換PDF檔 列印


Re: pin18f4520 TIMER0中斷與外部RB0中斷
資深會員
註冊日期:
2010/06/30 16:18
來自 CAE, Microchip Technology Inc.
所屬群組:
站務管理者
註冊會員
文章: 1599
等級: 33; EXP: 88
HP : 164 / 822
MP : 533 / 20317
離線
PIC18 基本架構是單一中斷向量, 所有中斷發生都會跳到同一個位置,
必須透過軟體自行判斷誰發生.

建議您參考一下RTC教材,W401, TLS2118的說明, 會更加清楚.

9月11日 10:24:40
轉換PDF檔 列印


Re: pin18f4520 TIMER0中斷與外部RB0中斷
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14562
等級: 73; EXP: 15
HP : 1082 / 1803
MP : 4854 / 77079
離線
引用:
內容大概是TIMER中斷執行LED,途中可以使用外部按鈕中斷進行我要的閃爍方式


這樣的中斷需求就基本上的認知 : 可以設定外部按鈕中斷為高優先權,而 Timer 中斷設成低優先權。讓按鍵可以以高優先權的姿態取得控制權。

以上方式似乎是很直接,但實際上的運作可能會有問題。按鍵的彈跳處理就是一例。
CPU 執行的速度是很快的,像這種 LED 顯示及按鍵的動作對 CPU 而言都是很慢的動作。既然是很慢的動作所以中斷優先就不是很重要的考量。
以我的做法我只會開啟 Timer 的中斷同時處理 LED 點亮的問題及按鍵的掃瞄及彈跳處理。

LED 計時點亮採用變數方式控制,假設 Timer 中斷是 10mS 一次。如果要點亮 1 Sec 的話,主程式只要填入 LED_On = 100 即可,其餘的就交給中斷來關閉 LED。


Timer 中斷裡:

if (LED_On) {LED = 1; LED_On--;}
else LED = 0; // LED 熄滅
:

9月11日 10:37:10
轉換PDF檔 列印






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

[進階搜尋]


搜尋
Microchip連結

網頁捷徑
2019 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