9084|21

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

再提PWM中断和SCI中断冲突问题,看看这样的程序到底有什么问题啊(附程序)? [复制链接]

      再次请教各位大侠,我在dsp2407 C环境编程中的运行PWM中断和SCI中断时出现冲突问题,我把程序看了很久,实在是没辙了;
情况说明: 1. pwm用的是T3下溢中断,cpu频率40M.波特率9600。
                2. SCI是用串口调试助手调试。
           3.上面2个中断单个运行都是很正常。
           4.运行PWM中断和SCI中断时没有多久就出现其中一个中断死了的现象,一般约通讯8

最新回复

终于找到原因了,是语句位置的关系,把“SPLK         #0002H,SCICTL2         ;接收中断使能”放后面就可以了   详情 回复 发表于 2008-4-1 04:23
点赞 关注

回复
举报

75

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
       我有这样一个猜测,你无妨试一试。
    我觉得在中断处理程序,如 PWMINT,PDPINT,以及被中断处理调用的 SCIINT 等函数中, return 之前不应该加那条“允许中断”指令的。用 C 语言写的中断处理程序,是通过  II$REST  函数,恢复现场后,允许中断,再返回被中断的程序。在转向 II$REST 之前”允许中断“完全不必要。而且,好像有点危险,有可能出现恢复现场的中途又被中断的情况。
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

SCI和PWM会冲突,高手们看看这样的程序到底会有什么问题啊?

mlwang_km 大哥,
我看到很多程序都是在返回中断处加开总中断啊,我把程序作了小修改还是不行啊,不过这次运行次数最长有154次,并且有时候出现在通讯中断死了一会后又自动进入中断的现象,真是烦死人啊!


/****************************************************************************
/*****************SVPWM interupt program using T3UPINT***********************
/****************************************************************************/
void interrupt PWMINT()
{
  //IFR=IFR|0x0002;//clear the int2 flag
  PBDATDIR|=0x0fe80;//测试中断时间  
  switch(PIVR)
  {
      case 0x0031:
         {
         //测试入中断次数
         gg++;
         if(gg>=10000)
             gg=0;
         //测试入中断次数
         T3CNT=0x0000;  //定时器3的计数器重新赋0
         EVBIFRA=EVBIFRA&0x0200; break;
         }
      default:break;
  }  
  PBDATDIR=PBDATDIR&0x0fef7f;//测试中断时间
  //enable();
  IFR=IFR|0x0002;//clear the int2 flag
  return;
}
void interrupt SCIINT()
{  
    PBDATDIR|=0x0fe02;//测试中断时间
        switch(PIVR)
        {
                case 6:
                {
                //SCIRXINT();
                scir[bagpointer]=SCIRXBUF;       
            bagpointer++;//接受数据指针
            if(bagpointer>=9)
                bagpointer=0;
            //测试入中断次数       
            ss++;
        if(ss>=10000)
            ss=0;
        //测试入中断次数
                break;
                }
                default: break;
        }
   IFR=0x0010;  //清除IFR中相应的中断标志   
   PBDATDIR=PBDATDIR&0x0fefd;//测试中断时间
   //enable();
   return;

}
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

4
 
      程序上看不出啥问题。
   你所说的“运行xix 次“是什么意思?连续接受多少字节才算一次?”通讯中断死了“又是什么情况?用DEBUG看到程序跑飞了吗?还是仅仅收不到信息?
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 
谢谢大哥在百忙回答我的问题!
我是PC每秒发一个字节,波特率为9600b/s,一共通讯了154次,也就是运行了154秒,最后SCI中断再也不响应了(用示波器看到SCI中断中操作的I/O跳变波形没有了,再看看接收计数器的值也不增加了), 通过试验发现同时运行pwm和sci时,多是SCI中断没有响应了。还想请问大哥怎么用DEBUG看到程序跑飞了?
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

6
 
     运行中显示 CPU 寄存器的值,随时看看 PC (指令计数器)的值是否正常(应该在主程序的死循环内),或者觉得不对劲时通过DEBUG  HALT 停止连续运行,单指令走几步,如果完全在正确的路线循环,说明没有跑飞,仅仅是没有中断。如果地址乱套,跑到自己的程序代码之外,那当然是跑飞了。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

