使用__even_in_range 的好处是可以生成效率比较高的代码,在判断多中断源的中断的来源时可以使用此函数。
原型:unsigned short __even_in_range(unsigned short value, unsignedshort upper_limit);
功能:只能与switch 语句结合使用,判断value 是否为偶数且小于等于upper_limit。
举例:
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR(void) //ISR Interrupt Service Routine中断服务程序;IRQ Interrupt Request中断请求
{
switch(__even_in_range(P1IV, 16))
{
case 0: break;
case 2: break; // P1.0 IFG
case 4: break; // P1.1 IFG
case 6: break; // P1.2 IFG
case 8: break; // P1.3 IFG
case 10: break; // P1.4 IFG
case 12: break; // P1.5 IFG
case 14: break; // P1.6 IFG
case 16: // P1.7 IFG
__bic_SR_register_on_exit(LPM3_bits); // Exit active
break;
}
}
结果:假设P1IV 的值为16,执行 __bic_SR_register_on_exit(LPM3_bits);。否则,与普通的switch 语句一样,跳过case 部分,直接执行下面的程序。
关键字:MSP430 __even_in_range
引用地址:
MSP430之__even_in_range
推荐阅读最新更新时间:2024-11-11 12:25
msp430单片机实现PWM
PWM信号是一种具有固定周期(T)不定占空比(t)的数字信号,如下图所示。如果PWM信号的占空比随时间变化,那么通过滤波之后的输出信号将是幅度变化的模拟信号。因此通过控制PWM信号的占空比,就可以产生不同的模拟信号。 msp430单片机利用Timer_A或者Timer_B可以很好的实现产生任意PWM信号。 Timer_A定时器的计数器工作在增计数方式,输出采用模式7(复位/置位模式),则可以利用CCR0控制PWM波形的周期,用某个寄存器CCRx控制占空比。原理图如下:(注:这幅图片为网上下载,他用的是Timer_B定时器,故输出TBx) 摘录下面一段: http://www1.ti.com.cn/
[单片机]
基于MSP430F413与贴片电阻的智能遥控器
引言 目前市场上常见的无线遥控器多数为四键和十二键,主要用于汽车防盗系统、家庭防盗系统及遥控玩具等方面,这些应用简单、实用、成本低。但对于一些工程中需要距离在100米以上,控制或设定一些数据时,并要求一个遥控器对多于12个甚至上百个设备时,上述遥控器对操作人员就不方便,而且系统性能不够稳定。鉴于上述情况我们便提出在此基础上,采用单片机编写地址,通过操作键设置,液晶显示遥控器的输出。同时对耗电量、多个控制的设定、便于携带、操作方便及性能稳定等要求,设计开发出一种新型智能遥控器。该型遥控器以TI公司的超低功耗单片机MSP430F413为微处理器,配有低功耗3位液晶显示器EDS812A,整个系统采用锂电池和高能氧化银电池作为供电电源
[单片机]
TI - MCU - MSP430使用指南2 -> CPU/CPUX
首先,先说明一下CPU位数代表的是什么意思,从市面上看8位,16位,32位甚至64位的MCU内核都已出现,位数指的是什么呢: 严谨说法:指CPU一次能处理的数据宽度,也就是参与运算的寄存器的数据长度。 MSP430 是16位的MCU 我们平时对MCU的C语言编程,都会经过编译器编译成机器码,也就是二进制,最后通过CPU内部寄存器(一般有20-100个)来实现运算数据,因此我们写的所有程序,实现的所有功能,最终都要由CPU内部寄存器的读写来完成。 CPU寄存器一般分为专用寄存器和通用寄存器,对于MSP430来说,总共有16个寄存器:R0 - R15, 其中四个(R0 – R3)为专用寄存器,其余的为通用寄存器,下面详
[单片机]
msp430的定时器A 划分几个独立时间间隔
TAIV: #define TAIV_TACCR1 (0x0002) #define TAIV_TACCR2 (0x0004) #define TAIV_TAIFG (0x000A) TIMERA1_VECTOR是一个中断向量,主要处理CCR1,CCR2,以及定时器A溢出的中断标志,而CCR1,CCR2,以及定时器A产生中断是的TAIV是不同的,分别是2,4,10 switch( TAIV ) { case 2: break; case 4: break; case 10: P3OUT ^= BIT4; break; } 这一句的意思是,判断是哪个产生中断的,以
[单片机]
MSP430学习笔记(二)--加个按键更好
学单片机的都必须清楚微控制器的输入输出,点灯是练习基础的输出,而基础的输入就需要去练习按键了。我所使用电路原理图如下: 按键两种控制方式,一是查询(通过读取对应位寄存器的电平状态实现),二是中断(使用单片机内部中断资源),细说的话,会有很多可说的东西,所以当遇到任何疑问时,可查阅其他资料,而且本人水平有限,欠缺之处,还请见谅。 一、查询方式 #include msp430g2553.h //#include intrinsics.h 包含430单片机初始的宏定义,可自行打开观看 //---main()函数前提前声明子函数--- void Key_Init(); void Led_Init(); void P13_E
[单片机]
课程作业记录6:MSP430G2553+LCD1602字符滚动
首先,这次实验设计中我们实现的是在LCD1602上进行的字符滚动,用的单片机是MSP430G2553,跑的软件是CCS。是一个非常简单的程序设计,但是我C语言和单片机这部分都学得很差哈哈,放上来给大家参考参考,同时鼓舞一下大家的信心。 软件程序部分 该程序主要由主程序源程序main.c、子程序源程序LCD.c和子程序头文件LCD.h构成。采用这种程序结构,使程序更加清晰,一目了然,减少程序错误的机会,增强了程序的可移植性。在程序设计中MSP430G2553中P1口作为并行数据输出端,P2.0、P2.1、P2.2分别作为LCD1602液晶的RS、RW、E端。 1)主函数main.c #include msp430g2
[单片机]
采用MSP430设计的12位心电(ECG)放大器
人体心肌产生的电信号传导到体表之后,由于在体表分布的不同而产生电位差,将这种电压只有mV级别的电位差放大并绘制成图,就得到了心电图(ECG)。心电图在心血管疾病的临床诊断中有非常重要的作用。通常采用的心电图按照导联数分有单导联,三导联,五导联以及十二导联等等;按照精度分常用的有8位和12 位精度等等。单导联,精度低的心电图常用于进行心电监控以及心率测量。12位高精度的心电图由于可以反映出心电的细微变化,被更加广泛地应用于临床诊断、心电分析等地方。 由于心电幅度只有mV量级,需要放大上千倍才能被观察到,并且人体的内阻比较大,因此一个高阻抗、高增益的放大器是准确获取心电信号的关键。而周围环境中充满了各种各样的电磁干扰,会严重影响微
[单片机]
电设工作小结之——MSP430G2553学习笔记——3
接上一篇继续: 二,MSP430G2553的应用设计 (一),频率计的设计 1,频率计的实现方法有:测频法,测周法,等精度测频。一般是低频用测周法较准,高频用测频法较准。等精度测频是比较准的。 2,测周法: (1)可以使用定时器的输入捕获功能,捕获上升沿或下降沿,然后就可以计算出信号的周期,从而得出频率。 (2)也可以把待测信号接到IO上,然后用无限循环不停的查询电平的高低,从而得出信号的周期。丁老师建议:以丁老师的经验,这种方法测量的精度比用捕获中断的精度要高,因为中断的进入和退出都要占用时间。 (3)但这种侧周法适用于低频信号频率的测量,对于高频信号精度不好。 3,测频法: (1)可以定时一定的时间,然后计算
[单片机]