zoukankan      html  css  js  c++  java
  • 4-MSP430定时器_定时器中断

    一开始没写好就上传了,,,,,,,,这次来个全的

    自己学MSP430是为了写一篇关于PID的文章,需要430在proteus上做仿真,一则认为在自动控制算法上PID真的很经典,PLC设备上大多是模块式的,拿来就是参考说明书设置,设置,,,而对于单片机而言就是程序!!!只有自己写出来PID算法,才能对PID有更深刻的理解,..二来感觉自己已经好久都没有写一篇让自己感到满意的文章了......

    这些天,,,,今天终于解除了我的很大疑惑了,,,,,,,终于可以完成这篇普通普通定时器中断的文章了,,,,,,其实说普通也不普通,,MSP430的定时器确实设计的很强悍,,,,,,,,

    其实对于普通定时器吧!不外乎,,,,定时,,,,产生中断,,,,细节问题就不说了,,,,看我下面的理论介绍部分,,其实写文章一部分是为了分享,最重要的是考验自己到底有没有真正的学会,真正的深入理解了自己所学的东西,自己学东西是一步一个脚印,这倒是高中的班主任的功劳,现在想想自己自学从高三就开始了,没想到当年的班主任的一段话对自己的影响竟然如此的大..如果文章有问题希望亲们给意见哈,,,

    CCR0   和  TACCR0  是一个哈,,,,,,,,别在别处看到CCR0就蒙了哈,,,这是设置的计数比较值,,

    430的定时器能选择时钟来源,,具体看下面,,,如果不选择那么就是用一个引脚(特定的)的输入PWM作为他的时钟了

    先上菜----外部引脚来四个上升沿就进入下面的中断函数  

    实质----内部计数器TAR在计数到CCR0(TACCR0)时就进来了

    __interrupt void Timer_A0 (void)     //定时器A0中断服务程序
    {
      P4OUT ^= BIT1; //P4_1引脚反转
    }

    然后再来一个上升沿,,就会进入---溢出中断-------可以取消,不让他有溢出中断   

    实质----内部计数器TAR在计数到CCR0后,,再来一个上升沿就变成 0 了,,,然后就就进来了

    __interrupt void Timer_A1 (void) //A1,A2,溢出中断都会进
    {
      switch( TAIV )
      {
      case  TAIV_TAIFG://溢出中断
                 P4OUT ^= BIT1; //P4_1反转
                 break;
      }
    }

    下面是完整的程序

    P1_0引脚,来四个上升沿TAR变为4,,P4_1反转,,,再来一个沿TAR变为0,再来四个,TAR变为4,,P4_1反转,再来一个沿TAR变为0,再来四个,TAR变为4,,P4_1反转,,,循环

    所以发现第一次来四个P4_1反转,,,,后来的都是来5个再反转了,,所以如果你想来四个反转,,那么TACCR0应该为3

    #include "io430.h"
    
    void main( void )
    {
      // Stop watchdog timer to prevent time out reset
      WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
      
      P4DIR |= BIT1; 
      
      TACTL |= TASSEL_0 + MC_1+ TAIE + TACLR;//时钟外部引脚输入,增计数模式,产生溢出中断(可以取消),清除一下溢出,,其实严谨一点嘛,先清除再说
    
      TACCR0 = 3;//计数值3
      TACCTL0 = CCIE;//允许中断
      
      __enable_interrupt();//打开总中断
    }
    
    #pragma vector = TIMERA0_VECTOR
    __interrupt void Timer_A0 (void)     //定时器A0中断服务程序
    {
      P4OUT ^= BIT1; 
    }
    
    #pragma vector = TIMERA1_VECTOR
    __interrupt void Timer_A1 (void) //A1,A2,溢出中断都会进
    {
      switch( TAIV )
      {
      case  TAIV_TAIFG://溢出中断
                 P4OUT ^= BIT1; 
                 break;
      }
    }

    现在去掉溢出中断

     

    #include "io430.h"
    
    void main( void )
    {
      // Stop watchdog timer to prevent time out reset
      WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
      
      P4DIR |= BIT1; 
      
      TACTL |= TASSEL_0 + MC_1+TACLR;//外部引脚模式,,增计数模式
    
      TACCR0 = 3;//计数值3,其实是4,,因为有一个溢出变为0
      TACCTL0 = CCIE;//允许中断
      
      __enable_interrupt();//打开总中断
    }
    
    #pragma vector = TIMERA0_VECTOR
    __interrupt void Timer_A0 (void)     //定时器A0中断服务程序
    {
      P4OUT ^= BIT1; 
    }

    下面是一些具体解释

    #include "io430.h"
    
    void main( void )
    {
      // Stop watchdog timer to prevent time out reset
      WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
      
      P4DIR |= BIT1+BIT2; 
      
      TACTL |= TASSEL_0 + MC_2+TACLR;//外部引脚模式,,连续计数模式
    
      TACCR0 = 4;//计数值4
      TACCTL0 = CCIE;//允许中断
      
      __enable_interrupt();//打开总中断
    }
    
    #pragma vector = TIMERA0_VECTOR
    __interrupt void Timer_A0 (void)     //定时器A0中断服务程序
    {
      P4OUT ^= BIT1; 
    }

    可以这样

    #include "io430.h"
    
    void main( void )
    {
      // Stop watchdog timer to prevent time out reset
      WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
      
      P4DIR |= BIT1+BIT2; 
      
      TACTL |= TASSEL_0 + MC_2+TACLR;//外部引脚模式,,连续计数模式
    
      TACCR0 = 4;//计数值4
      TACCTL0 = CCIE;//允许中断
      
      __enable_interrupt();//打开总中断
    }
    
    #pragma vector = TIMERA0_VECTOR
    __interrupt void Timer_A0 (void)     //定时器A0中断服务程序
    {
      TACCR0 = TACCR0 + 4;//******这里,这里***********//
      P4OUT ^= BIT1; 
    }

    因为是连续计数模式,所以可以用TACCR1了,,,,

    #include "io430.h"
    
    void main( void )
    {
      // Stop watchdog timer to prevent time out reset
      WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
      
      P4DIR |= BIT1+BIT2; 
      
      TACTL |= TASSEL_0 + MC_2+TACLR;//外部引脚模式,,连续计数模式
    
      TACCR0 = 4;//计数值4,TAR==TACCR0进入它的中断函数
      TACCTL0 = CCIE;//允许中断
      
      TACCR1 = 6;//计数值6,TAR==TACCR1进入它的中断函数
      TACCTL1 = CCIE;//允许中断
      
      __enable_interrupt();//打开总中断
    }
    
    #pragma vector = TIMERA0_VECTOR
    __interrupt void Timer_A0 (void)     //定时器A0中断服务程序
    {
      TACCR0 = TACCR0 + 4;//******这里,这里***********//
      P4OUT ^= BIT1; 
    }
    
    #pragma vector = TIMERA1_VECTOR
    __interrupt void Timer_A1 (void) //A1,A2,溢出中断都会进(共用)
    {
      switch( TAIV )
      {
      case  TAIV_TACCR1://计数"  TACCR1 "的中断
                 TACCR1 = TACCR1 + 6;
                 P4OUT ^= BIT2; 
                 break;
      }
    }

    既然有溢出中断那么再加上溢出中断吧

    #include "io430.h"
    
    void main( void )
    {
      // Stop watchdog timer to prevent time out reset
      WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
      
      P4DIR |= BIT1+BIT2+BIT3; 
      
      TACTL |= TASSEL_0 + MC_2 + TAIE +TACLR;//外部引脚模式,,增计数模式
    
      TACCR0 = 4;//计数值4,TAR==TACCR0进入它的中断函数
      TACCTL0 = CCIE;//允许中断
      
      TACCR1 = 6;//计数值6,TAR==TACCR1进入它的中断函数
      TACCTL1 = CCIE;//允许中断
      
      __enable_interrupt();//打开总中断
    }
    
    #pragma vector = TIMERA0_VECTOR
    __interrupt void Timer_A0 (void)     //定时器A0中断服务程序
    {
      TACCR0 = TACCR0 + 4;//******这里,这里***********//
      P4OUT ^= BIT1; 
    }
    
    #pragma vector = TIMERA1_VECTOR
    __interrupt void Timer_A1 (void) //A1,A2,溢出中断都会进(共用)
    {
      switch( TAIV )
      {
      case  TAIV_TACCR1://计数"  TACCR1 "的中断
                 TACCR1 = TACCR1 + 6;
                 P4OUT ^= BIT2; 
                 break;
      case  TAIV_TAIFG://溢出中断,,,,ffff变0时
                 P4OUT ^= BIT3; 
                 break;           
      }
    }

    下面是理论知识的介绍,,,看了上面再看一下下面,,,,,

     

    通俗来讲,430F249有三个振荡器,LFXT1,,XT2,,DCO,

    内部的主时钟MCLK,,子系统时钟SMCLK和辅助时钟ACLK是由这三个振荡器来源提供的.

    MCLK:主时钟

    可以选择3个振荡器(LFXT1、XT2、DCO)之一,或它们1/2/4/8分频后作为其信号源;

    SMCLK:子系统时钟

    可以选择2个振荡器(XT2、DCO),或它们1/2/4/8分频后作为其信号源;

    ACLK:辅助时钟

    只能由LFXT1时钟信号或1/2/4/8分频后作为其信号源。

    有三个呢!!!真多

     

    自从博客可以复制粘贴图片,感觉真是太方便了

  • 相关阅读:
    New version of VS2005 extensions for SharePoint 3.0
    QuickPart : 用户控件包装器 for SharePoint Server 2007
    随想
    发布 SharePoint Server 2007 Starter Page
    如何在SharePoint Server中整合其他应用系统?
    Office SharePoint Server 2007 中文180天评估版到货!
    RMS 1.0 SP2
    SharePoint Server 2007 Web内容管理中的几个关键概念
    如何为已存在的SharePoint站点启用SSL
    Some update information about Office 2007
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/6221048.html
Copyright © 2011-2022 走看看