回答編集履歴

9

コード追記

2020/05/03 09:48

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -55,3 +55,77 @@
55
55
 
56
56
 
57
57
  ループが回るたびに`LATC0`,`LATC1`,`LATC2`を設定する必要もないですね…
58
+
59
+
60
+
61
+ ---
62
+
63
+ 250msや500msに一度しかLED設定していないので、以下のようにしてLED設定回数を減らし除算もなくすとどうなります?
64
+
65
+ ```C
66
+
67
+ while(1){
68
+
69
+ if(RA5==1){
70
+
71
+ int cnt=0; //PB1がONの時、最初にカウンタに0を代入
72
+
73
+ int led=0;
74
+
75
+ LATC2=1; //BZ ON
76
+
77
+ int ra4 = RA4;
78
+
79
+ while(cnt<10000 && ra4==0){ //カウント値が10秒以下、PB2 OFFの時、下を実行
80
+
81
+ LATC0=led=1-led;
82
+
83
+ for(int i = 0; i < 250 && ra4==0; ++i){
84
+
85
+ __delay_ms(1);
86
+
87
+ cnt++;
88
+
89
+ ra4 = RA4;
90
+
91
+ }
92
+
93
+ }
94
+
95
+ if(cnt==10000){ //カウント値が10秒に達したら下を実行
96
+
97
+ LATC0=0; //LED1 OFF
98
+
99
+ LATC2=0; //BZ OFF
100
+
101
+ led=1;
102
+
103
+ ra4 = RA4;
104
+
105
+ while(ra4==0){ //PB2を押さない限り下を実行
106
+
107
+ LATC1=led=1-led;
108
+
109
+ for(int i = 0; i < 500 && ra4==0; ++i){
110
+
111
+ __delay_ms(1);
112
+
113
+ ra4 = RA4;
114
+
115
+ }
116
+
117
+ }
118
+
119
+ }
120
+
121
+ LATC0=0; //LED1 OFF
122
+
123
+ LATC1=0; //LED2 OFF
124
+
125
+ LATC2=0; //BZ OFF
126
+
127
+ }
128
+
129
+ }
130
+
131
+ ```

8

衍字修正

2020/05/03 09:48

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -38,7 +38,7 @@
38
38
 
39
39
  時間が合わない件について書き忘れていました。
40
40
 
41
- y_waiwaiさんの回答にもある通り、delay以外の時間も加算されるため細かく刻むほどdelay以外で消費した時間分の時間が蓄積され表面化します。
41
+ y_waiwaiさんの回答にもある通り、delay以外の時間も加算されるため細かく刻むほどdelay以外で消費した時間が蓄積され表面化します。
42
42
 
43
43
  LED点滅と時間カウントにはタイマの使用を検討されてみては?
44
44
 

7

LATC0-2設定について追記

2020/04/30 01:53

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -51,3 +51,7 @@
51
51
  cnt+=100;
52
52
 
53
53
  ```
54
+
55
+
56
+
57
+ ループが回るたびに`LATC0`,`LATC1`,`LATC2`を設定する必要もないですね…

6

表現修正

2020/04/30 01:52

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -42,11 +42,7 @@
42
42
 
43
43
  LED点滅と時間カウントにはタイマの使用を検討されてみては?
44
44
 
45
-
46
-
47
- 時間の正確性にあまりこだわらないなら100ms間隔程度にすれば気にならない程度に収まるかもせんが…
45
+ 時間の正確性にあまりこだわらないなら100ms間隔程度にすれば気にならない程度に収まると思いますが、その場合はdelayを伸ばた分ボタンはゆっくり操作する必要がありす。
48
-
49
- その場合、delayを伸ばした分ボタンはゆっくり操作する必要があります。
50
46
 
51
47
  ```C
52
48
 

5

引用追加

2020/04/30 01:44

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -21,6 +21,14 @@
21
21
 
22
22
 
23
23
  `cnt`は`10000`を超えているので`cnt==2000`が成立することはありません。
24
+
25
+ `while(RA4==0)`の前で`cnt`を`0`にしておけばそのコードでも動くでしょう。
26
+
27
+
28
+
29
+ > PB2を押さない限りLED2はずっと点滅するはずが、途中から点灯に代わってしまう
30
+
31
+
24
32
 
25
33
  `cnt`は`int`(16bit)なので`32767`を超えるとオーバーフローしてマイナス値になり、マイナス値の間は`cnt%1000<500`が成立します。
26
34
 

4

delayを伸ばす場合を追記

2020/04/30 01:41

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -33,3 +33,17 @@
33
33
  y_waiwaiさんの回答にもある通り、delay以外の時間も加算されるため細かく刻むほどdelay以外で消費した時間分の時間が蓄積され表面化します。
34
34
 
35
35
  LED点滅と時間カウントにはタイマの使用を検討されてみては?
36
+
37
+
38
+
39
+ 時間の正確性にあまりこだわらないなら100ms間隔程度にすれば気にならない程度に収まるかもしれませんが…
40
+
41
+ その場合、delayを伸ばした分ボタンはゆっくり操作する必要があります。
42
+
43
+ ```C
44
+
45
+ __delay_ms(100);
46
+
47
+ cnt+=100;
48
+
49
+ ```

3

表現修正

2020/04/30 01:36

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -30,6 +30,6 @@
30
30
 
31
31
  時間が合わない件について書き忘れていました。
32
32
 
33
- y_waiwaiさんの回答にもある通り、delay以外の時間も加算されるため細かく刻むほど誤差が蓄積します。
33
+ y_waiwaiさんの回答にもある通り、delay以外の時間も加算されるため細かく刻むほどdelay以外で消費した時間分の時間が蓄積され表面化します。
34
34
 
35
35
  LED点滅と時間カウントにはタイマの使用を検討されてみては?

2

タイマについて追記

2020/04/30 01:31

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -23,3 +23,13 @@
23
23
  `cnt`は`10000`を超えているので`cnt==2000`が成立することはありません。
24
24
 
25
25
  `cnt`は`int`(16bit)なので`32767`を超えるとオーバーフローしてマイナス値になり、マイナス値の間は`cnt%1000<500`が成立します。
26
+
27
+
28
+
29
+ (追記)
30
+
31
+ 時間が合わない件について書き忘れていました。
32
+
33
+ y_waiwaiさんの回答にもある通り、delay以外の時間も加算されるため細かく刻むほど誤差が蓄積します。
34
+
35
+ LED点滅と時間カウントにはタイマの使用を検討されてみては?

1

番号、書式修正

2020/04/30 01:25

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -1,7 +1,25 @@
1
+ > __delay_ms(500);
2
+
1
- ①delay中押して離すと、押してないと判定されからでしょう
3
+ にすと、PB2を押してもキャンセルされない時がある。
2
4
 
3
5
 
4
6
 
7
+ delay中に押して離すと、押していないと判定されるからでしょう。
8
+
9
+
10
+
11
+ > cnt++の下に
12
+
13
+ if(cnt==2000){
14
+
15
+ cnt=0;
16
+
17
+ }
18
+
19
+ を追加したが関係なかった。
20
+
21
+
22
+
5
- `cnt`は`10000`を超えているので`if(cnt==2000)`が成立することはありません。
23
+ `cnt`は`10000`を超えているので`cnt==2000`が成立することはありません。
6
24
 
7
25
  `cnt`は`int`(16bit)なので`32767`を超えるとオーバーフローしてマイナス値になり、マイナス値の間は`cnt%1000<500`が成立します。