Re: 關於Timer0中斷 pic18f4520
|
||||
---|---|---|---|---|
資深會員
|
IPEN=0 時
中斷向量就是只有0x08, 而非0x18 這樣就可和PIC16 中斷模式相容 所以你的執行結果是正確的 另外, PIC18裡只有INT0無法設定高低優先權 其餘中斷都可以設定優先權 可以參考datasheet中斷結構圖就清楚了
發表於: 2009/4/6 10:02
|
|||
|
Re: 關於Timer0中斷 pic18f4520
|
||||
---|---|---|---|---|
新會員
|
看看INTCON2的TMROIP是否設成High priority
發表於: 2009/4/6 9:08
|
|||
|
Re: 關於Timer0中斷 pic18f4520
|
||||
---|---|---|---|---|
版主
|
因在家裡,無順手資料可查。記億中 Timer 0 & INT0 只能設成高優先權中斷,並無法設成低優先權中斷。請查一下 Data Sheet 裡的中斷架構方塊圖。
發表於: 2009/4/4 15:02
|
|||
|
關於Timer0中斷 pic18f4520
|
||||
---|---|---|---|---|
初級會員
|
報歉之前的問題有打錯更正
下述是根據微處理器原理與應用-C語言與PIC18微控制器這本書的範例,裡面的timer0是設定成溢位中斷,高低優先中斷關閉,中斷向量設在0x0018,但是這樣都沒辦法正確的進入中斷,如果設成0x0008便可以了,想請問為什麼會這樣呢? //********************************************************** //* Ex8_4_But_TMR0INT.c //* 程式將偵測按鍵SW3的狀態,並遞加計數的內容。 //* 利用中斷功能,當計數數值超過四次反轉燈號。 //********************************************************** #include <p18f4520.h> //納入微控制器定義檔 #include <timers.h> //納入計時器函式庫定義檔 // 結構位元定義 #pragma config OSC=HS, BOREN=OFF, BORV = 2, PWRT=ON, WDT=OFF, LVP=OFF #define OSC_CLOCK 10 // 工作時序頻率定義 #define push_no 4 //預設觸發次數 #define count_val 256-push_no //宣告函式原型 void Init_TMR0(void); void timer0_isr (void); //宣告並安排中斷執行程式記憶體位置 #pragma code low_vector=0x18 void low_interrupt (void) { _asm GOTO timer0_isr _endasm } #pragma code #pragma interruptlow timer0_isr void timer0_isr (void) { INTCONbits.TMR0IF = 0; // 清除中斷旗標 WriteTimer0(count_val); PORTD=PORTD^0xFF; // 使用運算敘述將LED燈號反轉 } void main (void) { PORTD = 0x0F;// 將PORTD設定為b'00001111' TRISD = 0; // 將TRISD設為0,PORTD設定為輸出 TRISAbits.TRISA4=1;// 將按鍵3所對應的RA4設定為輸入 Init_TMR0(); // 初始化設定Timer0函式 INTCONbits.PEIE = 1; // 開啟周邊中斷功能 INTCONbits.GIE = 1; // 開啟全域中斷控制 while (1) ; // 無窮迴圈 } void Init_TMR0 (void){ OpenTimer0(TIMER_INT_ON &T0_8BIT &T0_SOURCE_EXT &T0_EDGE_RISE &T0_PS_1_1 ); WriteTimer0(count_val); // 相當TMR0L=count_val INTCONbits.TMR0IF = 0; // 清除中斷旗標 }
發表於: 2009/4/4 2:43
|
|||
|