2009-08-11 7 views
3

私は私たちのために書かれたいくつかのファームウェアでいくつかのことを理解しようとしています。私はCをよく知っているわけではないので、ここではちょっとしたことが起こっていると思います。私はコードがコメントとどのように関係しているのか理解できません。あなたは英語に翻訳できますか?略語を解読するのに役立つC

// so the button has to be held for 70 ms to be considered being pressed 
// and then has to be released for 70ms to be considered un-pressed 
State=(State<<1) | !input(USER_BUTTON) | 0xe000; 
if(State==0xe000) 
{ 
    Debounced_Button_Pressed = TRUE; 
    time_button_held++; 
} 
else if (State==0xffff) 
{ 
    Debounced_Button_Pressed = FALSE; 
} 

これは、タイマ割り込み機能の中で、明らかにすべての4.4ms

感謝を発射します。

+0

Stateが元の状態であったことと、0xE000が表すもの(これはたぶんレジスタビットフィールドです)を知らないと実際に十分な情報がありません – Earlz

+3

このコードはhttp://www.ganssle.com/debouncing.pdfからコピーされましたpage 20 – Mark

+0

@マーク - 私はそれが身近に見えたことを知っていた –

答えて

13

これがないことである

State=(State<<1) | !input(USER_BUTTON) | 0xe000; 

...さんは一度、この一歩を見てみましょう:(、すべてのものの上に移動し、トップビットを捨てる左に

  • シフト状態1
  • 入力が0(オフ)の場合は下位ビットを設定します。
  • 上位3ビットをオンにします。

ここでは13ビットが強制されず、USER_BUTTON入力の最後の13サンプルの履歴を形成します。

if文は、これらのビットのすべてがオフ(0xe000)またはオン(0xffff)であるかどうかをチェックします。オフの場合、ボタンはとなり、13サンプルでとなります。オンの場合は、が押されていません 13サンプル。

これにより、4.4ms * 13 = 57.2msのデバウンス時間が得られます。これはコメントから少し離れているか、タイマー間隔が5.385msに近い値になります。

+0

ありがとう!これは、それを理解するのに最も役立ちます。何らかの事情でStateがゼロから始まり、入力(USER_BUTTON)が偽(たとえば)の場合、無限に大きくなるわけではありません。 |ビット単位のORを意味します。だから私は、最初の3の結果である電卓をプログラミング私の便利なウィンドウを出るとき: E001 1E003 3E007 、我々はすでに、それは二度と0xffffのか0xe000ことのない希望はありません見ることができます。どのような単純明白なことが私は行方不明ですか? – Steven

+0

Stateはunsigned shortである可能性があります。つまり、毎回16ビット(4桁の16進数)で切り捨てられます。 – bdonlan

2

varialbeの「状態」を16ビットと考えます。 < <オペレータは毎回1つ左にシフトし、|演算子は、入力(USER_BUTTON)が偽(!はnot演算子)のときは、最下位ビットをセットするために使用されます。チェックは、入力の最後の13の事例がすべて真であるかすべてが偽であるかどうかをチェックするだけです。

2

彼はスイッチの状態のサンプルを4.4msごとに整数にシフトすることによってスイッチをデバウンスします。彼は、その整数の内容が特定の16進値と一致するかどうかを調べることによって、有効なプレスをノイズから告げることができます。別の値と比較することで、彼の定義に従ってリリースされたかどうかを知ることもできるようです。

関連する問題