
こんにちは。
今回、PICのプログラムをアセンブラで組むことになりました。
その中で「100ミリ秒間、あるポートからの入力を監視する」という部分があり、
これを内部タイマーなどは使わずに実装するとします。
自分なりには、
PICのクロック数とループ内のサイクル数で
何回ループを回せばよいのかを予め計算しておいて
その回数だけループを回せばよいのかな?
と考えました。。。
しかしループ内のサイクルがせいぜい数μSですので、
100mSecとなると10万回単位でループを回さなければなりません。
しかしPICでは変数が8Bitしか無いので255までしかカウントできないと思うのですが、
こういう大きい数字のカウントをしたい場合、どうしたら良いのでしょうか?
宜しくお願いします。
No.5ベストアンサー
- 回答日時:
他の回答者の回答を見てると、最近はアセンブラ等でソフトを組む人は居ないんだなぁ。
と思ってしまいますね。>「100ミリ秒間、あるポートからの入力を監視する」
とどまっているんじゃなくて、監視し続けなければならないのでしょう。
重い処理なんてはさんだら、性能が落ちちゃいますし、見落としますからね。
ポートの入力は、割り込み信号は上がるのでしょうか?それとも、ポーリングを掛けて見続けていなければならないのでしょうか?
これで作り方は変わります。
通常、こういうプログラムの作り方は、一定の処理をダイナミックループで回していて、その中で、各処理を行っていくのが普通です。
なので、ダイナミックループの中にある、サブルーチンの平均所要時間を割り出してやると、ダイナミックループ1回にかかる時間が判ります。
このダイナミックループの中に、カウンタールーチンを作っておいて、何回回ったかを記録してその回数で、時間の経過を測定します。
指定時間内だけポートをチェックするのであれば、そのダイナミックループの中にポートチェックを入れておいて、カウンタールーチンで積算されている内容で、ポートチェックのルーチンに入るのかはいらないのかをすればよいだけです。
割り込み処理があるのなら、カウンタールーチンを、ダイナミックループに入れる必要は無く、割り込み処理の方に入れてやればよいだけです。
当然カウンタールーチンで、割り込みを開放、停止すればそもそもチェックに行く必要もなくなるわけです。
8ビットしかないからと言うのは、他の人も書かれて居る様に、単純に増やせばよいだけの話です。
カウンタ用の1バイトがいっぱいになってたら上位桁用の1バイトにインクリメントしてあげれば、1ビットのカウンタになるでしょう?
そんなに難しい話ではないと思います。
nopは、コンパイラによっては、削除されてしまう物もあります。
その辺は仕様書を読まないと判りませんけどね。
nopコードとして入れてくれる物もあるのですけどね。
タイマーなんて持っていないCPUを使う時はこんな方法は良く使って居ましたね。
途中に思い処理が分岐で入ると、そこを通ったか通らなかったかで、タイマーのカウンタの上げ方も変えなければならなかったですからね。
カウンタが足りないだけなら、上の様に増やせばよいだけの話です。
皆さん有難うございました。
皆様の仰る通り、気づいてみたら特に難しいものではなかったです。
タイマー的な動作をループのネストで作ると
ステップ数を自分で計算しなければいけないので
面倒そうだし精度的にもどうかなと思ったのですが、
目的のものがそれほど精度を要求するものではなかったので、
あとはループの一番内側でポートの状況を毎回見ておく
という感じでとりあえず要求を満たすことができました。
ありがとうございました。
No.6
- 回答日時:
(1)
(必要なら割り込み停止)
ループ {
ループ {
ループ {
監視処理
}
}
}
(必要なら割り込み許可)
(2)
100ms毎に割り込み初期化
割り込みタイミング合わせ
無限ループ {
監視処理
割り込みがかかっていたら抜ける
}
No.4
- 回答日時:
ネストで回すのと同じ考え方ですが、アセンブラなので違う書き方をすると、
カウンタのカウンタを作ればいいでしょう。
カウンタが0から255に来たら、一回まわったとして別のカウンタをプラス1して
255になったカウンタは0に戻すわけです。
結局、8bitxnのカウンタを自分で作るわけですね。
No.2
- 回答日時:
ループをネストすれば良いのでは?
例えば下記のようにすると255×255回のループになりますね。
足りなければ更に多重化すれば良いです。
下の場合、iとjはunsignedにすることをお忘れなく・・・
for ( i=0 ; i < 0xff ; ++i ) {
for ( j=0 ; j < 0xff ; ++j ) {
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript カラーミーショップのsectionループ内で、[引数][戻り値]ありの関数的な処理を行いたいです。 1 2022/05/07 19:39
- Java Java モンスターブリーダー 1 2023/02/05 09:44
- Visual Basic(VBA) 【VBA】Excelの特定範囲のセルを画像で保存したい 2 2023/01/25 13:06
- その他(プログラミング・Web制作) COBOL数値転記をCOPY句内での仕様 6 2022/06/15 18:48
- Java Java 南京錠 2 2023/02/04 11:46
- Visual Basic(VBA) VBA横データを縦にしたいです 2 2023/08/08 19:38
- Visual Basic(VBA) 【VBA】写真の縦横比を変えずに貼り付ける 5 2023/06/13 11:42
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- C言語・C++・C# プログラムについて。 4 2023/07/20 15:46
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コールバック関数について
-
アトメル社製ATtiny2313マイコ...
-
このレジの並び方は間違ってま...
-
スーパーのレジで並んでいたら...
-
LEDの点灯(C言語,PIC)
-
PIC16F84Aから16F628Aの...
-
割り込みの入り方。考え方。
-
PIC18F14K50でmain処理が動作し...
-
PIC16F84AのRBポート変化割り込...
-
アプリケーションをフルスクリ...
-
割り込みベクタは誰が設定する...
-
SH2のタイマ出力
-
IRQって何ですか?
-
volatileについて
-
PCの割り込み処理とはなんでし...
-
IBMのDOS/V用BAIS...
-
PIC12F683のソフトウェアUARTは...
-
コンピュータ/OS の原理を知る...
-
PIC電子工作
-
人体感知ライトについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
電車で待機列の割り込みについ...
-
スーパーのレジで並んでいたら...
-
CPU負荷率の安全な上限と計...
-
マイコン C言語 割り込み処理...
-
このレジの並び方は間違ってま...
-
USB機器からのデータ受信による...
-
【組込み】割り込み中のstatic...
-
VB6でSendKeyを利用したTab移動...
-
一定時間操作がなかったら、と...
-
VB.NET スレッドからのイベント...
-
irqbalance って
-
ウォッチドッグタイマ(WDT)の...
-
Timerコントロールによる動作の...
-
pic 複数の割り込み関数 切り分...
-
マイコンSH-2の割り込みを用い...
-
Amazonfireタブレットにわから...
-
STATUSのZフラグについて
-
マイコンの割り込みについて教...
-
Timerコンポーネントのインター...
-
電車乗車時、並んでいるのに割...
おすすめ情報