• 締切済み

PIC16F84でデジタルスピードメーターを作る

micariの回答

  • micari
  • ベストアンサー率85% (12/14)
回答No.4

> 表示部分の割り込みというのはBの割り込みを利用するということでしょうか そうです。 > 「インタバルタイマの割り込み」というのが分からないのです > 何を条件に割り込みを発生させて表示用プログラムへ行く 使用目的による名まえで、PIC のデータシートには、この名まえで記載されていないかもしれません。 具体的には、TMR0 のオーバーフローの割り込みです。これを時間の間隔を管理するためのタイマとして使用するということです。 この割り込みを許可していれば、一定の時間ごとに、勝手に割り込みルーチンに飛んでいきます。プログラムから呼び出すわけではないので、フロ-チャートで示される以外の動作です。 以前の回答を読み返してみて、「これ以外の方法は、考えられません」というのは、断定的すぎたかもしれませんね。すみません。 ダイナミック点灯のためには、点灯している時間、消灯している時間を、一定にできればいいわけです。 必要な時間の間隔を得るためには、ソフトウェアで待ちのループを作る、割り込みを使う、などいろいろ方法があります。 ソフトウェアで待ちのループを作るというのは、一般的には嫌われます。理由は、待っている間は他の処理ができないのでマイコンの資源を有効に活用できない、待っている間に他の割り込みなどが入ると時間間隔が管理できない、プログラムを変更するごとに気にしておく必要がある、などです。しかし、これらが問題にならないのであれば、一定の時間の間隔を得るために、割り込みを使わないで実現できます。 > あと、PICをほんの少し動かせる・・・・ですが うーん、どうでしょうね。PIC のアーキテクチャは特殊な部分があるので、どの程度、理解しているか、という意味でいったのですが。 最近のデバイスも 16F84A も、そんなに変わりはありません。追加された周辺機能を使わなければ、16F84A と同じように動かせます。もっとも、適切に初期設定をする必要はありますが。 あと、最初の質問について、回答を補足しておきます。 値を保存しておくのに、W レジスタではなく、メモリに保存しておくほうがいいでしょう。 W レジスタは、ワーキング・レジスタであり、他のマイコンでいう、アキュームレータのようなものです。あくまでも一時的に使用するレジスタです。 疑問点がありましたら、補足で追加してください。 また、ほかの回答者のかたのご意見もお待ちしています。

motokichi
質問者

補足

ありがとうございます。 インタバルタイマについて調べたらこんなHPがありました。 http://homepage1.nifty.com/rikiya/software/313.TIMER0.htm 要するにこれですよね? ざっと目を通してみたのですがちょっと難しいですね。なんとなくぼんやりとはイメージ出来始めてはいるのですが・・・。 一定時間ごとに勝手に割り込みルーチンに飛んで処理をするということですよね? これならタイマーのカウント(速度の計測)とLEDの表示という2つの処理を同時に行えるということですね? じっくり目を通して疑問があればまた補足いたしますのでよろしくお願いします(長期戦になるとおもいますが)。

