在线情况
楼主
  • 头像
  • 级别
    • 积分7
    • 经验965
    • 文章10
    • 注册2006-07-26
    使用Timer_B模拟串口遇到的问题,请各位大虾解答下或提点建议
    [P][BGCOLOR=#3c8dc4][B]TIMER_B模拟串口,在中断接收程序调试中有些疑问,TB内部无锁存器(即无SCCI,仅TIMER_A有),工作于接收模式时输入电平如何获取(CCI???);请高人指教。谢谢!![/B][/BGCOLOR][/P]
    smile all my life!!
    在线情况
    2
    • 头像
    • 级别
      • 积分1
      • 经验156
      • 文章4
      • 注册2010-01-11
      [P]模拟串口使用中断口,这样就可以在第一时间判断起始位[/P]
      微控网感谢您的参与
      在线情况
      3
      • 头像
      • 级别
        • 积分7
        • 经验965
        • 文章10
        • 注册2006-07-26
        [P]接收已使用中断的(捕获+比较),但因TB无SCCI位,想问下输入电平如何读取呢,使用CCI是否可以?[/P][P]如下附接收/发送中断代码,请各位指点下啊![/P][P] [/P][P]#if __VER__ < 200
        interrupt[TIMERB0_VECTOR] void Timer_B (void)
        #else
        #pragma vector=TIMERB1_VECTOR
        __interrupt void TIMERB1_ISR (void)
        #endif
        {    
            // RX(接收字节)
            if ( TBCCTL2 & CCIFG ) // RX on CCI2A(如果CCI2A是捕获输入引脚)
            {
               TBCCR2 += Bitime;    // Add Offset to CCR2(下一定时时间为1位时间)
               
               if( TBCCTL2 & CAP ) // Capture mode = start bit edge(如果是在捕获模式,则是在等待起始位)
               {
                   TBCCTL2 &= ~ CAP;        // Switch from capture to compare mode(得到起始位后改为比较模式)
                   TBCCR2 += Bitime_5;    //定时位置改到位的中间位置(加半个位的时间)
               }
               else
               {
                   RX_DATA = RX_DATA >> 1;    //先收到的是低位
                   if (TBCCTL2 & CCI) // [B][COLOR=#f70909]TB无SCCI,不知此处是否有问题.[/COLOR][/B][/P][P]                RX_DATA |= 0x80;    //[/P][P]            BitCnt --; // All bits RXed?    //位计数减1
                   if ( BitCnt == 0)        //接收完一个字节?
                   //>>>>>>>>>> Decode of Received Byte Here <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                   {
                       BitCnt = 0x08;
                       TBCCTL2 &= ~ CCIE; // All bits RXed, disable interrupt(接收完一个字节后禁止中断)
                       //_BIC_SR_IRQ(LPM2_bits); // Clear LPM3 bits from 0(SR)(准备退出低功耗模式)
                   }
                   //>>>>>>>>>> Decode of Received Byte Here <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
               }
               TBCCTL2 &= ~ CCIFG;
            }
            // TX(发送字节,在进入发送中断前已经置位OUTMOD0)
            else if(TBCCTL1 & CCIFG)
            {      
               TBCCR1 += Bitime;    // Add Offset to CCR1(下一定时时间为1位时间)
               
               if ( BitCnt == 0)        //所有位发送完成
                       TBCCTL1 &= ~ CCIE;    // All bits TXed, disable interrupt(禁止中断)
                 else
                 {
                       
                       if (TX_DATA & 0x01)
                           TBCCTL1 &= ~ OUTMOD2;    // TX Mark(输出模式OUTMOD0:置位)
                       else
                           TBCCTL1 |= OUTMOD2;    // TX Space(输出模式OUTMOD2+OUTMOD0:复位)
           
                       TX_DATA = TX_DATA >> 1;    //低位先发
                       BitCnt --;            //位计数
                 }
                 TBCCTL1 &= ~ CCIFG;
            }
        }
        [/P][P] [/P]
        smile all my life!!
        在线情况
        4
        • 头像
        • 级别
        • 门派
        • 职务总版主
        • 声望+9
        • 财富5
        • 积分3065
        • 经验390701
        • 文章6744
        • 注册2006-03-07
        [P]“[B][COLOR=#f70909]TB无SCCI,不知此处是否有问题.[/COLOR][/B]”
        非也,TB同样有CCI的;必须的![/P][P]这是一个信号也,也是一个位;你接收到的每位信号是0还是1都得必须读取这位来识别的。[/P][P]嘿嘿~,看看模块结构图吧...[EM04][/P]
        [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
        在线情况
        5
        • 头像
        • 级别
          • 积分7
          • 经验965
          • 文章10
          • 注册2006-07-26
          [P]多谢DC大哥,已经搞定了呵呵[/P]
          smile all my life!!
          Powered by LeadBBS 9.2 .
          Page created in 0.1875 seconds with 5 queries.