|
Re: 關於pic18f4520 timer0低優先中斷
|
|
初級會員
|
抱歉我打錯了 它是關畢高低優先中斷 然後把timer0的中斷放在中斷向量0x0018就是低優先中斷向量的地方 可是這樣就不能正長運做 中斷不會發生 想問為什摸?
發表於: 2009/4/4 2:36
|
|
|
關於pic18f4520 timer0低優先中斷
|
|
初級會員
|
下述是根據微處理器原理與應用-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 );// 相當於 T0CON=0xE8 WriteTimer0(count_val); // 相當TMR0L=count_val INTCONbits.TMR0IF = 0; // 清除中斷旗標 }
發表於: 2009/4/3 20:28
|
|