本人写的测试程序,用MCC18编译,为啥TMR2能进低优先级中断?TMR4不能进高优先级中断?(注:TMR4即使配为低优先级中断触发,可也不能进入,为啥)
以下是程序主体
#include <p18f67K22.h>
//MCC18编译的,TMR2正常能进低优先级中断,主要问题是TMR4为何进不了中断?测试选的是高优先级中断
void initial(void);
void high_isr(void);
void low_isr(void);
void main(void);
////////////////////////////////////////
void initial(void)
{
CM1CON=0;
CM2CON=0;
CM3CON=0;
ADCON1=0;
ADCON2=0;
PORTA=0; //定义I/O
LATA=0;
ANCON0=0;//引脚配置为数字端口
ANCON1=0;//引脚配置为数字端口
ANCON2=0;//引脚配置为数字端口
TRISA=0XC1;
PORTB=0;
TRISB=0XFF;
SSP1CON1=0;
SSP2CON1=0;
PORTC=0X0;
LATC=0;
TRISC=0X0;
ODCON1=0;
ODCON2=0;
ODCON3=0;
PORTD=0X0;
TRISD=0X2f;
PORTE=0X0;
TRISE=0X0;
PORTF=0X0;
LATF=0;
TRISF=0X0;
PORTG=0X0;
TRISG=0X1e;
INTCON3bits.INT2IE=0; //关闭中断
INTCON3bits.INT1IE=0; //关闭中断
//---------------------------------
RCON=0;
RCONbits.IPEN=1;//允许中断优先级
PR2=0XFF;//TMR2的匹配值 4.096ms(512u*8)
T2CON=3;///0;//0 0001 0 01
PIE1bits.TMR2IE=1;
IPR1bits.TMR2IP=0;//低优先级
TMR2=0;
T2CONbits.TMR2ON=1;
PR4=0X55;
PIE5=0;
IPR5=0;
T4CON=0;//00000010
PIE5bits.TMR4IE=1;
IPR5bits.TMR4IP=1;//高优先级
TMR4=0;
T4CONbits.TMR4ON=1;
_asm nop _endasm
INTCONbits.GIE=1; // 允许所有高优先级中断
INTCONbits.PEIE=1; // 允许所有低优先级的外设中断
}
//===============================
////////////////////////////////////////////////////////////////////////////////
//------------- interrupt routine ----------------接收外部中断后,计算并发脉冲量
#pragma code high_vector=0x08 //掉电保护
void high_interrupt(void)
{
_asm goto high_isr _endasm
}
#pragma code
//..............................................................................
#pragma interrupt high_isr //save=PROD,section("MATH_DATA"),section(".tmpdata") //bsr need to be stored
void high_isr(void)
{
if (PIR5bits.TMR4IF==1) PIR5bits.TMR4IF=0;
_asm nop _endasm
_asm nop _endasm
_asm nop _endasm
}
////////////////////////////////////////////////////////////////////////////////
//------------- interrupt routine ----------------接收外部中断后,计算并发脉冲量
#pragma code low_vector=0x18 //程序外部 4096_u 中断
void low_interrupt(void)
{
_asm goto low_isr _endasm
}
#pragma code
//..............................................................................
#pragma interruptlow low_isr save=PROD,section("MATH_DATA"),section(".tmpdata") //bsr need to be stored
void low_isr(void) //TMR2 512个u 32Mhz
{
if (PIR1bits.TMR2IF==1) PIR1bits.TMR2IF=0;
_asm nop _endasm
_asm nop _endasm
_asm nop _endasm
}
void main()
{
initial();
for(;;)
{
}
}
此帖出自
小平头技术问答
一周热门 更多>