7
 
     还有有个办法。板上总会有个接在某输出腿上的发光二极管的吧?正好定时器也有。在定时器中断中,令一标识按一定频率翻转。主程序反正闲着无事,让它随时判此标志,开,关发光二级管。这样只要一看到发光二极管停止闪烁,就知道程序跑飞了。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

8
 
我看此坛上还有好几位网友提到中断冲突问题,到底是真的有冲突,还是大家处理上还有什么疏忽,对我们每个想用2407 A 的人,是一件大事,不能不密切关注。
     问题是中断是突然发生的事件,不易模拟测试,难矣哉!
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

9
 

清中断标志方法有误

不应该用 |
假设同时来了INT2和5中断,标志都出现了,优先级的关系进了2,*IFR = *IFR | 0x????后,结果有1的位都清了,就把中断5也清了,应该用=0x????
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

10
 

PWM中断和SCI中断冲突问题,请求高手出现(附程序)?

不应清中断标志,好像其他的中断都没有这样的现象阿!

 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(中级)

11
 
    CPU 中断标志 IFR 通常不需要在中断服务程序中清除,是在CPU响应中断时自动清除的。只有“当通过INTR指令来请求中断且相应的IFR 位被置为1 是,CPU不会自动清除该位,该位必须由软件来清除。”
    中断服务中清除 IFR 如果操作不当,确实会有 LZP  指出的问题。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

12
 

PWM中断和SCI中断冲突问题,请求高手出现(附程序)?

但是PWM中断却要清阿,不清就只能进入一次!并且CAP中断也要软件清中断阿!难道sci有什么特殊点?请大家发表高见啊!
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

13
 
  要清的是外设中断标志,如:
  EVBIFRA=EVBIFRA&0x0200;
  而不是CPU中断标志 IFR , 各种中断都是一样的。
  “当一个可屏蔽中断被响应时,只有IFR位被清除。相应的外设控制寄存器中的标志不会清除”< ...DSP CPU与外设> p 55

  PWM 中断(实际是定时器中断吧?),再加 SCI ,ADC中断,有这么三个中断源的测试程序我做过,并不清 IFR,好像没啥问题。当然由于 SCI 接收代码不是非常多,我现在也还不敢肯定就完全可靠了。因此也才特别关注各位实验的情况
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

14
 

PWM中断和SCI中断冲突问题,请求高手出现(附程序)?

理解,谢谢,那刘和平的书(北航版)就是错误的啦!
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(初级)

15
 
  我没看过刘和平的书。只看过清华大学出版社的 ..DSP 指令和编程工具,间或参考一下原文(清华的几本书,实际就是 TI 公司文档的译文,翻译质量参差不齐)。这一点上讲得还是清楚的。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

16
 

IRF必须清

串口用int5  :       
          *IFR = 0x0010;                
// AD中断服务子程序:
       *IFR = 0x0001;    //清除IFR中相应的中断标志
//EVA中断:
    *EVAIFRA = iflg;        // 清除所有中断标志 ,不必开中断
    *IFR=0x0002;

不清的话,就会频繁进中断,这是我在AD中断试出的,本来我打算用定时器1周期中断标志自动启动,定时器1周期250us,但AD中断里没写*IFR = 0x0001; 结果20usAD就中断一次了,所以,中断程序里要清
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

17
 
     我又回过头查看了一下我的测试程序,也用到AD,除了初始化时*IFR= 0FFFF 外,中断服务中根本不清 IFR ,好像没啥异常呀。
    这是一个问题,多留意留意吧。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

18
 

中断现场处理干净了是不会冲突的呀

    我又再次翻阅了TI公司文档:
SPRA 755 A Getting Started in C and Assemble
SPRU 357 B System and Peripherals
中的程序例,这些程序当然比较简单,只有一个中断源。中断服务程序中都不写 IFR。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

19
 
我现在就是没有清IFR,运行很好的啊!
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

20
 

多个中断的时候一定要清一下各自中断的ifr的,要不会出现只能进一次中断的问题啊

      可能这里面真还有啥问题。咱们多留意吧,有啥情况望及时交流!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表