【课后练习】LaunchPad课后练习七之定时器

常见泽1   2012-5-31 19:05 楼主

课后练习七之定时器

 

(定时器看起来简单,却搞了好久,和之前的430定时器不太一样,看了很多次,还有很多没弄出来的地方,有几个地方还是没懂)

1.TIMER_A由以下部分组成

[1] 计数器部分

输入的时钟源具有4种选择,所选择的时钟源又可以1248分频作为计数频率,TIMER_A可以通过选择4种工作模式灵活的完成定时/计数功能。

[2] 捕获/比较

用于捕获事件发生的时间或产生时间间隔,捕获比较功能的引入主要时为了提高 I/O 端口处理事务的能力和速度。不同的 MSP430 单片机 TIMER_A 模块中所含有的捕获/比较器的数量不一样,每个捕获/比较器的结构完全相同,输入和输出都取决于各自所带的控制寄存器的控制字,捕获/比较器相互之间工作完全独立。

[3] 输出单元

具有可选的8种输出模式,用于产生用户需要的输出信号,支持 PWM

2.寄存器

寄存器              缩写            读定类型        地址    初态

Timer_A控制寄存器     TACTL          Timer_A计数器             TAR        捕捞/比较控制寄存器0    CCTL0     

 捕捞/比较寄存器0        CCR0           捕捞/比较控制寄存器1   CCTL1           捕捞/比较寄存器1     CCR1          

捕捞/比较控制寄存器2  CCTL2          捕捞/比较寄存器2         CCR2              中断向量寄存器        TAIV

具体的就不介绍了,书上和手册上都有。

 

请看四楼,程序有问题 还望解答。本楼层字数写不下,谢谢各位了。

课后练习七之定时器.pdf (102.67 KB)
(下载次数: 429, 2012-5-31 19:05 上传)

1.    

 

[ 本帖最后由 常见泽1 于 2012-5-31 19:14 编辑 ]

回复评论 (7)

3.应用

(1)定时器中断

步骤:1:设置TIMER_A 控制寄存器

         2 开中断

      3 中断函数

 

分解: TACTL = TASSEL_2           + MC_2        +     TAIE;          

 MCLK系统时钟   连续计数模式       允许溢出中断

           由于我没接外部晶振,由于震荡器失效时,DCO震荡器会被自动选为MCLK时钟源。MSCLK=SMCLK=DCOCLK

注意点:

MSP430G2452 定时器有TA0 TA1

 Timer0_A3     TACCR0    CCIFG(4)                 maskable 0FFF2h 25

Timer0_A3    TACCR2 TACCR1 CCIFG. TAIFG(2) (4)     maskable 0FFF0h 24

TAIFG为定时器溢出中断,可以看出一个有定时器溢出中断,另外一个没有,到底是哪个呢,看头文件!

#define TIMER0_A1_VECTOR    (8 * 2u)  /* 0xFFF0 Timer0_A CC1, TA */

#define TIMER0_A0_VECTOR    (9 * 2u)  /* 0xFFF2 Timer0_A CC0 */

可以看出是TIMER0_A1_VECTOR

 

在例程中,我试过用TIMER0_A0_VECTOR,果然无法进入定时器溢出中断,因为TIMER0_A0不存在定时器溢出中断。

 

  1. (1)/***********************************************
    **** LAUNCH PAD 学习之定时器中断 ***
    **** MCU: MSP430 ***
    **** 作者: 常见泽 ***
    **** 内部DCO ***
    **** ***
    **** 2012.05.28.21:16 ***
    **** 实验现象:LED灯闪烁 周期约为12Ms ***
    ***********************************************/

    #include <msp430g2452.h>

    void main(void)
    {
    WDTCTL = WDTPW + WDTHOLD; // Stop WDT
    P1DIR |= 0x01; // P1.0 output
    TACTL = TASSEL_2 + MC_2 + TAIE; // MCLK, contmode, 中断允许
    _EINT(); //开中断
    while(1);
    }

    // Timer_A3 Interrupt Vector (TAIV) handler
    #pragma vector = TIMER0_A1_VECTOR
    __interrupt void Timer_A(void)
    {
    switch( TAIV )
    {
    case 10:

    P1OUT ^= 0x01; // 异或取反
    break;
    }
    }

 

