|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
PWM中断和SCI中断冲突问题,请求高手出现(附程序)? |
作者:mazhibao 栏目:DSP技术 |
再次请教各位大侠,我在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 于 2006/7/20 14:59:00 发布:
你试下将下面两条去掉 IFR=IFR|0x0002;//clear the int2 flag IFR=IFR|0x0010;//clear the int5 flag |
3楼: | >>参与讨论 |
作者: mazhibao 于 2006/7/20 15:58:00 发布:
到底该怎么办啊! 还是不行啊,大哥,去掉就是进不了中断了啦!真烦人啊! |
4楼: | >>参与讨论 |
作者: zxz213 于 2006/7/21 3:09:00 发布:
不建议这样做 建议你用查询方式SCI 这样不影响PWM |
5楼: | >>参与讨论 |
作者: ylz1111 于 2006/7/24 8:27:00 发布:
说 IFR寄存器在中断响印后,自动清零复位!不需要再多此一举! SCI在中断收发过程中,不断被PWM中断打扰,这样可能会影响SCI中断响应! |
6楼: | >>参与讨论 |
作者: jackyli008 于 2006/7/26 23:00:00 发布:
估计... 我是用汇编写的,所以C程序看着头大~hehe 估计你出现问题的原因是SCI还在处理中断的时候,T3就下溢了~好像没看到你在SCI中断里允许嵌套~ |
7楼: | >>参与讨论 |
作者: mazhibao 于 2006/8/2 13:26:00 发布:
PWM中断和SCI中断冲突问题,请求高手出现(附程序)? ylz1111 老兄说的对阿!谢谢了! |
8楼: | >>参与讨论 |
作者: f702p 于 2006/8/3 15:58:00 发布:
好象可以 你可以试试把enable()放在进中断的第一句; 其实有多个中断时,建议最好自己规划好使中断不冲突, 中断嵌套不是那么好玩的,能嵌两三次就不错了, 多了根本就不可能完成,造成CPU自己崩溃 |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |