打印

紧急求助!!!!!

[复制链接]
2119|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
开心啤酒|  楼主 | 2007-3-16 09:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AD, dc, TE, ADC, se
各位高手,本人遇到一难题,在程序中,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;
}

相关帖子

沙发
开心啤酒|  楼主 | 2007-3-16 10:15 | 只看该作者

另:本人使用的是TMS320LF2407A

使用特权

评论回复
板凳
开心啤酒|  楼主 | 2007-3-16 12:22 | 只看该作者

请高手指点迷津!

问题找到了.
SCSR1=0x87FE;     //**83FE**        
如果是83FE就对了。是87FE就错了。也就是说倍频是2就对了。如果是1就错了.我想知道这是为什么,请高手给予指点.谢谢了。

使用特权

评论回复
地板
nxy825715| | 2007-3-16 15:21 | 只看该作者

个人见解:

老兄,不要上来就一大把代码,过客没有那么多的时间呀.
提问题的时候抓关键.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