为啥TMR4不能进中断?

2019-03-25 19:12发布

本人写的测试程序,用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(;;)
   {

   }
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
xzfx
1楼-- · 2019-03-26 04:03
MARK回去再看

一周热门 更多>