PIC——MCC18中斷寫法
//----------------------------低優先級中斷入口-----------------------------------
2voidInterruptVectorLow(void)//低優先級中斷向量函數
3{
4 _asm
5 gotoInterruptHandlerLow//內嵌匯編指令
6 _endasm
7}
8#pragmacode//這里不是多余的,它是告訴連接器回到默認的代碼段,如果不加的話,連接器就會傻傻地把后面的代碼緊跟著上面的代碼一直放下去。而LKR文件里定義了向量區最多到0x29地址,所以如果沒加此行通常會報錯
9
10#pragmainterruptlowInterruptHandlerLow//這里使用interruptlow這個關鍵詞來聲明InterruptHandlerLow這個函數是低優先級中斷服務函數,用了關鍵詞后,這個函數將會由編譯器自動產生基本的現場保護,并且這個函數的返回將是使用RETFIE返回的。
11
12
13voidInterruptHandlerLow(void)
14{
15/*低優先級服務函數的代碼寫在這里*/
16}
PIC18系列的高優先級中斷入口地址在0x0008地址,下面的代碼是在這個入口地址處放置一個向量函數,這個向量函數里就是一個內嵌匯編的GOTO指令,GOTO到高優先級的中斷服務函數InterruptHandlerHigh。
本文引用地址:http://cqxgywz.com/article/201611/316959.htm//----------------------------高優先級中斷入口-----------------------------------
1#pragmacodeInterruptVectorHigh=0x08//用#pragma偽指令定義一個名字叫InterruptVectorHigh的段,并把這個段放到0x08地址起始的代碼空間
2voidInterruptVectorHigh(void)//高優先級中斷向量函數
3{
4 _asm
5 gotoInterruptHandlerHigh//內嵌匯編指令
6 _endasm
7}
8#pragmacode//回到默認代碼段,原因同上
9#pragmainterruptInterruptHandlerHigh
10
11voidInterruptHandlerHigh(void)
12{
13/*高優先級服務函數的代碼寫在這里*/
14
15 if(INTCONbits.TMR0IF)
16 {//checkforTMR0overflow
17INTCONbits.TMR0IF=0;//clearinterruptflag
18 ;
19 ;
20 }
21}
對于MPLAB C18,上面的高低優先級的中斷向量函數和中斷服務函數,各只能出現一次,不能有多個中斷服務函數,如果多個中斷都是高優先級的,在高優先級中斷服務函數里通過判斷各自的中斷標志位來做對應處理。
CONbits.IPEN = 1; //使能中斷優先級
INTCONbits.GIEH = 1; //允許/禁止 所有高優先級中斷
INTCONbits.GIEL = 1; //允許/禁止 所有低優先級中斷
//RCONbits.IPEN = 0; //禁止中斷優先級
//INTCONbits.GIE = 1; //允許/禁止 所有中斷源
//INTCONbits.PEIE = 1; //允許/禁止 所有外設中斷源
當IPEN=1時,中斷源使用高優先級中斷時GIEH = 1;GIEL 可以=0;
中斷源使用低優先級中斷時GIEH = 1;GIEL =1;
當IPEN=0時,所有中斷均跳轉到08H(使用高優先級中斷向量入口)
GIEH = 1;GIEL =1;


評論