This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430F2618:中断

Guru**** 2548020 points
Other Parts Discussed in Thread: MSP430F2618

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/590545/msp430f2618-interrupts

器件型号:MSP430F2618

大家好!

我正在使用 msp430f2618板从水流量传感器获取脉冲、每当中断发生时、程序都会递增计数器。

我的程序运行正常、但我想在每5秒后将计数器值重置为"0"。

unsigned int count = 0;

void main (void){

WDTCTL = WDTPW + WDTHOLD;//停止看门狗计时器

P2IE |= 0x10;// P2.4中断被启用
P2IES |= 0x10;// P2.4高/低边沿
P2IFG &=~0x10;// P2.4 IFG 被清零

while (1){

_BIS_SR (LPM0_Bits + GIE);//输入 LPM0带中断

等待(5);

printf ("舍入");

_BIC_SR (LPM0_Bits + GIE);

计数= 0;

//端口2中断服务例程
#pragma vector=port2_vector
_interrupt void Port_2 (void){

COUNT++;//每次发生中断时递增计数器

P2IFG &=~0x10;// P2.4 IFG 被清零

静态空等待(uint8秒){

uint8 n;
TACCTL0 &=~(1<0);
for (n=0;n < sec;n++){
CCR0 = 32768;
TACTL = tassel_1 + MC_1;// SMCLK、upmode
while (!(TACCTL0 &(1<0)));
TACCTL0 &=~(1<0);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    下面将介绍一些内容:

    1) 1)您以1MHz 的频率运行、因此32K 计时器节拍比1秒更接近32ms。 您将需要多次迭代才能获得一秒钟的时间。
    2) 2)您将进入 LPM0、但我在任何地方都看不到唤醒(LPM0_EXIT)。 在第一个 LPM0_BITS 设置之后、main()将停止。 建议:将 WAIT ()逻辑放在 TIMER0_A0_VECTOR 中、并在超时到期时执行 LPM0_EXIT。
    3) 3)"count"应声明为"volatile"。

    未经请求:
    1) 1)我假设"(1 << 0)"是"CCIFG"。 (我没有找到它。) 我建议您使用后者来减少拼写错误造成的危险。
    2) 2)您可能希望应用 CAL[DCO/BC1]_1MHz"来提高计数的精度。 默认 DCO 设置仅有点接近1MHz。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Amith、

    为什么不将 TimerA 设置为中断功能并使用由晶体提供的 ALCK。 将时钟除以8、并在5秒的间隔内计数高达20480。
    让器件保持在 LPM3模式、这样可以节省更多的功耗并清除 TimerA 中断中的计数变量。 这是我的想法、但我没有在器件上检查它、但它应该起作用:

    CCTL0 = CCIE; //启用 CCR0中断
    CCR0 = 20480;
    TACTL = tassel_1 + ID_3+ MC_1; // ACLK 除以8、upmode

    _bis_SR_register (LPM3_bits + GIE);//通过中断输入 LPM3


    //计时器 A0中断服务例程
    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
    #pragma vector=TIMERA0_vector
    _interrupt void Timer_A (void)
    #Elif defined (_GNU_)
    void __attribute__((interrupt (TIMERA0_vector)) Timer_A (void)
    其他
    错误编译器不受支持!
    #endif

    计数= 0;