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
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,其实是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
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
TACCTL0 = CCIE;//允许中断 __enable_interrupt();//打开总中断
} #pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A0 (void) //定时器A0中断服务程序
{
TACCR0 = TACCR0 + ;//******这里,这里***********//
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,TAR==TACCR0进入它的中断函数
TACCTL0 = CCIE;//允许中断 TACCR1 = ;//计数值6,TAR==TACCR1进入它的中断函数
TACCTL1 = CCIE;//允许中断 __enable_interrupt();//打开总中断
} #pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A0 (void) //定时器A0中断服务程序
{
TACCR0 = TACCR0 + ;//******这里,这里***********//
P4OUT ^= BIT1;
} #pragma vector = TIMERA1_VECTOR
__interrupt void Timer_A1 (void) //A1,A2,溢出中断都会进(共用)
{
switch( TAIV )
{
case TAIV_TACCR1://计数" TACCR1 "的中断
TACCR1 = TACCR1 + ;
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,TAR==TACCR0进入它的中断函数
TACCTL0 = CCIE;//允许中断 TACCR1 = ;//计数值6,TAR==TACCR1进入它的中断函数
TACCTL1 = CCIE;//允许中断 __enable_interrupt();//打开总中断
} #pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A0 (void) //定时器A0中断服务程序
{
TACCR0 = TACCR0 + ;//******这里,这里***********//
P4OUT ^= BIT1;
} #pragma vector = TIMERA1_VECTOR
__interrupt void Timer_A1 (void) //A1,A2,溢出中断都会进(共用)
{
switch( TAIV )
{
case TAIV_TACCR1://计数" TACCR1 "的中断
TACCR1 = TACCR1 + ;
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定时器_定时器中断的更多相关文章
- 定时器的应用---中断方式---让8个LED灯,左右各4个来回亮
定时器的应用---中断方式---让8个LED灯,左右各4个来回亮 /*************************** 中断方式 是主程序专注于其他的事情, 待定时器中断时才执行中断子程序. ** ...
- 用定时器T0的中断控制8位LED闪烁
#include<reg52.h> #define uchar unsigned char #define uint unsigned int uint i; void main() { ...
- STM32(5)——通用定时器基本定时器
1.STM32的Timer简介 STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器. 其中系统嘀嗒定时器是前文中所描述的S ...
- STM32 HAL库学习系列第4篇 定时器TIM----- 开始定时器与PWM输出配置
基本流程: 1.配置定时器 2.开启定时器 3.动态改变pwm输出,改变值 HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); 函数总结: __HAL_TIM ...
- 019_linux驱动之_定时器的引入
(一)定义一个timer_list定时器结构体,linux 内核定时器 timer_list详解 (二)初始化定时器,当超时时间expires到之后会调用buttons_timer_function函 ...
- 杨老师课堂之JavaScript定时器_农夫山泉限时秒杀案例
预览效果图: 使用到的知识点: 定时器 setInterval(函数,毫秒):在指定的毫秒数后调用函数或执行一段代码 取消定时器 clearInterval:取消由setInterval设置的定时器 ...
- QT_8_Qt中的事件处理_定时器事件_定时器类_事件分发器_事件过滤器_绘图事件_高级绘图事件_绘图设备_QFile 文件读写_QFileInfo文件信息
Qt中的事件处理 1.1. 捕获QLabel中是鼠标事件 1.2. enterevent 鼠标进入 1.3. leaveevent 鼠标离开 1.4. 鼠标按下MyLabel::mousePressE ...
- 定时器_在.net core3.0 webapi中添加自定义定时器功能
前言:想在.net framework环境使用自定义定时器的话,参考我的另一篇文章:https://www.cnblogs.com/lxhbky/p/10242839.html 想在.net core ...
- go基础_定时器
每间隔5s打印一句hello // time_ticker package main import ( "fmt" "time" ) func main() { ...
随机推荐
- 利用@media screen实现网页布局的自适应
利用@media screen实现网页布局的自适应 优点:无需插件和手机主题,对移动设备友好,能够适应各种窗口大小.只需在CSS中添加@media screen属性,根据浏览器宽度判断并输出不同的长宽 ...
- Palm是一家英國智能手機公司
據TCL方面介紹,本次收購只涉及品牌,不會涉及員工和其他資產.被收購之後,Palm仍將繼續把總部設於美國加州矽谷,以發揮該區域所獨有的先進技術和人才的優勢. TCL通訊CEO郭愛平表示TCL將把Pal ...
- 对 griview获取的数据添加方法 6月
<asp:TemplateField HeaderText="日期"> <HeaderStyle CssCl ...
- U盘安装Ubuntu 10.4 Server
试了几次的U盘安装Ubuntu Server失败后,只能求助网络了,找了半天终于安装成功了.问题就是虽然从U盘启动了安装程序,但是在系统安装到一半的过程中,会进行CD-ROM的检查,检查不到安装程序, ...
- GIT的认识
说实话,在听到小伙伴们都说赶紧做作业的时候很茫然,连一点头绪都没有,根本不知道从何入手,但不能因为不会就不去做,于是还是拿起手机,找到小伙伴商量着做着,虽然等的过程很焦急,但还是注册成功了.而开始写对 ...
- JPEG文件结构
JPEG文件由八个部分组成,每个部分的标记字节为两个,首字节固定为:0xFF,当然,准许在其前面再填充多个0xFF,以最后一个为准.下面为各部分的名称和第二个标记字节的数值,用ultraedit的16 ...
- Python黑帽编程2.3 字符串、列表、元组、字典和集合
Python黑帽编程2.3 字符串.列表.元组.字典和集合 本节要介绍的是Python里面常用的几种数据结构.通常情况下,声明一个变量只保存一个值是远远不够的,我们需要将一组或多组数据进行存储.查询 ...
- 【Java并发编程实战】-----synchronized
在我们的实际应用当中可能经常会遇到这样一个场景:多个线程读或者.写相同的数据,访问相同的文件等等.对于这种情况如果我们不加以控制,是非常容易导致错误的.在java中,为了解决这个问题,引入临界区概念. ...
- 浅析UPnP协议
摘要:文章介绍了UPnP结构规范和开发流程,指出:UP nP协议使所有联网的设备实现互联,设备工作不需要传统的驱动程序,便可以实现设备间的 相互控制. 关键词:UPnP协议:开发流程:电子技术:工作 ...
- 摇钱树运营小工具UI设计.vsd
去年,我负责公司的一个互联网投融资平台——摇钱树.系统运营过程中,业务和客服那边不断的反馈一些事情让技术这边协助实现.例如,土豪客户忘记登录密码后懒得自己重置,更愿意选择搭讪客服MM:再比如,客户多次 ...