回答編集履歴

4

コード例追加

2015/11/12 12:07

投稿

catsforepaw
catsforepaw

スコア5938

test CHANGED
@@ -20,4 +20,28 @@
20
20
 
21
21
  ご質問の件では押したときだけ反応させたいとのことなので、立ち上がり(OFF→ON)だけを判定すれば良いことになります。
22
22
 
23
+ ---
23
24
 
25
+ LED_CTR関数への修正はこんな感じになります。
26
+
27
+ ```C
28
+
29
+ static int sw = 0; // 変更なし
30
+
31
+ static unsigned char last = 0; // スイッチの状態を覚えるためのstatic変数を追加
32
+
33
+ // スイッチの読み込みは変更なし
34
+
35
+ if(last == 0 && a == 1) // スイッチ入力の判定を変更(前回OFFで今回ON)
36
+
37
+ {
38
+
39
+ // この中も変更なし
40
+
41
+ }
42
+
43
+ last = now; // スイッチの状態を覚えておく
44
+
45
+ ```
46
+
47
+

3

さらに追記

2015/11/12 12:07

投稿

catsforepaw
catsforepaw

スコア5938

test CHANGED
@@ -8,4 +8,16 @@
8
8
 
9
9
  追記
10
10
 
11
+
12
+
11
13
  チャタリング対策も場合によっては必要かもしれません。ソースを見ると、超高速でスイッチの判定をしているので、スイッチ回路のお金のかけ具合によってはチャタリングが発生します。
14
+
15
+ ---
16
+
17
+ さらに追記
18
+
19
+
20
+
21
+ ご質問の件では押したときだけ反応させたいとのことなので、立ち上がり(OFF→ON)だけを判定すれば良いことになります。
22
+
23
+

2

追記

2015/11/12 10:20

投稿

catsforepaw
catsforepaw

スコア5938

test CHANGED
@@ -3,3 +3,9 @@
3
3
  エッジとは、立ち上がり(OFF状態→ON状態への変化)と立ち下がり(ON状態→OFF状態への変化)のことです。
4
4
 
5
5
  ですので、読み取ったスイッチの状態もstatic変数で覚えておく必要があります。そして、たった今読み取った状態と前回読み取った状態を比較して、変化があったときだけLEDをON/OFFするという処理が必要です。
6
+
7
+ ---
8
+
9
+ 追記
10
+
11
+ チャタリング対策も場合によっては必要かもしれません。ソースを見ると、超高速でスイッチの判定をしているので、スイッチ回路のお金のかけ具合によってはチャタリングが発生します。

1

文言修正

2015/11/12 10:15

投稿

catsforepaw
catsforepaw

スコア5938

test CHANGED
@@ -1,5 +1,5 @@
1
1
  チャタリングというよりは、スイッチの判定をエッジで行っていないことが問題の原因だと思います。
2
2
 
3
- エッジとは、立ち上がり(OFF状態→ON状態への変化)と立ち下がり(ON状態OFF状態への変化)のことです。
3
+ エッジとは、立ち上がり(OFF状態→ON状態への変化)と立ち下がり(ON状態OFF状態への変化)のことです。
4
4
 
5
5
  ですので、読み取ったスイッチの状態もstatic変数で覚えておく必要があります。そして、たった今読み取った状態と前回読み取った状態を比較して、変化があったときだけLEDをON/OFFするという処理が必要です。