teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

要望により回答追加

2015/11/12 12:50

投稿

Chironian
Chironian

スコア23274

answer CHANGED
@@ -7,4 +7,37 @@
7
7
  良くある方法は、数mSec程度あけて2回スイッチの状態を読み取り、一致したら確定します。
8
8
  [ここ](http://www.palettesoft.co.jp/technology/pic/pic_sample_sw0.htm#40)に詳しい解説があります。
9
9
 
10
- チャタ取り後に、OFF->ONチェックすると安定するようになりますよ。
10
+ チャタ取り後に、OFF->ONチェックすると安定するようになりますよ。
11
+
12
+ ---
13
+
14
+ 【追記】
15
+ ちょっと安易すぎるのですが、チャタ取りも含めたLED_CTR()関数を作ってみました。
16
+ OFF->ON検出のところは、catsforepawさんのコードとほぼ同じです。
17
+ ```C
18
+ void LED_CTR() //LED制御関数
19
+ {
20
+ static int sw = 0;
21
+ unsigned char now; //スイッチ入力の格納変数の宣言
22
+ static unsigned char last = 0;
23
+ int i;
24
+ for (i=0; i < 100; ++i)
25
+ {
26
+ now=getKey();
27
+ if (now == last)
28
+ return;
29
+ }
30
+
31
+ if ((last == 0) && (now != 0))
32
+ {
33
+ ++sw;
34
+ sw &=1;
35
+ LED(sw);
36
+ }
37
+ last=now;
38
+ }
39
+ ```
40
+ for文で100回回してます。もし、LEDのON/OFFが安定しない(キーを1回押しただけでON->OFF->ONを何回か行う)ような時は、もっと数を増やしてみてください。
41
+
42
+ なお、一般的にはgetKey()の前あたりでちゃんと時間を測って数mSecの待ちをタイマで行うべきです。
43
+ お使いのシステムのタイマが分からないので、安易にループを回してます。この辺は次の課題として頑張って下さい。

1

分かり難かったので修正

2015/11/12 12:50

投稿

Chironian
Chironian

スコア23274

answer CHANGED
@@ -1,8 +1,10 @@
1
1
  こんにちは。
2
+ 2点問題があるようです。
2
3
 
3
- LED_CTR()を見ると、スイッチがONの間、++swしてON/OFFを高速に繰り返しているようです。
4
+ まず1点目は、LED_CTR()を見ると、スイッチがONの間、継続して++swしているため、LEDのON/OFFを高速に繰り返しているようです。そこで、スイッチがOFF->ONへ変化した時だけ++swする必要があります。
4
- スイッチがOFF->ONへ変化した時に++swする必要があります。
5
+
5
- ただ、機械接点式のスイッチはチャタリングがあり、ONとOFFが切り替わる瞬間、高速にON/OFFを繰り返します。
6
+ 次に2点目は、機械接点式のスイッチはチャタリングがあり、ONとOFFが切り替わる瞬間、高速にON/OFFを繰り返します。ですので、チャタ取りも必要です。
6
- ですので、チャタ取りが必要です。
7
7
  良くある方法は、数mSec程度あけて2回スイッチの状態を読み取り、一致したら確定します。
8
- [ここ](http://www.palettesoft.co.jp/technology/pic/pic_sample_sw0.htm#40)に詳しい解説があります。
8
+ [ここ](http://www.palettesoft.co.jp/technology/pic/pic_sample_sw0.htm#40)に詳しい解説があります。
9
+
10
+ チャタ取り後に、OFF->ONチェックすると安定するようになりますよ。