2016-11-15 9 views
0

私はxmegaで簡単なオン/オフスイッチを作ろうとしています。例えば、私は一度押すと、それはボタンXMEGA AVRのデバウンス

良い

言うべきと私は再びそれを押すと、それはそうで

悪い

と言う必要があります..

私は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

私はあなたが何を意味するのか分かりません。これは実際の「コード」であり、私はこれよりもはっきりするとは思わない。プログラムが起動されると、システム/ CPUの全体的な速度とよく一致する間隔でこの関数を呼び出すことができます。ボタンが接続されている特定のhwのレジスタと一致するように、button_is_pressed変数を変更することを忘れないでください。あなたの例でPORTH_INとPIN0_bmを書いたので、これはボタンの正しいレジスタとマスクだと思います。 – staringlizard

+0

それはうまく動作しません、なぜ私はそれが間違っていますか。私はコードが喘息を投稿しました –