打印

吐血求救PIC18F单片机奇怪问题

[复制链接]
2300|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
taijing33|  楼主 | 2016-12-9 07:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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寄存器的值。这一点我原来使用时也发现过。估计是仿真器不好用的原因、
实在无招了。肯定大侠出现!!!!
沙发
taijing33|  楼主 | 2016-12-9 07:47 | 只看该作者
本帖最后由 taijing33 于 2016-12-9 07:48 编辑

顺便说一句。单片机换过一次。晶振也震动,问题依旧。

最奇葩的是定时中的u16变量已经到了好几万了,但是也不进入while1中的判断语句、。偶尔正常的时候,定时器10ms定时很准。我用示波器看的。while1中的我1秒执行一次继电器也很准、

使用特权

评论回复
板凳
firefly2k| | 2016-12-9 07:51 | 只看该作者
是否定时器未到,看门狗溢出了?

使用特权

评论回复
地板
你尝试吧你那个while改用别的表达语句替换一下,我也遇到过这种莫名其妙的问题!

使用特权

评论回复
5
zhaor| | 2016-12-9 08:57 | 只看该作者
应该看看汇编语句,有可能优化的问题。

使用特权

评论回复
6
XIEYUANBIN| | 2016-12-9 10:02 | 只看该作者
看看是否 t_1000ms_jiffies 这个变量是弄成局部变量了

使用特权

评论回复
7
taijing33|  楼主 | 2016-12-9 10:50 | 只看该作者
谢谢楼上各位,。我现在应该是大体找到原因了,
我使用了串口2,并使能接受,开启了接受中断。但是这个串口外部的485芯片我没有焊接。
也就说串口2的引脚是悬空的,
现在我关闭了串口2模块。问题解决了。
顺便说一句就是,我单独关闭串口2中断或者禁止串口2接受都不行,必须关掉整个串口2模块!!!
以前调试都是焊接完整的。,这次算是又学了一招,惭愧啊。
不用的模块应该关闭,

使用特权

评论回复
8
ocon| | 2016-12-9 11:33 | 只看该作者
taijing33 发表于 2016-12-9 10:50
谢谢楼上各位,。我现在应该是大体找到原因了,
我使用了串口2,并使能接受,开启了接受中断。但是这个串口 ...

只要你开了串口模块,收到数据或错误帧的时候,相应的中断标志会被置位,即便你关了它的中断允许,也只是不会触发串口中断而已,当你因为定时或其他原因而进入中断的时候,估计你的中断处理程序被这些没用到的标志位忽悠了~

使用特权

评论回复
9
taijing33|  楼主 | 2016-12-9 12:07 | 只看该作者
ocon 发表于 2016-12-9 11:33
只要你开了串口模块,收到数据或错误帧的时候,相应的中断标志会被置位,即便你关了它的中断允许,也只是 ...

说的太对了。就是这个原因。pic只有一个中断入口,我的定时器中断和串口2中断都是低优先级。进入定时器中断的时候。串口2也有中断,。但是程序中并没有处理串口2中断。所以就一直进中断或者产生了其他异常

使用特权

评论回复
10
huarana| | 2016-12-9 23:26 | 只看该作者
pic就这个郁闷 不用的功能要关闭 。不像别的单片机 用哪个打开哪个。

使用特权

评论回复
11
北极风| | 2016-12-10 09:12 | 只看该作者
中断判断应该同时判断该中断允许位和中断标志位。

使用特权

评论回复
12
taijing33|  楼主 | 2016-12-10 10:57 | 只看该作者
北极风 发表于 2016-12-10 09:12
中断判断应该同时判断该中断允许位和中断标志位。

不这样做,会有什么隐患?

使用特权

评论回复
13
tdh03z| | 2016-12-13 21:45 | 只看该作者
上电后PIC单片机的功能默认都是是关闭的,老的记得就AD端口需要配置成数字IO,其它都只有IO控制功能。

另电路设计时,所有输入的IO最好有限流电阻和上拉或下拉电阻,干扰及损坏的概率会大幅度减小,这个是好多次教训得来的啊。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

163

主题

365

帖子

3

粉丝