点赞  2012-5-31 19:06

应用2:

(1)TIMER0_A0比较中断

计数器TAR可以选择增计数模式。当计数值与CCR0的值相等(或者定时器值大于CCR0)时,定时器复位并从0开始重新计数。

TACTL = TASSEL_2 + MC_1+TACLR;                  // MCLK,upmode

CCTL0 = CCIE;                                   // 允许中断

(这个用的是TIMER0_A0

 

  1. /***********************************************
    **** LAUNCH PAD 学习之比较中断 ***
    **** MCU: MSP430 ***
    **** 作者: 常见泽 ***
    **** ***
    **** ***
    **** 2012.05.29.20:16 ***
    **** 实验现象:灯闪烁 ***
    **** ***
    **** up 比较中断 (周期约10ms)i放大100倍 ***
    ***********************************************/

    #include <msp430g2452.h>

    unsigned int i;
    void main(void)
    {
    WDTCTL = WDTPW + WDTHOLD; // Stop WDT

    P1DIR |= (0x01|BIT6); // P1.0 output
    P1OUT = 0x00;
    CCR0 = 50000;
    TACTL = TASSEL_2 + MC_1+TACLR; // MCLK,upmode
    CCTL0 = CCIE; // 允许中断

    _EINT();
    while(1);
    }

    #pragma vector= TIMER0_A0_VECTOR
    __interrupt void Timer_A (void)
    {
    i++;
    if(i==100)
    {
    P1OUT ^= BIT6; // Toggle P1.0
    i=0;
    }
    CCR0 = 50000;
    }

点赞  2012-5-31 19:07

应用3:

 

当然应用1 和应用2 的程序都已经通过,但是应用三的程序不行,请高手指教。

 

TIMERA1比较中断

同样的程序,只修改CCR1 CCTL1 CCTL1 = CCIE

#pragma vector= TIMER0_A1_VECTOR

 

把上面的程序修改三个地方应该是TIMER0_A1比较中断,可是却进不来中断,不知道为何。。

 

 

  1. void main(void)
    {
    WDTCTL = WDTPW + WDTHOLD; // Stop WDT

    P1DIR |= (0x01|BIT6); // P1.0 output
    P1OUT = 0x00;
    CCR1 = 50000;
    TACTL = TASSEL_2 + MC_1+TACLR; // MCLK,upmode
    CCTL1 = CCIE ; // 允许中断
    _EINT();
    while(1);
    }

    #pragma vector= TIMER0_A1_VECTOR
    __interrupt void Timer_A (void)
    {
    P1OUT |= BIT6; // Toggle P1.0
    CCR1 = 50000;
    }

点赞  2012-5-31 19:09

回复 4楼 常见泽1 的帖子

那个如果使用CCTL1以及CCTL2的话,需要用TIMER0_A1_VECTOR这个中断已经TAIV这个中断向量标志来确定是捕获/比较中断哪一个。而不能像CCTL0那样。
点赞  2012-6-18 16:24

回复 5楼 465055608 的帖子

MARKx下 现在板子不在 晚上测试下 谢谢了
点赞  2012-6-18 16:51
首先感谢楼主的分享。
有几个问题想请教楼主。
应用二中,使用比较中断,就是当计数器的值(TAR中的值)等于设定的CCR0值时产生中断。对吗?
定时器选择的时钟源为SMCLK,这个时钟源同时也是它的计数源吗?(就是说SMCLK既是定时器A的电源,同时也是它要计数的的来源,要是这样的话,电源和计数源可以分开吗,比如选SMCLK为时钟源,外部脉冲为计数源)
CCTLx中的CCISx是选择比较器/捕获的输入信号,其中CCIxA,CCIxB指的是外部信号。默认是CCIxA,您的程序中是默认的,就是说比较器的计数源是外部的,但实际上程序里没有外部输入。(可能是我理解错了)
以上是个人的理解,看了网上的资料,和的有差别,请楼主指点一二。
点赞  2012-7-29 11:32
你的问题解决了吗??
点赞  2012-8-31 16:54
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复