プロが教えるわが家の防犯対策術!

16f84aというPICを使っているんですけど

あるループを約1秒間回す処理ってどうやって
c言語で書けばよいでしょうか
教えてください

c言語は結構理解してるつもりですけど
PICは初心者です

A 回答 (4件)

言語の知識があっても組込み系が初めてならば、いきなり割り込み処理はハードルが高すぎますね。


少なくとも、C言語でこれをどうやって記述するかは、マイコンボードの仕様やコンパイラに依存します。

秋月のキットかなにかをお使いでしょうか?

マイコンのデータシートやキットの仕様書などを熟読された上で、
そのキットのサンプルコードをいくつか入手して、マイコンのレジスタの設定や、割り込みハンドルの仕方など一通り理解しないと、#2さんのせっかくのアドバイスもちんぷんかんぷんなのではないかと思います。

そうでなければ、お使いのボードや、コンパイラ環境などをお書きになると、もう少し具体的なアドバイスがもらえるかも知れません。

まずは、この辺りの資料類を熟読してみてください。

ご参考に。
    • good
    • 1

No2です。


すいません、調べてみるとレジスタへの書き込みは(少なくともHI-TECH Cで)ポインタ演算ではありませんでした。
単純に値の代入でいけます。便利ですね…。

割込みについても参考になりそうなページがありました。
http://technologicaladvance.blog.fc2.com/blog-en …
    • good
    • 1

3通り思いつきます。



1. 回数で指定してループを回す
何回で1秒になるかは現物合わせです。
プログラムはもっとも単純です。
欠点は、ループ内の処理時間が一定でないと使えないことと、繰り返し回数がコンパイラに依存することです。

2. タイマーをポーリング
基本的な流れは、
TMR0を走らせ、ループごとにTMR0の値をチェックし、目標の値を越えていたら終了。
TMR0の設定はOPTIONレジスタに値を書き込むことで行います。TMR0の値をチェックするのはTMR0レジスタから値を読み込むことで行います。
PICのC言語は使ったことが無いので具体的な記述は分かりませんが、ポインタ演算でOPTIONレジスタに値を設定している箇所が既にあるでしょうからそれを参考にしてください。
具体的な設定値はデータシートを見てください。内部クロックで動作、プリスケーラは最大にしておくのが良いでしょう。
なおTMR0は1秒をカウントできませんので、10ミリ秒を100回数えるなどの工夫が必要です。

3. タイマー割込み
一番スマートなやり方です。
TMR0がオーバーフローする際に割り込みを発生させ、一定回数後にループを抜けるという流れです。
C言語での書き方は分かりません。
    • good
    • 2

ソフトウェアで1秒間をカウントするなんて無謀。


16F84Aにはタイマ0(TMR0)という8bitタイマが内蔵されているので、それを使って1秒間を作る。

この回答への補足

具体的にはどうしたらいいんでしょうか?

補足日時:2013/07/21 15:03
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!