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.

[参考译文] MSP430G2553:计时器中断至按钮去抖

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1366984/msp430g2553-timer-interrupt-to-debounce-button

器件型号:MSP430G2553

工具与软件:

大家好!

我想在 MSP-EXP430G2 Launchpad 上切换 LED。 我实施了一个中断、当我按下按钮 S2时它被激活。 在此中断中、我激活计时器 A0、以便对按钮进行去抖。

不幸的是、去抖不能正常工作、因为当延迟变量(计时器的计数变量)非常小以至于去抖不起作用时、我只能跳转到计时器中断函数。

当延迟变量太高时、我没有进入计时器中断。 你有什么建议我在这里做错了吗?

这是到目前为止我的代码:

#包含

#define 软件 BIT3
#定义绿色 BIT6
#定义去抖20000

void main (void){
   WDTCTL = WDTPW | WDTHOLD;          //停止看门狗计时器

   P1DIR |=绿色;                    //设置 LED 引脚->输出
   P1OUT &=~绿色;

   P1DIR &&~SW;                      //设置 SW 引脚->输入
   P1REN |= SW;                       //为 SW 引脚启用电阻器
   P1OUT |= SW;                       //选择 SW 引脚的上拉

   P1IES |= SW;                      //选择下降沿上的中断
   P1IE |= SW;                        //启用 SW 引脚上的中断

   TA0CCR0 =去抖;                //设置延迟时间
   TA0CCTL0 = CCIE;                   //在比较模式中启用计时器 A0中断
   TA0CTL = TASSEL_2 | MC_0 | TACLR ;          //时钟和定时器已停止

   __ bis_SR_register (LPM4_bits + GIE);//进入 LPM4并启用 CPU 中断


#pragma vector=Port1_vector
__interrupt void PORT_1 (void)
{
   TA0CTL |= MC_1;                    //设置计时器 A0
   P1IFG &=~SW;                      //清除 SW 中断标志


#pragma vector=TIMER0_A0_vector
__interrupt void Timer_A0_ISR (void)
{
   //停止计时器 A0
   TA0CTL &&~MC_1; //停止模式

   //检查按钮是否仍然被按下
   如果(! (P1IN 和 SW)
   {
       //切换输出引脚(P1.2)
       P1OUT ^=绿色;
   }

   //清除计时器 A0中断标志
   TA0CTL &=~TAIFG;

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

    对于按钮去抖、我倾向于使用不同的方法。 一个周期性中断会读取开关输入、并将其存储在一个小数组中。 阵列大小和计时器周期取决于您的需求。

    要进行去抖、可以将位和在一起或使用或、具体取决于您要查找的状态。 您还可以比较当前状态以仅检测边沿。 中断代码示例:

    /*
      Timer A interrupt does:
    
      1) Wakes up the main routine periodically.
      2) Tracks the state of the pushbuttons.
     */
    
    __attribute__ ((wakeup, interrupt(TIMERA0_VECTOR))) void Timer_A(void)
    {
      static int switch_index = 0;
      /*
        Read pushbutton switches.
       */
      switches[switch_index++] = P2IN;
      switch_index &= DEBOUNCE-1;
    
      if((++tick & (TIMER_A_RATE/MAIN_RATE-1)) == 0)
        {
          add_event(TICK);
        }
    }
    

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

    嗨、

    感谢您的意见。 但是您能解释一下、为什么我的选项不能正常工作?

    再次感谢。

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

    在 LPM4中、SMCLK (TASSEL=2)被关闭。 只要开关不断弹跳(PORT_1 ()被重复调用)、SMCLK 就会在短时间内启动、但一旦弹跳完成、SMCLK 就会永久关闭、因此 TA0不会停止。

    看看您是否获得了不同的 LPM0结果。