pic单片机中断
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PIC18系列的低优先级中断入口地址在0x0018地址,下面的代码是在入口地址处放置一个向量函数,这个向量函数里就是一个内嵌汇编的GOTO指令,GOTO到低优先级的中断服务函数InterruptHandlerLow。
//----------------------------低优先级中断入口-----------------------------------
1#pragma code InterruptVectorLow = 0x18 //用#pragma伪指令定义一个名字叫InterruptVectorLow的段,并把这个段放到0x18地址起始的代码空间
2void InterruptVectorLow (void) //低优先级中断向量函数
3 {
4_asm
5goto InterruptHandlerLow //内嵌汇编指令
6_endasm
7 }
8#pragma code //这里不是多余的,它是告诉连接器回到默认的代码段,如果不加的话,连接器就会傻傻地把后面的代码紧跟着上面的代码一直放下去。
而LKR文件里定义了向量区最多到0x29地址,所以如果没加此行通常会报错
9
10#pragma interruptlow InterruptHandlerLow //这里使用interruptlow这个关键词来声明InterruptHandlerLow这个函数是低优先级中断服务函数,用了关键词后,这个函数将会由编译器自动产生基本的现场保护,并且这个函数的返回将是使用RETFIE 返回的。
11
12
13void InterruptHandlerLow (void)
14 {
15/* 低优先级服务函数的代码写在这里*/
16 }
PIC18系列的高优先级中断入口地址在0x0008地址,下面的代码是在这个入口地址处放置一个向量函数,这个向量函数里就是一个内嵌汇编的GOTO指令,GOTO到高优先级的中断服务函数InterruptHandlerHigh 。
//----------------------------高优先级中断入口-----------------------------------
1#pragma code InterruptVectorHigh = 0x08 //用#pragma伪指令定义一个名字叫InterruptVectorHigh的段,并把这个段放到0x08地址起始的代码空间
2void InterruptVectorHigh (void) //高优先级中断向量函数
3 {
4_asm
5goto InterruptHandlerHigh //内嵌汇编指令
6_endasm
7 }
8#pragma code //回到默认代码段,原因同上
9#pragma interrupt InterruptHandlerHigh
10
11void InterruptHandlerHigh (void)
12 {
13/* 高优先级服务函数的代码写在这里*/
14
15if (INTCONbits.TMR0IF)
16{//check for TMR0 overflow
17 INTCONbits.TMR0IF = 0; //clear interrupt flag 18;
19 ;
20}
21 }
22
对于MPLAB C18,上面的高低优先级的中断向量函数和中断服务函数,各只能出现一次,不能有多个中断服务函数,如果多个中断都是高优先级的,在高优先级中断服务函数里通过判断各自的中断标志位来做对应处理。
YYY
分类: 技术转载
标签: C18, 中断
好文要顶关注我收藏该文
yuani
关注- 0
粉丝- 1
+加关注
«上一篇:也来开个博客玩玩
posted on 2010-01-27 16:38 yuani阅读(1957) 评论(2) 编辑收藏评论
#1楼[楼主] 2010-03-14 18:46 yuani
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;
支持(0)反对(0)
#2楼2011-12-13 16:08 tjc211
请问博主,我的PICC8.35 编译识别不了#pragma code 这个伪指令,能否帮我解决,不胜感激!程序和警告提示如下(本人QQ 317235753或邮箱jctang211@):
#pragma code InterruptVectorHigh = 0x08
void InterruptVectorHigh (void)
{asm("goto _InterruptHandlerHigh"); }
#pragma code
#pragma interrupt InterruptHandlerHigh
void interrupt InterruptHandlerHigh(void)
Warning[000] C:\aa.C 19 : unknown pragma code
Warning[000] C:\aa.C : unknown pragma InterruptVectorHigh
Warning[000] C:\aa.C 19 : unknown pragma =
Warning[000] C:\aa.C 19 : unknown pragma 0x08
支持(0)反对(0)。