why does my debouncer not work?

二次信任 提交于 2019-12-14 02:33:13

问题


I'm trying to write a debouncer that will only return a valid argument (>0) if it has been debounced (-1 four bouncing). I've come up with this so far but it always returns -1, why is that I'm wondering:

#include <stdio.h>
#include <time.h>
#include <unistd.h>

#define BOUNCETIME  500000000 //(500ms)

#define SetTime(x)     clock_gettime(CLOCK_REALTIME, (x));  // set time

static struct timespec tset;
struct timespec tnow;

int DeBounce(unsigned int arg)
{  
  static int val = -1;
  long long nsec = 0;
  if (val < 0) {
    val = arg;
    SetTime(&tset);  
    return arg;    
  } else {
    SetTime(&tnow);
    if (tnow.tv_nsec < tset.tv_nsec)
      nsec = tnow.tv_nsec + 1000000000;
    else
      nsec = tnow.tv_nsec;
    if (tnow.tv_nsec - tset.tv_nsec > BOUNCETIME) {
      printf("arg okay\n"); 
      val = -1;
      return arg;
    }
    else 
      printf("bounce, ignore!\n");
      return -1;
  }

}

int main (void) 
{
  printf("#1 %d\n",DeBounce(0));
  usleep(1);
  printf("#2 %d\n",DeBounce(1));
  usleep(200);
  printf("#3 %d\n",DeBounce(1));
  sleep(1);
  printf("#4 %d\n",DeBounce(1));
}

the ouput I get is:

$ ./debounce 
#1 0
bounce, ignore!
#2 -1
bounce, ignore!
#3 -1
bounce, ignore!
#4 -1
$

回答1:


usleep(600); is 600 microseconds. But your debounce period is 500 milliseconds.

Furthermore tnow.tv_nsec - tset.tv_nsec is not correct as tv_nsec is not the full time value but only the number of nanoseconds past the second. The correct way to calculate elapsed time in nanoseconds is something like this:

(tnow.tv_sec * 1.0e-9 + tnow.tv_nsec) - (tset.tv_sec * 1.0e-9 + tset.tv_nsec)


来源:https://stackoverflow.com/questions/39987772/why-does-my-debouncer-not-work

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!