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