本帖最后由 taijing33 于 2016-12-9 07:44 编辑
单片机型号是66K22,这个单片机和我内部的程序框架,我已经用了4年有余了。现在遇到一个奇怪问题,。
程序中只有开启了10ms定时器0然后在定时器中断中有几个u16变量累加。while1中判断u16变量的值,比如超过了1000就认为一秒时间到了执行相应的工作。这个框架我已经用好了好久了,而且在n种单片机中用过,一直没有问题!!!!
但是现在我用mplab+pickit3仿真,程序经常不进入while1,或者不进入定时器中断,有时候在while1中加入断点能进入while1,有时候又不行。但是有时候程序又能按照我的设计运行,。更怪的是我重新编译仿真又不行。貌似没有规律,经过我几天的观察就是,程序经常不进入while1或者不进入定时器中断。
下面是程序,
void config_Time0(void)//这是定时器初始化函数,定时10ms
{
INTCON=0B11100000;
INTCONbits.GIE = 1;
INTCONbits.PEIE = 1;
INTCON2 = 0x00; //TMR0 Overflow Interrupt Priority bit, 0 = Low priority
//INITIALIZING TIMER0; 10ms timer
INTCONbits.TMR0IF = 0; //Clear Timer0 overflow flag
INTCONbits.TMR0IE = 1; //Enable Timer0 overflow interrupt
INTCON2bits.TMR0IP = 0;
INTCON3 = 0; //TMR0 Overflow Interrupt Priority bit, 0 = Low priority
TMR0L = 40; //10ms timer
T0CON = 0x46; //Timer0 is configured as an 8-bit timer, 1:128 prescale value
RCON = 0xe0;
//Timer0 On/Off Control bit
T0CONbits.TMR0ON = 1; //1 = Enables Timer0
/* Initialize Watchdog Timer */
WDTCONbits.SWDTEN = 0; // Watchdog change enable
}
void low_isr (void) //定时器中断函数
{
if(INTCONbits.TMR0IF && INTCONbits.TMR0IE)
{
INTCONbits.TMR0IF = 0; //Clear Timer0 overflow flag
TMR0L = 40; //10ms timer
jiffies += 10;
t_10ms_jiffies += 10;
// u8 _50ms_jiffies = 0;
t_100ms_jiffies += 10;
t_200ms_jiffies += 10;
t_1000ms_jiffies += 10;
LATFbits.LATF2 = !LATFbits.LATF2; //去反用于观察,用示波器观察是否定时器进中断。
}
}
void main(void) //主函数,。
{
config_IO();
config_ADC();
config_uart1();
config_uart2();
read_set_data();
config_Time0();
while(1)
{
ClrWdt();
if (t_200ms_jiffies >200) //200ms
{
t_200ms_jiffies = 0;
}
if (t_1000ms_jiffies >1000) //一秒进入一次
{
t_1000ms_jiffies = 0;
LATDbits.LATD5 =!LATDbits.LATD5; //用于控制继电器动作,方便观察、。
}
}
}
上面所有的程序模块都是我经常用的。
还有就是mplab仿真时 看到不能改变intcon寄存器的值。这一点我原来使用时也发现过。估计是仿真器不好用的原因、
实在无招了。肯定大侠出现!!!! |