打印

PICC中断应用之大问题(菜鸟特别关注)

[复制链接]
5558|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
52mcu|  楼主 | 2008-4-1 00:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PICC中断应用之大问题(菜鸟特别关注)

在PICC的中断函数里调用一个函数后,整个程序都不运行了,而这个函数在主循环里用查询方式是能正常运行的。
这究竟是咋回事???该如何处理???


/*PICC中断函数*/
void interrupt
timer0_isr(void)
{
    if(reload == 0){
        
        seconds++;
    
    ScanKey2();//此处调用按键扫描函数后 将整个程序烧入片子 程序就不运行了!!!
      
  
    }
    reload--;
    T0IF = 0;
 
}

/*中断中调用的函数*/
void ScanKey2(void)
{
    static unsigned int KeyCounter=0;
  static bit FirstPress; 
  unsigned char KeyValue;
    KEY_IN();
  KeyValue=GET_KEY();
  if(KeyValue==0x3)
  {
    KeyCounter=0;
        FirstPress=0;
    KEY_READY();
    return;
  }
  if(FirstPress)
  { 
     if(++KeyCounter>KEY_TIME) 
       { KeyCounter-=KEY_SPEED; 
           
           KeyProcess(KeyValue); 
           //i=0;
       }
       else 
       { KEY_READY();
         return ;
       } 
  } //if(FirstPress)
  else
  {
       for(i=200;i>0;i--);    
        

          KeyValue=GET_KEY();
        if(KeyValue==0x3)
        {
          KeyCounter=0;
          FirstPress=0;
        KEY_READY();
          return;
         }
         FirstPress=1; 
          KeyCounter=0;
         KeyProcess(KeyValue); 
  }

  KEY_READY();

}

沙发
yewuyi| | 2008-4-1 08:37 | 只看该作者

void interrupt ISR(void){}

使用特权

评论回复
板凳
52mcu|  楼主 | 2008-4-1 09:37 | 只看该作者

楼上的兄台,能否指教明白点,我实在不知道是啥意思?

楼上的兄台,能否指教明白点,我实在不知道是啥意思?

使用特权

评论回复
地板
yewuyi| | 2008-4-1 11:18 | 只看该作者

中断函数写错了

使用特权

评论回复
5
52mcu|  楼主 | 2008-4-1 12:26 | 只看该作者

中断函数象我那样写是没问题的 ,这测试过了。

关键问题是在中断中调用函数

使用特权

评论回复
6
x512775199| | 2008-4-1 13:48 | 只看该作者

额。。

我觉得只有很有耐心的人会看完这个东东。。。LZ可不可以把程序注释清楚点。。。

使用特权

评论回复
7
king6301| | 2008-4-1 15:27 | 只看该作者

程序重入

中断函数中所有出现的子函数均要保证在MAIN()中不出现,否则就出现了程序的重入问题,而PICC并不支持

使用特权

评论回复
8
yewuyi| | 2008-4-1 16:48 | 只看该作者

呵呵,还真没仔细看

ScanKey2()函数调用肯定有问题的嘛,呵呵,你真神了,竟然想这么干?

使用特权

评论回复
9
52mcu|  楼主 | 2008-4-1 18:40 | 只看该作者

程序重入

main和interrupt中没有同时调用ScanKey2函数  在main中调用时interrrupt中就注视掉了 同样在interrupt中调用时main中的就注释掉了

使用特权

评论回复
10
52mcu|  楼主 | 2008-4-1 19:54 | 只看该作者

难道PICC的中断函数中真的不能调用任何函数吗

难道PICC的中断函数中真的不能调用任何函数吗 刚测试了在中断中调用如下一个简单函数都不行 编译没问题,烧进去就不运行。中断里不能调用函数,这不急死人啊。


void fun(void)
{
  char a=7,b;
  char c;
 c=a+b;

}

使用特权

评论回复
11
neaphy| | 2008-4-1 20:10 | 只看该作者

定义成宏吧

晕在中断中放这么长的函数真恐怖
把函数定义成宏就行啦

使用特权

评论回复
12
hotpower| | 2008-4-1 20:14 | 只看该作者

这就是键盘中断的难处,定时中断查询才是最佳选择~~~

使用特权

评论回复
13
52mcu|  楼主 | 2008-4-1 22:00 | 只看该作者

这个函数就是 定时中断扫描函数啊

使用特权

评论回复
14
yewuyi| | 2008-4-2 10:44 | 只看该作者

中断中可以调用函数,你的函数没有运行估计是别的问题

使用特权

评论回复
15
ayb_ice| | 2008-4-2 12:20 | 只看该作者

准确的应该说是程序运行不正确

而不是没有运行。。。

使用特权

评论回复
16
dzdiy| | 2008-4-2 22:01 | 只看该作者

看看:

 避免在中断内使用函数调用。虽然PICC 允许在中断里调用其它函数,但为了解决
递归调用的问题,此函数必须为中断服务独家专用。既如此,不妨把原本要写在其
它函数内的代码直接写在中断服务程序中。
 避免在中断内进行数**算。数**算将很有可能用到库函数和许多中间变量,就
算不出现递归调用的问题,光在中断入口和出口处为了保护和恢复这些中间临时变
量就需要大量的开销,严重影响中断服务的效率。

使用特权

评论回复
17
zhaoyu2005| | 2008-4-4 11:52 | 只看该作者

估计数堆栈溢出了

不知LZ使用的什么型号的,PIC有些型号的堆栈很少(就两级,调用三次函数就溢出,LZ的至少得3级),弄不好就溢出

使用特权

评论回复
18
萝卜秧子| | 2008-4-4 23:07 | 只看该作者

程序会执行的

PIC的中断是要查询中断标志位的。

你所谓的中断函数中没加判别,全都执行。除非只有T0一个中断请求,否则会出错的。

void interrupt ISR(void)
{
   if(T0IE & T0IF)
       {
           T0IF = 0;
           //处理函数
        }
}

这样试试。

使用特权

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

本版积分规则

157

主题

292

帖子

0

粉丝