MPLABC18不主动把中止服务程序放在中止向量处。通常将GOTO 指令放在中止向量处,从而把控制权转交给相应的中止服务程序。
//—————————-低优先级中止进口———————————–
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。
//—————————-高优先级中止进口———————————–
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;