• 締切済み

PICで既定の時間数ループを回したい

16f84aというPICを使っているんですけど あるループを約1秒間回す処理ってどうやって c言語で書けばよいでしょうか 教えてください c言語は結構理解してるつもりですけど PICは初心者です

みんなの回答

  • KEIS050162
  • ベストアンサー率47% (890/1879)
回答No.4

言語の知識があっても組込み系が初めてならば、いきなり割り込み処理はハードルが高すぎますね。 少なくとも、C言語でこれをどうやって記述するかは、マイコンボードの仕様やコンパイラに依存します。 秋月のキットかなにかをお使いでしょうか? マイコンのデータシートやキットの仕様書などを熟読された上で、 そのキットのサンプルコードをいくつか入手して、マイコンのレジスタの設定や、割り込みハンドルの仕方など一通り理解しないと、#2さんのせっかくのアドバイスもちんぷんかんぷんなのではないかと思います。 そうでなければ、お使いのボードや、コンパイラ環境などをお書きになると、もう少し具体的なアドバイスがもらえるかも知れません。 まずは、この辺りの資料類を熟読してみてください。 ご参考に。

  • SortaNerd
  • ベストアンサー率43% (1185/2748)
回答No.3

No2です。 すいません、調べてみるとレジスタへの書き込みは(少なくともHI-TECH Cで)ポインタ演算ではありませんでした。 単純に値の代入でいけます。便利ですね…。 割込みについても参考になりそうなページがありました。 http://technologicaladvance.blog.fc2.com/blog-entry-20.html

  • SortaNerd
  • ベストアンサー率43% (1185/2748)
回答No.2

3通り思いつきます。 1. 回数で指定してループを回す 何回で1秒になるかは現物合わせです。 プログラムはもっとも単純です。 欠点は、ループ内の処理時間が一定でないと使えないことと、繰り返し回数がコンパイラに依存することです。 2. タイマーをポーリング 基本的な流れは、 TMR0を走らせ、ループごとにTMR0の値をチェックし、目標の値を越えていたら終了。 TMR0の設定はOPTIONレジスタに値を書き込むことで行います。TMR0の値をチェックするのはTMR0レジスタから値を読み込むことで行います。 PICのC言語は使ったことが無いので具体的な記述は分かりませんが、ポインタ演算でOPTIONレジスタに値を設定している箇所が既にあるでしょうからそれを参考にしてください。 具体的な設定値はデータシートを見てください。内部クロックで動作、プリスケーラは最大にしておくのが良いでしょう。 なおTMR0は1秒をカウントできませんので、10ミリ秒を100回数えるなどの工夫が必要です。 3. タイマー割込み 一番スマートなやり方です。 TMR0がオーバーフローする際に割り込みを発生させ、一定回数後にループを抜けるという流れです。 C言語での書き方は分かりません。

  • black2005
  • ベストアンサー率32% (1968/6046)
回答No.1

ソフトウェアで1秒間をカウントするなんて無謀。 16F84Aにはタイマ0(TMR0)という8bitタイマが内蔵されているので、それを使って1秒間を作る。

saya19
質問者

補足

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

関連するQ&A