在线情况
楼主
  • 头像
  • 级别
    • 积分7
    • 经验630
    • 文章5
    • 注册2012-06-19
    关于定时器A的一个提问帖
    [P]我是个新人,想用定时器a定时1s后led亮一次,但是结果是led闪烁的频率特别快,计数器根本没起作用。。。哪位高人给看看  我被困惑好久啦[CODE]//******************************************************************************
    #include  <msp430x14x.h>
    #define uchar unsigned  char
    #define uint  unsigned int
    #define ulong unsigned long
     uchar  int_f=0x00;
     uchar  count_f=0;
    void Clock_Init()
    {
      uchar i;
      BCSCTL1&=~XT2OFF;                 //打开XT振荡器
      BCSCTL2|=SELM1+SELS;              //MCLK为8MHZ,SMCLK为8MHZ
      do{
        IFG1&=~OFIFG;                   //清除震荡标志
        for(i=0;i<100;i++)
       _NOP();                      //延时等待
      }
      while((IFG1&OFIFG)!=0);           //如果标志为1,则继续循环等待
      IFG1&=~OFIFG;
    }
     
    void main(void)
    {
      WDTCTL = WDTPW + WDTHOLD;                      // Stop WDT
      Clock_Init();
      P2DIR |= 0x01;                                 // P2.0 output
      CCTL0 = CCIE;                                  // CCR0 interrupt enabled
      CCR0 = 50000;
      TACTL = TASSEL_2 + MC_1+ID_3;                  // SMCLK, upmode
      _EINT();
      while(1)
      {   if(count_f<19)
         {
          count_f++;
          }
         else
          {
          int_f=0x01;
          }
        }
     }
    // Timer A0 interrupt service routine
    #pragma vector=TIMERA0_VECTOR
    __interrupt void Timer_A (void)
     {
         if(int_f==0x01)
        {
          P2OUT ^= 0x01;
         
          }
      int_f=0x00;
     }
     
    [/C[CODE][/CODE]ODE][/P]
    微控网感谢您的参与
    在线情况
    2
    • 头像
    • 级别
    • 门派
    • 职务总版主
    • 声望+9
    • 财富5
    • 积分3065
    • 经验390701
    • 文章6744
    • 注册2006-03-07
    选择SMCLK时钟太高了(8MHZ),尝试将
    TACTL = TASSEL_2 + MC_1+ID_3; // SMCLK, upmode
    更换成
    TACTL = TASSEL_1 + MC_1+ID_3;  // ACLK, upmode
    试试看...
    [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
    在线情况
    3
    • 头像
    • 级别
      • 积分7
      • 经验630
      • 文章5
      • 注册2012-06-19
      [P]改完以后好用了,谢谢楼主提醒,真是一句话值万金啊 [EM10][/P]
      微控网感谢您的参与
      在线情况
      4
      • 头像
      • 级别
        • 积分7
        • 经验630
        • 文章5
        • 注册2012-06-19
        [P]还有一个问题,为什么在串口上看到的接收数据有个别是错误的呢?[/P][P]就是下面这样:44 44 44 44 44 44 44 44 44 44 FF 44 44 44................................就是这样的显示。[CODE]/********************************************************************
        //DM430-L型定时器中断程序
        //记时一秒让LED灯亮一次,选择辅助系统时钟32.768Khz,bo
        //调试环境:EW430 V5.30
        //第九单片机开发网
        //www.9mcu.com
        ********************************************************************/
        #include <msp430x14x.h>
        #define CPU_F ((double)8000000)
        #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
        #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
        #define uchar unsigned char
        #define uint  unsigned int
        #define ulong unsigned long
        /*当BRCLK=CPU_F时用下面的公式可以计算,否则要根据设置加入分频系数*/
        #define baud           9600                                //设置波特率的大小
        #define baud_setting   (uint)((ulong)CPU_F/((ulong)baud))  //波特率计算公式
        #define baud_h         (uchar)(baud_setting>>8)            //提取高位
        #define baud_l         (uchar)(baud_setting)               //低位
        #define KeyPort         P1IN                              //独立键盘接在P10~P13
        #define LED             P2OUT                             //LED灯接在P20、P21上
        uchar  int_f=0x00;
        //uchar  count_f=0;
        //*************************************************************************
        //       系统时钟初始化
        //*************************************************************************
        void Clock_Init()
        {
          uchar i;
          BCSCTL1&=~(XT2OFF+XTS);                 //打开XT振荡器
          BCSCTL2 |=SELM1;                        //选择MCLK物理时钟源为XT2,不分频为8MHZ
          BCSCTL2 |=SELS;                         //选择SMCLK为外部8M时钟源(理解)
          do{
            IFG1&=~OFIFG;                   //清除震荡标志
            for(i=0;i<100;i++)
            _NOP();                      //延时等待
          }
          while((IFG1&OFIFG)!=0);           //如果标志为1,则继续循环等待
          IFG1&=~OFIFG;
        }
        //*************************************************************************
        //      MSP430内部看门狗初始化
        //*************************************************************************
        void WDT_Init()
        {
           WDTCTL = WDTPW + WDTHOLD;       //关闭看门狗
        }
        //*************************************************************************
        // 初始化IO口子程序
        //*************************************************************************
        void Port_init()
        {
          P1SEL = 0x00;                   //P1普通IO功能
          P1DIR = 0xF0;                   //P10~P13输入模式,外部电路已接上拉电阻
          P1IES = 0x0F;
          P1IFG = 0;
          P1IE = 0x0F;
          P2SEL = 0x00;                   //P2口普通IO功能
          P2DIR = 0x01;                   //P2口输出模式
        }
        //*************************************************************************
        //               MSP430串口初始化
        //*************************************************************************
        void UART_Init()
        {
          U1CTL|=SWRST;               //复位SWRST
          U1CTL|=CHAR;                //8位数据模式
          U1TCTL|=SSEL1;              //SMCLK为串口时钟
          U1BR1=baud_h;               //BRCLK=8MHZ,Baud=BRCLK/N
          U1BR0=baud_l;               //N=UBR+(UxMCTL)/8
          U1MCTL=0x00;                //微调寄存器为0,波特率9600bps
          ME2|=UTXE1;                 //UART1发送使能
          ME2|=URXE1;                 //UART1接收使能
          U1CTL&=~SWRST;
          IE2|=URXIE1;                //接收中断使能位
          P3SEL|= BIT6;               //设置IO口为特殊功能模块
          P3DIR|= BIT6;               //设置P3.4为输入,P3.5为输出口
          P3SEL|= BIT7;              //设置IO口为外围功能模块
         
        }
        //*************************************************************************
        //              串口0发送数据函数
        //*************************************************************************
          void Send_Byte(uchar data)
            {
              U1TXBUF=data;              
              while ((IFG2 & UTXIFG1)==0);
            }
        //*************************************************************************
        //            处理来自串口 0 的发送中断,预留
        //*************************************************************************
        #pragma vector=UART0TX_VECTOR
        __interrupt void UART0_TX_ISR(void)
        {
        }
        //*************************************************************************
        //  定时器中断服务程序
        //*************************************************************************
        #pragma vector = TIMERA0_VECTOR
        __interrupt void Timer_A(void)  
            {
               P2OUT ^= 0x01;
               Send_Byte(0x44);
            }
        //*************************************************************************
        //  主程序
        //*************************************************************************
        void main(void)
        {
          WDT_Init();                            //看门狗设置
          Clock_Init();                          //系统时钟设置
          Port_init();                           //系统初始化,设置IO口属性
          UART_Init();
          CCTL0=CCIE;
          CCR0=32768;                 //计数到32768,定时1s
          TACTL=TASSEL_1+MC_1 ;       //计数器设置为增计数模式,采用辅助系统统时钟
          _EINT();                    //开中断
          while(1)
          {
           }  
        }
         

          [/CODE][/P]
        微控网感谢您的参与
        Powered by LeadBBS 9.2 .
        Page created in 0.1719 seconds with 5 queries.