• 締切済み

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

micariの回答

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

> 各桁の数字を高速で順番に切り替えて残像を利用して各桁が同時点灯しているように見せかける これは、そのとおりです。 LED の明るさは、表示時間に依存しますので、各桁が点灯している時間は、同じでなければなりません。そうでなければ、桁によって明るさがちがってくるでしょう。また、各桁の点滅する周期を目の残像時間よりも、長くすると、表示のちらつきが感じられるようになります。 つまり、ダイナミック点灯においては「一定」の時間で、表示する桁を変えていくことが必要です。 インタバルタイマの割り込みによる方法が一般的です。 メインルーチンで他に何もする必要がなければ、#2 の方の示された参考 URL のようにソフトウェアのループで時間を計っても、ほぼ「一定」の時間で、表示する桁を変えることは可能と思われます。 > 表示中はパルスを受け付けない パルスは、割り込みで受け付けるような設計ですか ? パルスの割り込みが受け付けられないようなことは、ないと思います。 LED 用の割り込みは、表示する桁を切り換えて、新規の桁の表示を更新するだけです。あとは I/O ポートがその桁のドライブと表示内容をラッチしているので、何もしなくても、次に表示を更新するまで、その内容は表示され続けます。 LED 用の割り込みからは、すぐに抜けることができる (時間がかからない) と思いますが、割り込み処理中 (表示の更新中) に他の割り込みが入った場合でも、その割り込みは待たされます。 通常、割り込み処理中は、割り込み禁止になっています。だから、LED 用も割り込み処理中に、パルスからの割り込みが入った場合、その割り込みは待たされ、LED 用の割り込み処理が終わった直後に、パルスからの割り込みが起動します。 というよりも、そのようにプログラムを作らなければなりません。特に PIC では、割り込み処理中に、他の割り込みを受け付けるように (多重割り込み) しては、いけません。 また、割り込み中は、必要最小限の処理にするような配慮も必要です。 > こんな感じですか そんな感じです。 > 16F84Aをほんの少しプログラムできる程度で最近のデバイスも動かせるものでしょうか 「ほんの少し」というのが微妙ですが、できるでしょう。 逆にいえば、最近のデバイスを動かせないのであれば、16F84A も、ろくに動かせていなかった、ということでしょう。 ミッドレンジであれば、アーキテクチャは 16F84A と同じです。いやらしいバンク切り換えが必要なところまでもが同じです。周辺機能については、データシートを見て理解でき、周辺機能を動かすためのハードウェアの一般的な知識があるなら、問題ないでしょう。 ソフトウェアの全体の設計、デバイスのアーキテクチャ、ハードウェアの理解が重要と思います。 疑問点がありましたら、補足で追加してください。

motokichi
質問者

補足

すみません。本当に素人で・・・。 割り込みについて調べてみたんですが、割り込みには A「外部からの信号入力によって発生する割り込み」 B「プログラム内部で一定の条件を満たした場合に発生する割り込み」 の2種類があるんですね。 今回の表示部分の割り込みというのはBの割り込みを利用するということでしょうか? 「インタバルタイマの割り込み」というのが分からないのです。 何を条件に割り込みを発生させて表示用プログラムへ行くのでしょうか? フローチャートのように時間の流れを追って説明をいただけると助かります。(すでにそうしていただいているのかも知れませんが・・・すみません) あと、PICをほんの少し動かせる・・・・ですが、 ピンからの出力とタイマでLEDを点灯、点滅させたり、スイッチでプログラムを変更したり(割り込みではなくて入力待ち)、といった程度です。

関連する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; }