関連するQ&A

  • PIC CLITEでデジタルカウンタを作りたい

    7セグLEDを使って,押しボタンスイッチの押した回数(0~9)を7セグで表示するプログラムをHitec社のPIC CLiteで作りたいのですが,押しボタンを押しても回数がランダムで表示されてしまいます.どういったところを直したらいいでしょうか? ***プログラム*** ボタンスイッチを押したぶんだけ数値をカウントする main{ while(1){ if(RA0==0){   …押しボタンのポート ++a; { if(a>=10){   …10回押したら0になる a=0; } ↓7セグに出力 RB4=a%2; RB5=(a/2)%2; RB6=(a/4)%2; RB7=a/4; } }

  • PICでスピードメーターを作るためのプログラムについて

    PIC16F84Aを使用してスピードメーターを自作することを目指しているのですが、 まだ初心者なのでどういったプログラムを組めばよいのかが分からないのですが自分なりに方法を考えてみました。 それは、 車速パルス間の時間をタイマーで計測し、その結果に応じてあらかじめ用意した表示用のデータを出力する。 データを出力したら次のパルス間の計測結果が出るまで表示を続け、次の計測結果が出たらそれを新たに出力する。 というものです。 一般的なメーターもこういう原理なのかも知れませんが・・・。 「Timer0」「プリスケーラ」「割り込み」というものを使用したりするようですが、 正直言ってこれらの具体的な使用方法が分かりませんのでとりあえずスピードメーターを簡素化?したものを学習用として作ることにしました。 それは PICのピンにタクトスイッチを取り付け(チャタリング対策もする)、入力用にする(割り込みが出来るRA4でいいのかな?)。 RBのポートを7セグ表示用のICへ繋ぐ。 という回路で、 電源を入れるとタイマーが計測をはじめ、タクトスイッチを押すと押すまでの時間に応じて結果をポートBに出力する。 電源ON→スイッチ1回目→結果を出力すると同時に2回目までの計測を開始→スイッチ2回目→結果を出力すると同時に3回目までの計測を開始・・・と続く。 この回路での計測結果と出力データの関係は以下のようにします。(適当に考えたものですが) 計測結果が 10秒以上・・・00を表示(2桁はダイナミック点灯で表示) 9~10秒・・・01を表示(厳密には9秒以上10秒未満) 8~9秒・・・・02を表示(厳密には8秒以上9秒未満、以下同じ) 7~8秒・・・・03を表示 6~7秒・・・・04を表示 5~6秒・・・・05を表示 4~5秒・・・・06を表示 3~4秒・・・・07を表示 2~3秒・・・・08を表示 1~2秒・・・・09を表示 0~1秒・・・・10を表示 というものを試しに作ってみようと思います。 アセンブリ言語を使ってプログラムを作るのですが、 Timer0やプリスケーラ、割り込みをプログラムの流れの中でどのように利用すればよいでしょうか? 出来たらソースを作って頂いてそれで詳しく説明を書いていただけると非常に助かります。

  • PIC 割り込み

     PIC16f873のRB0ピンにパルス波形が常に送られてきているとして、そのHighのときのパルス幅(時間)をタイマー1で測り、その値を常にグローバル変数のHWidthに代入し更新している処理Aがあるとします。  そして、メインの処理Bを走らせている途中で、Widthの値を使いたいというときは、どのような方法を用いればいいのでしょうか? 素人質問で申し訳ありませんが、よろしくお願いします。できたら、サンプルプログラム的なものをあげていただくとありがたいです。

  • ベンツのスピードメーター

    ちょっと古いベンツのスピードメーターの速度計で、30kmと50km付近にある橙色の表示は何でしょうか? なにかの意味があるのでしょうか? 参考画像 http://www.geocities.jp/carclub_jp/w140s500l3.jpg

  • スピードメーター 校正できますか?

    ダイハツMOVE L152Sです。 私のMOVEのスピードメーターは、他の車と一定の車間で走った時のスピード表示と比べても明らかに高い速度を表示します。 自作のマイコン回路へ、スピードパルスを入力し、パルス間隔を測定し、速度へ換算するプログラムを作成したのですが、60km/h時=637rpmの回転とした時、カーナビが表示する車速と同じ速度を出力します。 これらに対して、スピードメーターは7%程度高い速度を表示します。 体感的にはカーナビも正確な速度を出力しているのではないかと思うのですが確かめる方法がありません。 出来れば、正確な速度を表示させたいのです。 1 そもそも スピードメーターはどのように動いているのでしょうか?  電圧計?(今時考えにくいかな・・)   それともステッピングモータか何か? 2 自分で分解して校正できますか? 校正方法は?   例:針を動かすとか、ポテンショメータみたいなのをまわすとか   3 カーナビや車速信号の他に簡単に正確な速度を知る方法はありますか?

  • PICのプログラム

    PIC16F84Aのサンプルプログラムを見ると  MOVWF 01F PORAT B GOTO MAIN でRB0のLEDのみ点灯になってるんですが、自分的にはB'00000001' のほうがわかりやすいと思いこれに変更したのですが上手く出来ません。どういう感じでプログラミングすればいいんでしょうか? RB0からRB7まで1個づつドライブさせたいです。

  • PIC16F1827のEEPROMへの書込み

    PCM V5.0(PIC用CCS社コンパイラ)を Mplab8.92に組込み、PICkit3を使ってプログラムしています。 PIC16F1827のEEPROMへの書込みがうまくいきません。 RAは入力ポートで固定してあります。 RBは出力ポートでLEDが接続してあります。 テストプログラムは一回のみの動作です。 実機で動作させると RAは固定してあるので当然(4)でLEDが点灯しますが、 実機からCPUを抜き取りMplab上でReadすると EEPROMのアドレス0,1,2は異なるデータであり 動作させるたびに違うデータが書込まれています。 しかし (1) a0=35h (2) a1=a6h (3) a2=93h と定数にすると EEPROMのアドレス0,1,2は正しいデータが 書込まれています。 Q1. a0,a1,a2をポート入力とする場合は CPU自体に何か設定する必要があるのでしょうか? それともプログラムに工夫が必要なのでしょうか? いままで使っていたPIC16F88では このようなことはなかったと思うのですが・・・。 ----- テストプログラム ----- a0 = RA; //(1) write_eeprom (0,a0); a1 = RA; //(2) write_eeprom (1,a1); a2 = RA; //(3) write_eeprom (2,a2); if (a0 == a1 && a1==a2) //(4) RB =255; else RB =0;

  • マイコンPIC16F84Aについて質問です

    MPLAB(秋月)のライターを使用して PIC16F84Aにプログラムを製作したいのですがプログラムの組み方がわかりません 内容は、センサー5v~24vがオンしたらLEDが点灯する回路です。 動作確認をしたところ、センサーはオンオフしているのですが、LEDが点灯しません。 プログラムを組む時に、RB0がオンしたらRA0がオンする為の繋がりがイマイチわかりません。 c言語はわからないので、アセンブル命令で教えていただけないでしょうか? 初心者なので全くわかりませんがお願いします。

  • PICアセンブラ言語で車のスピードをLEDバー表示したいのですが

    現在、自作で車のスピードメーターを製作しています。 車速パルスを利用して、スピード表示を10km/h単位で1つのLEDを点灯して、180kmまでの18個のLEDをバー表示したいのですが、どのようにすればその処理が出来るのか分かりません。 どなたか教えていただけないでしょうか。 宜しくお願い致します。

  • PIC16F819

    PIC16F819のADコンバータを使用しています。 RA0からアナログ信号を入力して、PORTBのそれぞれのピンから1bitずつ(計8bit)のデジタル信号を出力させるためのプログラムを書いてみましたが、まったく動作しません。レジスタの設定なども変えてみましたが動作しませんでした。特にPORTBを全てHighにした場合、なぜかRB6とRB7からの出力を確認することができませんでした。 動作しない原因がまったく分からないので困っています。原因が分かる方がおられましたらご教授お願いします。 #include <pic.h> __CONFIG(DEBUGEN&WDTDIS&LVPDIS&HS&PWRTEN); void init_a2d(void){  ADCON0=0x40;  ADCON1=0x40;  ADON=1; } unsigned char read_a2d(unsigned char channel){  channel&=0x07;  ADCON0&=0xC5;  ADCON0|=(channel<<3);  GODONE=1;  while(GODONE)continue;  return(ADRESH); } void main(void){  unsigned char x1;  init_a2d(); //initialise the A2D module  GIE=0; // we don't want interrupts  TRISB=0x00;     // PORTB will be used in output mode  PORTB=0x00;  x1=read_a2d(1); // sample the analog value on RA0  PORTB=x1; }