2016-11-15 2 views
0

Я пытаюсь сделать простой переключатель вкл./Выкл. В xmega. Например, если нажать один раз, он должен сказатьКнопка Debouncing в XMEGA AVR

хорошего

и если я снова нажмите на него, он должен сказать

плохого

и так далее ..

Я знаю, как сделать кнопку debouncing в Arduino, но я действительно не имеют понятия с AVR. Может ли кто-нибудь помочь мне или дать мне пример кода для изучения?

Вот мой код до сих пор:

if (!(PORTH_IN&PIN0_bm)) 
{ 
    if (Mode1 != 1) 
    { 
     Mode1 = 1; 
     printf("%d\n", Mode1); 
    } 
} 

if (!(PORTH_IN&PIN0_bm)) 
{ 
    if (Mode1 != 0) 
    { 
     Mode1 = 0; 
     printf("%d\n", Mode1); 
    } 
} 
+0

Как построить дебют с некоторым оборудованием, например, таймер 555 ?. Он более надежен, чем делает это с помощью программного обеспечения. – ckruczek

ответ

1

Я хотел бы создать небольшую государственную машину для этого:

static int debounce_guard; 
static int button_has_been_pressed; 

void read_button_state() 
{ 
    switch(button_is_pressed) 
    { 
     case YES: 
      if(debounce_guard == 0) 
      { 
       button_has_been_pressed = 1; 
      } 
      break; 
     case NO: 
      if(button_has_been_pressed) 
      { 
       /* Do stuff here */ 
       debounce_guard = 10000; 
       button_has_been_pressed = 0; 
      } 
      break; 
    } 

    if(debounce_guard > 0) 
     debounce_guard--; 
} 

(button_is_pressed переменных должна отражать состояние GPIO штифта)

Идея заключается в том, что debounce_guard должен заставить вас игнорировать избыточное отскок для кнопки, и эта переменная должна быть уменьшена либо с помощью некоторого таймера, либо только в самой функции, как в показанный код. Машина состояний будет реагировать, тогда пользователь отпускает кнопку.

+0

Можете ли вы стать более эффектным сэром? Я имею в виду, что read_button_state должен быть написан так или что-то. Я все еще пуст прямо сейчас. можете ли вы просто привести пример с фактическим «кодом»? –

+0

Я не уверен, что понимаю, что вы имеете в виду. Это настоящий «код», и я не думаю, что могу быть более ясным, чем это. Когда программа запущена, вы можете вызвать эту функцию с интервалом, который хорошо работает с общей скоростью вашей системы/процессора. Не забудьте изменить переменную button_is_pressed, чтобы она соответствовала регистру для вашего конкретного hw, где кнопка подключена. Вы пишете PORTH_IN & PIN0_bm в своем примере, поэтому я думаю, что это правильный регистр и маска для кнопки. – staringlizard

+0

это не будет работать, я не знаю почему .. я делаю это неправильно .. я разместил код ниже –

 Смежные вопросы

  • Нет связанных вопросов^_^