|
各位高手,本人遇到一难题,在程序中,AD采样已经屏蔽,只有SCI功能.问题是:通过SCI输出的数据不是我所期望的.怎么调也不对.程序源代码如下,肯请各位高手给予指点.谢谢.<br /><br />/*<br />AD采样基本程序,并带有排队滤波函数<br />*/<br />#include "global.c" <br />void SystemInit();<br />void Timer1Init(); <br />void KickDog(); <br /><br />void AD_Sample(); <br />void Que();<br /><br />void SCI_Init(); <br />void SCI_Send(); <br /><br />int numled0=200; <br />unsigned int t0=0,t1=0,i=0,j=0; <br />unsigned int RESULT_0=0,RESULT_8=0; <br />unsigned int AD0[18],AD8[18],AD_0,AD_8,AD_FLAG=0;<br />float AD_SIG0=0.0,AD_SIG8=0.0; <br />unsigned int SCI_RXDATA;<br /><br /><br />main()<br />{ <br /><br /> SystemInit(); //系统初始化<br /> <br /> MCRA=MCRA & 0xC0FF; //IOPB0-6设为IO口模式<br /> PBDATDIR=0xFFC2; //所有LED=0 <br /> PBDATDIR=PBDATDIR |0x003D; //所有LED=1 <br /> <br /> <br /> SCI_Init(); <br /> Timer1Init(); //定时器初始化<br /> asm(" CLRC INTM ");<br /> while(1)<br /> { <br /> if(AD_FLAG==1) <br /> { <br /> AD_FLAG=0;<br /> for(i=0;i<18;i++) <br /> { <br /> // AD_Sample(); <br /> AD0=RESULT_0;<br /> AD8=RESULT_8;<br /> }<br /> //Que(); //排队滤波<br /> }<br /> }<br /> <br />}<br /><br />void SystemInit() <br />{ <br /> <br /> asm(" SETC INTM "); /* 关闭总中断 */<br /> asm(" CLRC SXM "); /* 禁止符号位扩展 */ <br /> asm(" CLRC CNF "); /* B0块映射为 on-chip DARAM*/<br /> asm(" CLRC OVM "); /* 累加器结果正常溢出*/<br /> SCSR1=0x87FE; //**83FE** /* 系统时钟CLKOUT=20*2=40M */<br /> /* 打开ADC,EVA,EVB,CAN和SCI的时钟*/<br /> WDCR=0x006F; /* 禁止看门狗,看门狗时钟64分频 */ <br /> KickDog(); /* 初始化看门狗 */ <br /> IFR=0xFFFF; /* 清除中断标志 */<br /> IMR=0x0002; /* 打开中断2*/ <br /> <br />} <br /><br />void Timer1Init() <br />{ <br /><br /> EVAIMRA=0x0080; // 定时器1周期中断使能 <br /> EVAIFRA=0xFFFF; // 清除中断标志 <br /> GPTCONA=0x0000;<br /> T1PR=2500; // 定时器1初值,定时0.4us*2500=1ms <br /> T1CNT=0;<br /> T1CON=0x144E; //增模式, TPS系数40M/16=2.5M,T1使能<br /> <br />} <br /><br /><br /><br />void AD_Sample()<br />{ <br /><br /> ADCTRL1=0x4000; /* ADC模块复位 */<br /> asm(" NOP ");<br /> ADCTRL1=0x0020; /* 自由运行,启动/停止模式,双排序器工作模式 */<br /> <br /> MAXCONV=0x0000; <br /> CHSELSEQ1=0x0000; //第0通道<br /> ADCTRL2=0x4000; //复位使排序器指针指向CONV00<br /> ADCTRL2=0x2000; /* 启动ADC转换 */<br /> while( (ADCTRL2&0x1000)==0x1000); /*等待转换完成 */<br /> asm(" NOP ");<br /> asm(" NOP "); <br /> RESULT_0=RESULT0>>6; <br /> <br /> MAXCONV=0x0000; //第8通道 <br /> CHSELSEQ3=0x0008;<br /> ADCTRL2=0x0040;<br /> ADCTRL2=0x0020;<br /> while( (ADCTRL2&0x0010)==0x0010); <br /> asm(" NOP ");<br /> asm(" NOP ");<br /> RESULT_8=RESULT8>>6; <br /> <br /> }<br />void Que()<br />{<br /> unsigned int MaxAD0=0;<br /> unsigned int MinAD0=AD0[0];<br /> unsigned int MaxAD8=0;<br /> unsigned int MinAD8=AD8[0];<br /> unsigned int tempAD0=0;<br /> unsigned int tempAD8=0;<br /> for(j=0;j<18;j++)<br /> {<br /> if(AD0[j]>MaxAD0) MaxAD0=AD0[j];<br /> else if(AD0[j]<MinAD0) MinAD0=AD0[j]; <br /><br /> if(AD8[j]>MaxAD8) MaxAD8=AD8[j];<br /> else if(AD8[j]<MinAD8) MinAD8=AD8[j]; <br /> <br /> } <br /> for(j=0;j<18;j++)<br /> {<br /> tempAD0=tempAD0+AD0[j];<br /> tempAD8=tempAD8+AD8[j];<br /> } <br /> AD_0=(tempAD0-MaxAD0-MinAD0)/16; <br /> AD_8=(tempAD8-MaxAD8-MinAD8)/16; <br /> AD_SIG0=AD_0*4.983/1023; //1023~3.3*(10+5.1)/10=4.983V,对应满量程<br /> AD_SIG8=AD_8*4.983/1023; //电路中采用的是5.1k和10k的电阻分压<br /> asm(" NOP "); //请将光标移到此处设置断点,并用debug->Animate监测数据<br />} <br /><br /><br />void c_int1()<br />{<br /> if(PIVR!=0x06) //高优先级的SCI接收中断<br /> { asm(" CLRC INTM ");<br /> return;<br /> }<br /> SCI_RXDATA=(SCIRXBUF) & 0x00FF ; //串口接收的数据保存<br /><br /> IFR=0xFFFF;<br /> asm(" CLRC INTM ");<br /> <br />}<br /><br /><br />void c_int2() /*定时器1中断服务程序*/<br />{<br /><br /> if(PIVR!=0x27)<br /> { asm(" CLRC INTM ");<br /> return;<br /> }<br /> T1CNT=0; <br /> t0++;<br /> t1++;<br /> numled0--; <br /> if(numled0==0)<br /> {<br /> numled0=200;<br /> if((PBDATDIR & 0x0001)==0x0001) <br /> PBDATDIR=PBDATDIR & 0xFFFE; //IOPB0=0;LED灭 <br /> else<br /> PBDATDIR=PBDATDIR |0x0101; //IOPB0=1;LED亮 <br /> }<br />// if((AD_FLAG==0)&((t0%100)==0)) //定时AD采样<br />// { <br />// AD_FLAG=1;<br />// }<br /> ///*****************************************************///<br /> if((t1%100)==0) //定时循环100msSCI发送<br /> {<br /> SCI_Send();<br /> }<br /> ///***************************************************///<br /> EVAIFRA=0x80; <br /> asm(" CLRC INTM "); <br /> <br />} <br /><br />void SCI_Init() ///****///<br />{ <br /> MCRA=MCRA | 0x0003; //IOPA0, IOPA1为串口<br /><br /> SCICCR=0x0007; //空闲多处理器模式,8位数据?1位停止位,无奇偶校验位<br /> SCICTL1=0x0003; //接收,发送,内部时钟使能,SLEEP=1<br /> SCICTL2=0x0002; //接收中断使能<br /> SCIPRI=0x0000; //高中断优先级<br /> SCIHBAUD=0x0002; //40M,波特率设置为9600<br /> SCILBAUD=0x0008; <br /> SCICTL1=0x0023; //串口初始化完成 <br /> <br />}<br />void SCI_Send() //发送0x80-0x87, 共8个字节数据<br />{ <br /> <br /> ///********* 在此处添加虚拟数据进行测试********/////<br /> SCITXBUF=0x01; ////???????????????????????<br /> while((SCICTL2 & 0x80)==0);<br /> //************/////<br /> <br />}<br /><br />void KickDog() /*踢除看门狗 */<br />{<br /> WDKEY=0x5555;<br /> WDKEY=0xAAAA;<br />} |
|