在线情况
楼主
  • 头像
  • 级别
    • 积分7
    • 经验218
    • 文章13
    • 注册2009-07-28
    关于用定时器TA模拟串口通信的问题
    大家好,之前看过坛子里的一片关于定时器TA模拟串口通信的文章,这两天我自己也想实验一下,可是接收到的数据都是乱码。看看定义的内容和实现的方法和之前看过的那篇文章是一样的,百思不得其解,想在这里请教一下大家。我先把我的代码贴上来。外部信号源是通过232转TTL芯片接入到430里的。

    1 #include "msp430x54x.h"
    2 #define TBIT1 104 ///采用1M的时钟,转成9600的波特率,1位时间
    3 #define TBIT0_5 52 //半位的时间
    4 unsigned char R_DATA;
    5 unsigned int T_DATA;
    6 int TR_COUNT;
    7 unsigned char R_Last;
    8 unsigned char aRecvData[1024];//接收数组
    9 void main()
     {
    10  WDTCTL = WDTPW + WDTHOLD;
    11  P1DIR&=~0x02;//TA0.0 设置捕捉模式中的输入源对应的IO口为输入状态
    12  P1SEL|=0x02;
    13  R_DATA=0;
    14  TR_COUNT=8;
    15  for(int a=0;a<1024;a++) aRecvData[a]=0;
    16  TA0CCTL0 = CCIE+CM_2+SCS+CCIS_0+CAP;// ;  下降沿触发,同步捕获          
    17  TA0CCR0 = TBIT1;                         
    18  TA0CTL = TASSEL_2 + MC_1;         // SMCLK,增计数模式  
    19  _EINT();
    20  while(1){}
        }
    21  #pragma vector=TIMER0_A0_VECTOR
    22  __interrupt void TIMER0_A0_ISR(void)
      {    
    23  TA0CCR0=TA0CCR0+TBIT1;
    24  if(TA0CCTL0&CAP)
        {
    25  TA0CCTL0&=~CAP;
    26  TA0CCR0=TA0CCR0+TBIT0_5;
    27  }else{
    28  R_DATA=R_DATA>>1;
    29  if(TA0CCTL0&SCCI)
        ;
    30  else R_DATA|=0x80;
    31  TR_COUNT--;
    32  if(TR_COUNT==0)
       {
    33  R_Last=R_DATA;
    34  TR_COUNT=8;
    35  TA0CCTL0 = CCIE+CM_2+CCIS_0+SCS+CAP;//
    36  aRecvData[iRecvIndex++]=R_Last;
        }     
       }  

    }
    微控网感谢您的参与
    在线情况
    2
    • 头像
    • 级别
      • 积分7
      • 经验218
      • 文章13
      • 注册2009-07-28
      依然没人理我
      微控网感谢您的参与
      在线情况
      3
      • 头像
      • 级别
        • 积分7
        • 经验218
        • 文章13
        • 注册2009-07-28
        重新修改一下我的问题


        大家好,之前看过坛子里的一篇关于定时器TA模拟串口通信的文章,这两天我自己也想实验一下,可是在TA的时钟源选择ACLK的时候,波特率设为300,1200,2400,4800接收到的数据都是正确的。TA的时钟源选择SMCLK的时候,在上面几种设置的波特率下接收到的数据就都是乱码。我的问题是:

        [color=#FF0000]定义的内容和实现的方法是一样的,为什么选择时钟源不同时就会产生问题。是选择时钟源时需要另外的设置吗?[/color]

        百思不得其解,想在这里请教一下大家。我先把我的代码贴上来。外部信号源是通过232转TTL芯片接入到430里的。

        1 #include "msp430x54x.h"
        2 #define TBIT1 104 ///采用1M的时钟,转成9600的波特率,1位时间
        3 #define TBIT0_5 52 //半位的时间
        4 unsigned char R_DATA;
        5 unsigned int T_DATA;
        6 int TR_COUNT;
        7 unsigned char R_Last;
        8 unsigned char aRecvData[1024];//接收数组
        9 void main()
        {
        10 WDTCTL = WDTPW + WDTHOLD;
        11 P1DIR&=~0x02;//TA0.0 设置捕捉模式中的输入源对应的IO口为输入状态
        12 P1SEL|=0x02;
        13 R_DATA=0;
        14 TR_COUNT=8;
        15 for(int a=0;a<1024;a++) aRecvData[a]=0;
        16 TA0CCTL0 = CCIE+CM_2+SCS+CCIS_0+CAP;// ; 下降沿触发,同步捕获
        17 TA0CCR0 = TBIT1;
        [color=#FF0000]18 TA0CTL = TASSEL_2 + MC_1; // SMCLK,增计数模式 ,(这个地方TASSEL_2 换成TASSEL_1即ACLK时接收数据没问题 )[/color]
        19 _EINT();
        20 while(1){}
        }
        21 #pragma vector=TIMER0_A0_VECTOR
        22 __interrupt void TIMER0_A0_ISR(void)
        {
        23 TA0CCR0=TA0CCR0+TBIT1;
        24 if(TA0CCTL0&CAP)
        {
        25 TA0CCTL0&=~CAP;
        26 TA0CCR0=TA0CCR0+TBIT0_5;
        27 }else{
        28 R_DATA=R_DATA>>1;
        29 if(TA0CCTL0&SCCI)
        R_DATA|=0x80;
        30 else ;
        31 TR_COUNT--;
        32 if(TR_COUNT==0)
        {
        33 R_Last=R_DATA;
        34 TR_COUNT=8;
        35 TA0CCTL0 = CCIE+CM_2+CCIS_0+SCS+CAP;//
        36 aRecvData[iRecvIndex++]=R_Last;
        }
        }

        }
        微控网感谢您的参与
        Powered by LeadBBS 9.2 .
        Page created in 0.1729 seconds with 5 queries.