控制/MCU
01第一节 知识点
(1)中断
PIC18F2420/2520/4420/4520 器件提供多个中断源及一个中断优先级功能,可以给大多数中断源分配高优先级或者低优先级。高优先级中断向量地址为0008h,低优先级中断向量地址为0018h。高优先级中断事件将中断所有可能正在进行的低优先级中断。
(2)中断相关寄存器
有10 个寄存器用于控制中断的操作。它们是:
• RCON :
• INTCON
• INTCON2
• INTCON3
• PIR1 和PIR2
• PIE1 和PIE2
• IPR1 和IPR2
(3) 控制中断源的操作
• 标志位表明发生了中断事件
• 使能位允许程序跳转到中断向量地址处执行(当标志位置1 时)
• 优先级位用于选择是高优先级还是低优先级
我们看一下PIC18单片机的中断逻辑框图:
我们一般关注中断需要四个点:
(1)中断的使能,例如 TMR0IE 定时器0中断使能位;
(2)中断标志位,例如 TIMR0IF 定时器0中断标志位,这个可以观察是否中断已经发生。
(3)中断优先级位,例如TIMR0IP定时器0中断优先级,是高优先级还是低优先级,中断的服务函数要对应,PIC18 只有两个优先级,高优先级和低优先级两个服务函数。
(4)全局中断中断使能吗GIE, 外设中断允许位,PEIE。
那么,PIC18 共有哪些中断呢?
我们看,定时器中断(TIMR0,TIMR1,TIMR2,TIMR3),RB端口电平变化中断,外部中断(INT0,INT1,INT2),ADC中断,SSP中断,比较器中断,高/低压检测中断,CCP捕获中断,EUSART 中断。
我们在使用具体的外设功能的时候考虑是否使用中断功能。
中断寄存器
(1)图1
(2)图2
(3)图3
(4)图4
(5)图5
(6)图6
(7)图7
我们以定时器0为例,看到定时器相关的中断寄存器需要哪些设置,具体的含义贴在图片上了。
我们从图7 可以看到,要使用TIMR0的中断功能,必须设置INTCON的具体寄存器值。
02第二节 代码编写
INTCONbits.GIE=1;//允许全局中断
INTCONbits.PEIE=1;// 允许外设中断
RCONbits.IPEN=1; // 中断优先级使能位
// 中断timer0 使能
TMR0IE=0; // timer0 允许中断
TMR0IF=0; // 中断标志位清零
TMR0IP=1;// timer0 设置为高级优先中断
之后的代码就可以配置定时器0具体是使用8位定时还是16位定时,定时的时间是多少溢出,定时器的时钟怎样选择。这个在定时器的使用过程中我们具体看。
中断服务函数是具体中断发生后如何处理的操作。
// 高级优先级中断服务子程序
void interrupt high_priority inrt_isr_high(void)
{ //usart 服务
if(RCIF&&RCIE)
{
RCIF=0; // 必须先清楚RC中断标志位
usart_send_byte(RCREG);
}
//timer 0 服务
if(TMR0IE&&TMR0IF)
{
TMR0IF=0;
timer0num++;
if(timer0num==39063)
{
usart_send_string("timer0 is count for 1s!rtn");
timer0num=0;
}
}
}
这儿的例子是中断发生后在串口发送数据,代码的含义注释的比较清楚。
全部0条评论
快来发表一下你的评论吧 !