智能车制作

标题: 小弟用串口时遇到一个问题,请各位指教~~ [打印本页]

作者: 夜尽天明211    时间: 2012-6-28 10:56
标题: 小弟用串口时遇到一个问题,请各位指教~~
写XS128的程序时,用了一下串口,部分代码如下:
/*************  锁相环24M  **************/
void PLL_Init()
{
    CLKSEL=0x00;                //初始时还没有PLL
    PLLCTL=0xe1;                //时钟监控使能,PLL允许,VCOCLK调频2%,禁止快速苏醒,禁止自给时钟,伪停止下禁止实时中断和看门狗
    SYNR=2;
    REFDV=1;                    //PLLCLK=2*OSCCLK*(SYNR+1/((REFDV+1))=48M;
    asm NOP;asm NOP;asm NOP;    //等待锁相环稳定
    while(!(CRGFLG&0x08));      //锁相环稳定标志位
    CLKSEL=0x80;                //时钟选择寄存器,Bus Clock=PLLCLK/2,停止模式下振荡器、系统时钟、锁相环、内核时钟、看门狗继续工作
}

/*************  SCI设定9600波特  ***************/
void SCI_Init()
{
    SCI0BDH=0x00;
    SCI0BDL=0x9a;       //9600bps BaudRate=BusClock/(16*SCIBD)
    SCI0CR2=0x2C;       //发送允许 接受中断允许
}

/*********** 串口发送程序:此部分为网上下载************/
void uart_putchar ( unsigned char c)
{
  
  while(!(SCI0SR1&0x80)) ;       //keep waiting when not empty  
  SCI0DRL=c;
}

void uart_putstr(char ch[])
{
  unsigned char ptr=0;
  while(ch[ptr]){
      uart_putchar((unsigned char)ch[ptr++]);
  }
}
unsigned char uart_getchar(void)
{
//printf("uart_getchar\n");

  byte res=0;
   while(!(SCI0SR1&0x80)) ;    //keep waiting when not empty  
   return (SCI0DRL);
}
unsigned short CRC_CHECK(unsigned char *Buf, unsigned char CRC_CNT)
{
    unsigned short CRC_Temp;
    unsigned char i,j;
    CRC_Temp = 0xffff;
    for (i=0;i<CRC_CNT; i++){      
        CRC_Temp ^= Buf;
       for (j=0;j<8;j++) {
            if (CRC_Temp & 0x01)
                CRC_Temp = (CRC_Temp >>1 ) ^ 0xa001;
            else
                CRC_Temp = CRC_Temp >> 1;
        }
    }
    return(CRC_Temp);
}
void OutPut_Data(void)
{
  int temp[4] = {0};
  unsigned int temp1[4] = {0};
  unsigned char databuf[10] = {0};
  unsigned char i;
  unsigned short CRC16 = 0;
  for(i=0;i<4;i++)
   {
   
    temp  = (int)OutData;
    temp1 = (unsigned int)temp;
   
   }
   
  for(i=0;i<4;i++)
  {
    databuf[i*2]   = (unsigned char)(temp1%256);
    databuf[i*2+1] = (unsigned char)(temp1/256);
  }
  
  CRC16 = CRC_CHECK(databuf,8);
  databuf[8] = CRC16%256;
  databuf[9] = CRC16/256;
  
  for(i=0;i<10;i++)
    uart_putchar(databuf);
}
void Sent_Data()
{
    OutData[0]=g_fGravityZAxis;
    OutData[1]=g_fAngle;
    OutData[2]=g_fAngularVelocity+100;   
    OutPut_Data();
}
用示波器观察此段程序执行时间为8.4ms,远超过1ms中断。我们加上这个函数所有控制的执行频率为88Hz,去掉这个中断,程序执行频率为200Hz,即5ms的循环控制执行。用的软件是:
[attach]26044[/attach]
请问各位用的都是这个软件吗?用的过程中出现过这个问题没啊???现在极度郁闷中。。。



作者: Alliswall    时间: 2012-7-2 14:40
咋知道的8.4ms

作者: Alliswall    时间: 2012-7-2 14:40


作者: 夜尽天明211    时间: 2012-7-2 15:18
Alliswall 发表于 2012-7-2 14:40
咋知道的8.4ms

我在进入函数之前置高PB口,出函数时置低,然后用示波器看波形,看高电平的长度。加了串口后整个函数的执行周期就变了,我们现在都不敢用串口。搞的我们想观察一下运行过程中的动态参数都不行,这个怎么办啊??你们怎么弄得啊???
作者: 在路上520    时间: 2012-7-2 20:30
你们把这个放中断里了?

作者: 夜尽天明211    时间: 2012-7-2 20:34
在路上520 发表于 2012-7-2 20:30
你们把这个放中断里了?

难道不用放中断里面吗??不放中断里,时间也是很长的啊
作者: 在路上520    时间: 2012-7-2 20:36
夜尽天明211 发表于 2012-7-2 20:34
难道不用放中断里面吗??不放中断里,时间也是很长的啊

好像不能放中断里,它运行的时间太长了,会把中断搞乱的
作者: 夜尽天明211    时间: 2012-7-2 20:40
在路上520 发表于 2012-7-2 20:36
好像不能放中断里,它运行的时间太长了,会把中断搞乱的

是啊,我也是这么觉得,那不放中断里,每次更新的数据不就不能及时发回来嘛!!你们是怎么做的啊??
作者: 在路上520    时间: 2012-7-2 20:46
放在主程序for里就好了





欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2