回答編集履歴
1
コメントに関して追記
test
CHANGED
@@ -59,3 +59,105 @@
|
|
59
59
|
その場合、スイッチがOFFの場合マイコンの入力ピンは何も繋がっていない状態になりますがそれは「0(Lowレベル)」ではありません。たまたま0になるかも知れませんが、ノイズやちょっとした回路の都合で簡単に1になるかも知れません。不安定...問題になっている症状の1つじゃありませんでしたっけ。
|
60
60
|
|
61
61
|
マイコンの入力端子に何も繋がないという使い方は原則として「やってはいけない」と思って下さい。プルアップ/プルダウン回路を内蔵していてそれを使っている、とかいうのなら問題はないのですが、そうでなければマイコン外部にプルアップやプルダウン抵抗を接続して、マイコンの入力ピンの電位が確実に決まっているようにする必要があります。
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
コメントに関して追記 5/1
|
66
|
+
|
67
|
+
---
|
68
|
+
|
69
|
+
> ●スイッチの配線について
|
70
|
+
|
71
|
+
スイッチの配線は色々なサイトを見て勉強し、一応プルダウン?抵抗を接続しGNDに接続しています。
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
不安定という事象に対しては一番疑われる部分です。配線の間違い、部品の間違い(抵抗値等)、、接触不良、近隣とのショート、極端に長い配線等もありませんね? 「一応」ではなく「大丈夫」といい切れるようにして下さい。
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
> ●コンパイラの性能がすごく悪くて、割り算がものすごく遅い、とかだと可能性はあるかしら。
|
80
|
+
|
81
|
+
⇒そのような事があるんですか?想像がつきませんでした。
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
小学校で計算を習う順番を考えてみて下さい。足し算、引き算、掛け算、割り算の順で習うでしょう。その順で「難しい」のです。コンピュータの場合も、特別な計算回路を持っていないマイコンではその順番で計算が面倒になり、時間がかかることは考えられます。
|
86
|
+
|
87
|
+
```
|
88
|
+
|
89
|
+
volatile int i,j,result=0;//volatileはどこかで値が変更されているかも知れない、というコンパイラへの指示。これをつけないと計算を端折ることがあるので
|
90
|
+
|
91
|
+
//ここでLED ON
|
92
|
+
|
93
|
+
for(i=0;i<10000;i++){//ループの回数は違いが判断できて結果が出るまで我慢できるくらいの時間に適当に設定
|
94
|
+
|
95
|
+
for(j=0;j<100;j++)
|
96
|
+
|
97
|
+
result=i+j; //ここを result=i-j;とかresult=i*jとかresult=i/jとかresult=i%jに替えてみる
|
98
|
+
|
99
|
+
}
|
100
|
+
|
101
|
+
}
|
102
|
+
|
103
|
+
//ここでLED OFFしてLEDが点灯していた時間を計る
|
104
|
+
|
105
|
+
while(1);//停止
|
106
|
+
|
107
|
+
```
|
108
|
+
|
109
|
+
みたいな実験をして調べてみるといいかも。
|
110
|
+
|
111
|
+
手元のArduino UNO(クロック16MHz)では+,-が約2秒 *が2.5秒に対し/と%は15.7秒かかりました。
|
112
|
+
|
113
|
+
PICで質問のプログラムの条件に置き換えると
|
114
|
+
|
115
|
+
・クロック2MHzで速度1/8(かかる時間は8倍)
|
116
|
+
|
117
|
+
・繰り返し回数10000で1/100
|
118
|
+
|
119
|
+
・CPUの作りも違ってAVRは1クロック1命令、PICは4クロック1命令が基本で4倍時間がかかる
|
120
|
+
|
121
|
+
とすると単純に換算して(相当いい加減な見積もりですが)5秒くらい。つまり10秒ループのはずが15秒とかの実行時間はあり得る、ということになりそうです。(意外と大きいなぁ)
|
122
|
+
|
123
|
+
|
124
|
+
|
125
|
+
だとすると、
|
126
|
+
|
127
|
+
> ●実験したコードは単純に
|
128
|
+
|
129
|
+
if(cnt%500<250)
|
130
|
+
|
131
|
+
LATC0=0;
|
132
|
+
|
133
|
+
else LATC0=1;
|
134
|
+
|
135
|
+
を抜いただけです。
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
これについては、そこを抜くのではなく
|
140
|
+
|
141
|
+
```C
|
142
|
+
|
143
|
+
if(cnt%500<250)
|
144
|
+
|
145
|
+
LATC0=1;
|
146
|
+
|
147
|
+
else LATC0=1;
|
148
|
+
|
149
|
+
```
|
150
|
+
|
151
|
+
による点きっぱなしも試してみた方がよさそうですね。「点滅」の影響なのか、割り算が遅いのか。
|
152
|
+
|
153
|
+
|
154
|
+
|
155
|
+
それはそれとして
|
156
|
+
|
157
|
+
> ●17秒の間に10回点滅しているのですか?
|
158
|
+
|
159
|
+
⇒10回以上点滅していました。
|
160
|
+
|
161
|
+
|
162
|
+
|
163
|
+
これは重要な事実です。点滅周期の情報がありませんが、点滅が10回を超えるということがあるなら、単純にループに時間がかかっているのとは別の現象ですから。
|