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

自己学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 resetWDTCTL = WDTPW + WDTHOLD;//关闭看门狗
  P4DIR |= BIT1; TACTL |= TASSEL_0 + MC_1+ TAIE + TACLR;//时钟外部引脚输入,增计数模式,产生溢出中断(可以取消),清除一下溢出,,其实严谨一点嘛,先清除再说
TACCR0 = 3;//计数值3TACCTL0 = 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 resetWDTCTL = WDTPW + WDTHOLD;//关闭看门狗
  P4DIR |= BIT1; TACTL |= TASSEL_0 + MC_1+TACLR;//外部引脚模式,,增计数模式
TACCR0 = 3;//计数值3,其实是4,,因为有一个溢出变为0TACCTL0 = 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 resetWDTCTL = WDTPW + WDTHOLD;//关闭看门狗
  P4DIR |= BIT1+BIT2; TACTL |= TASSEL_0 + MC_2+TACLR;//外部引脚模式,,连续计数模式
TACCR0 = 4;//计数值4TACCTL0 = 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 resetWDTCTL = WDTPW + WDTHOLD;//关闭看门狗
  P4DIR |= BIT1+BIT2; TACTL |= TASSEL_0 + MC_2+TACLR;//外部引脚模式,,连续计数模式
TACCR0 = 4;//计数值4TACCTL0 = 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 resetWDTCTL = 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 resetWDTCTL = 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分频后作为其信号源。

有三个呢!!!真多

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

4-MSP430定时器_定时器中断相关推荐

  1. linux 定时器_定时器: Nodejs 中的 timers

    在看 Node http 模块文档的时候, 才留意到 server.timeout 这个属性, 本想简单介绍一下, 但是在梳理过后发现关于 timeout 有庞大的内容支撑: server.timou ...

  2. spring 定时器设置停止_单片机MSP430入门-理论⑦--定时器模块-定时器A②

    单片机MSP430入门-理论⑦--定时器模块-定时器A② 上期大概给大家汇总介绍了,定时器模块中比较重要并且常用的定时器A,大概说了下定时器A的两种常用模式,比较模式和捕获模式 本期将继续介绍定时器A ...

  3. 32 引脚_函数功能:定时器T0的中断服务子程序,使P3.7引脚输出音频方波

    void Time0_serve(void ) interrupt 1 using 1 { TH0=(8192-C)/32;     //可证明这是13位计数器TH0高8位的赋初值方法 TL0=(81 ...

  4. c语言编程流水灯与交通灯实验,C51单片机实验报告_流水灯_交通灯_定时器_双机交互_时钟.doc...

    C51单片机实验报告_流水灯_交通灯_定时器_双机交互_时钟 学 号: 班 级: 自动化10班 姓 名: 张 指导老师: 胡 2012.12 单片机核心板实验要求 流水灯实验 实验目的: 简单I/O引 ...

  5. 入门51单片机(STC8952RC)定时器、有关中断原理简述、寄存器设置与程序示例(包括流水灯和计时器)

    目录 1.单片机之定时器 1.1 STC89C52RC定时器模式1工作流程 1.1.1 计数部分 1.1.2 时钟部分 1.1.3 中断部分 1.2 定时器T0.T1相关寄存器 1.2.1 TCOM寄 ...

  6. MSP430f5529定时器,定时器中断

    MSP430f5529定时器,定时器中断[以TIMERA为例] 前言 功能概述 定时器启动方式 寄存器介绍 16位定时/计数器TAxR(TimerA Register) 定时器控制寄存器TAxCTL( ...

  7. 单片机MSP430入门-理论⑥--定时器模块-定时器A

    单片机MSP430入门-理论⑥--定时器模块-定时器A 上期大概给大家汇总介绍了,在MSP430环境下的定时器模块,其中主要又说了下看门狗定时器,这是一款比较特别的定时器,又能当定时器,又能当系统错误 ...

  8. STM32那点事(6)_定时器(上)

    STM32定时器是CPU中的基本功能模块之一,最基本的功能是提供定时,STM32定时器共用16个定时器,主要分为两个基本定时器,10个通用定时器,2个高级定时器,以及两个看门狗定时器.看门狗定时器后面 ...

  9. 从单片机到嵌入式开发——(6) 定时器与串口中断

    在上文中我们讲到了基本的中断定义和外部中断的使用方法.本篇将继续介绍另外两种常见的中断,也即定时器中断和串口中断. 标准的51单片机有5个中断源:两个外部中断.两个定时器/计数器中断.具体如下: 优先 ...

  10. 51单片机入门——定时器与外部中断

    目 录 1. 定时器 1.1. 定时器的初步认识 1.2. 定时器的寄存器 1.3. 定时器的应用 2. 外部中断 2.1. 中断的背景 2.2. 定时器中断的应用 2.3. 中断的优先级 1. 定时 ...

最新文章

  1. Django中使用Celery
  2. java语言和www技术 阶段性测试一_2018春季【贵州电大】[JAVA语言与WWW技术(省)]04任务阶段性测验(答案)...
  3. Android-JSNative交互的几种可行性方案H5白屏问题解决方式
  4. python使用rabbitMQ介绍五(话题模式)
  5. Qt中槽函数触发两次的两种场景分析
  6. get clone 出现 fatal: the remote end hung up unexpectedly5 MiB | 892.00 KiB/s 报错信息
  7. mysql log4jlogger_mybatis结合log4j打印SQL日志
  8. java 4种跟踪会话技术_会话跟踪技术
  9. axure中备注线_Axure教程资料
  10. php 去除变态空格字符方法,空格trim不掉问题解决思路
  11. HDU1084 What Is Your Grade?【排序+水题】
  12. scikit-image 库简介
  13. 网络调试助手(NetAssist)java socket通讯代码
  14. vivado基本知识
  15. button加下划线
  16. 维生素C对免疫力有什么影响?
  17. C++ __builtin_系列函数
  18. 康奈尔大学计算机生物教授,美国康奈尔大学Kirk Deitsch教授访问广州生物院
  19. lpop 原子_深圳大学张文静教授团队ACS Nano:单原子铂修饰的二硫化钒催化剂提高电催化析氢性能...
  20. Google Groups 精彩推荐

热门文章

  1. android获取textview的行数
  2. for循环的类型以及while循环
  3. Android开发之网络
  4. returned message 找不到可安装的 ISAM。.
  5. 三、Oracle 查询+where条件
  6. 并查集(许多东西的基本哦)
  7. 2017.5.20欢(bei)乐(ju)赛解题报告
  8. hdu 5823 color II 状压dp
  9. 未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序 解决方法
  10. Windows7下IIS7.5的伪静态URL Rewrite安装配置和案例综合