登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

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

作者:mazhibao 栏目:DSP技术
PWM中断和SCI中断冲突问题,请求高手出现(附程序)?
再次请教各位大侠,我在dsp2407 C环境编程中的运行PWM中断和SCI中断时出现冲突问题,我把程序看了很久,实在是没辙了;
情况说明: 1. pwm用的是T3下溢中断,cpu频率40M.波特率9600
                2. SCI是用串口调试助手调试。
           3.上面2个中断单个运行都是很正常。
           4.运行PWM中断和SCI中断时没有多久就出现其中一个中断死了的现象,一般约通讯8—20次,但是我在运行捕捉和PWM时却没有这个现象(不运行SCI),难道是SCI有问题?可是我实在看不出什么问题了?
各位高手,谢谢你们了!

下面附上程序v:
#include    "regs2407.h"
//#include    "main.h"
//#include   "float.h"
//#include   "math.h"
//#include    "qmath.h"
//测试变量
int MM=0,ss=0,gg=0,flag_adcadjust=0;
int HH=0;
int NN=0;
int jj=0;
int w=0;
//测试变量
//sciint
#define SCIinput    {PEDATDIR=PEDATDIR&0x0ff7f;}//enable the SCI input PORT PE7=0;
#define SCIOUTPUT   {PEDATDIR=PEDATDIR|0x0080;}//enable the SCI OUTPUT PORT PE7=1;
unsigned int scir[32],scit[32];
static unsigned int bagpointer=0;
//sciint
static unsigned int TP3=2001;//4002;//TP3=4002=5K;//3950;// 5K;TP3=1945   10K;//1333=15k;//667;//TP3=11340,15khz carry wave

/**********************************************************/
/*********************SYSTEM initial subroutine ***************
/*************************************************************/
void inline enable()/*开总中断子程序*/
{asm(" clrc INTM ";}
void inline disable()/*屏蔽中断子程序*/
{asm(" setc INTM ";}
void B0_DATA()      //b0被配置为数据存储区
{asm(" clrc CNF ";}
void ACC_OVERFLOW() //ACC正常溢出
{asm(" clrc OVM ";}
void SETC_SXM()     //允许符号位扩展
{asm(" setc SXM ";}
void CLRC_SXM()     //抑制符号位扩展
{asm(" clrc SXM ";}
/***************************************************************
************SYSTEM initial*****************************************
**********************************************************/
void SYSTEMinitial()
{
        B0_DATA();
        ACC_OVERFLOW();
        CLRC_SXM();
        disable();

        //WDTH
        WSGR=0x0000;/*no wait*/
        WDCR=0x0068;//0x00e8;/*watchdog disable*/
        WDKEY=0x0055;
        WDKEY=0x00aa;

        //DSP core register        
        IFR=0x0ffff;/*clear all intflags*/
        IMR=0x0012;        /*INT2,INT5 enable*/        
        XINT1CR=XINT2CR=0x8006;
        SCSR1=0x00cd;//4*CLKIN=40M  CLKIN=10M
    
}
/***************************************************************
/**************** ADC adjust*************************************
/**************************************************************/
void ADCadjust()
{
        unsigned int flag,i,right;
        unsigned LONG int TEMP=0;
        right=0xffc0;
        ADCTRL1=0x831a;//0x8310;//0x000a;
        for(i=0;i<2;i++)//2次求和作平均来校准
        {
                ADCTRL2=ADCTRL2|0x4000;
                flag=ADCTRL2&0x0200;
                while(!flag)
                flag=ADCTRL2&0x0200;
                TEMP+=CALIBRATION;                
                ADCTRL2=ADCTRL2|0x0200;
        }
        TEMP=TEMP>>1;
        right=right-TEMP;
        CALIBRATION=right;
        flag_adcadjust=1;
}
/***************************************************************
/*****************ADC initial*************************************
/************************************************************/
void ADCinitial()
{
        while(!flag_adcadjust) ADCadjust();        
    MAXCONV=0x0f;
        ADCTRL1=0x8310;
        ADCTRL2=0x6000;        
    CHSELSEQ1=0x3210;
        CHSELSEQ2=0x7654;
    CHSELSEQ3=0xbA98;
    CHSELSEQ4=0xFEDC;
}
/***************************************************************
/*****************************SCIinitial***************************
/*************************************************************/
void SCIinitial()
{
        int KK;
        SCICCR=0x0027;//0x0027;odd enable
        SCICTL1=0x0003;
        SCICTL2=0x0003;//0x0002;
        SCIHBAUD=0x02;
        SCILBAUD=0x08;//0208=9600;0411=4800;0104=19200
        SCIPRI=0x060;//0x20;
        SCICTL1=SCICTL1|0x0020;
        for(KK=0;KK<=32;KK++)
        {
           scir[KK]=0;
           scit[KK]=0;
        }        
}
/***************************************************************
/***************************IO   initial***************************
/**************************************************************/
void IOinitial()
{
        MCRA=0x0003;//0x000b;//SCITXD,RXD,CAP1 enable
    &n
2楼: >>参与讨论
ylz1111
你试下将下面两条去掉
IFR=IFR|0x0002;//clear the int2 flag

IFR=IFR|0x0010;//clear the int5 flag        

3楼: >>参与讨论
mazhibao
到底该怎么办啊!
还是不行啊,大哥,去掉就是进不了中断了啦!真烦人啊!

4楼: >>参与讨论
zxz213
不建议这样做
建议你用查询方式SCI
这样不影响PWM

5楼: >>参与讨论
ylz1111

IFR寄存器在中断响印后,自动清零复位!不需要再多此一举!
SCI在中断收发过程中,不断被PWM中断打扰,这样可能会影响SCI中断响应!


6楼: >>参与讨论
jackyli008
估计...
我是用汇编写的,所以C程序看着头大~hehe
估计你出现问题的原因是SCI还在处理中断的时候,T3就下溢了~好像没看到你在SCI中断里允许嵌套~


7楼: >>参与讨论
mazhibao
PWM中断和SCI中断冲突问题,请求高手出现(附程序)?
ylz1111 老兄说的对阿!谢谢了!

8楼: >>参与讨论
f702p
好象可以
你可以试试把enable()放在进中断的第一句;
其实有多个中断时,建议最好自己规划好使中断不冲突,
中断嵌套不是那么好玩的,能嵌两三次就不错了,
多了根本就不可能完成,造成CPU自己崩溃

参与讨论
昵称:
讨论内容:
 
 
相关帖子
烧写FLASH
有没有实现OFDM的开发板?
请问,ti的TMS320C64xx系列PCI接口好用么?
PNX1300的DEBUG问题
DSP的选型问题:DM642/DM643?
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号