- 締切済み
PIC16F84でデジタルスピードメーターを作る
PIC16F84Aでスピードメーターを作ろうと思います。 条件は ・タイヤ1回転で4回のパルス。 ・1パルスあたり50cm(タイヤ外周2m) 測定方法は ・各パルスの間隔をタイマーで計測 ・タイマーは0.009秒のタイマー(Aと名付ける) ・パルスを検出するとタイマーAを繰り返し、Wレジスタに1ずつ加算。 ・次にパルスを検出したらWレジスタの値(Aを繰り返した回数)に応じて速度をダイナミック点灯表示させるプログラムを呼び出す。 速度の表示方法(ダイナミック点灯) ・パルス回数>200なら時速0kmと表示 ・パルス回数=200なら時速1km、パルス回数=199・・時速2km、パルス回数=1なら時速200kmと表示 各パルスの間隔をAを何回繰り返したかによって測定し、それに応じて7セグに3桁表示するものとする。 接続 ・RB0~RB6・・・7セグLED ・RA0~RA2・・・7セグLED(カソード) Wレジスタの値に応じて速度を表示するプログラムを呼び出すまではプログラム書けそうなのですが、 「ダイナミック点灯のプログラムの実行」と「パルスを検出し、タイマーAの回数をカウント」という2つの動作を同時にさせなければなりませんよね? 16F84Aでこのようなことは可能なのでしょうか? だとしたらどのような考え方でプログラミングすれば良いでしょうか?ど素人なので分かりやすい説明をお願いします。
- みんなの回答 (10)
- 専門家の回答
みんなの回答
- micari
- ベストアンサー率85% (12/14)
- micari
- ベストアンサー率85% (12/14)
- micari
- ベストアンサー率85% (12/14)
- micari
- ベストアンサー率85% (12/14)
- micari
- ベストアンサー率85% (12/14)
- micari
- ベストアンサー率85% (12/14)
- micari
- ベストアンサー率85% (12/14)
- micari
- ベストアンサー率85% (12/14)
- komorebi99
- ベストアンサー率33% (15/45)
- micari
- ベストアンサー率85% (12/14)
関連する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; }
- ベストアンサー
- C・C++・C#
補足
ありがとうございます。 > 速度の変化にリニアに反応するようにしたい この意味がちょっとわかりません。得られるデータは速度のデータなので、実際の速度と得られるデータの関係は、いつでも線形 (リニア) だと思うのですが ? ダイレクトカウントだと時速1kmの場合パルス間隔が1.8秒ですよね? すると最新の計測結果が分かるのが1.8秒毎ということになります。 1.8秒毎に最新の計測結果が出るということは例えば自動車が1秒毎に1kmづつ加速すると、 スタートして1.8秒間はパルスが来ないので表示は「0」となりますよね?1.8秒経過してパルスが1回入ると時速1キロとなりますがこのときは自動車は時速1.8kmに達しています。 ほんのわずかな遅れですが、出来ればこの遅れが少ないほうが良いかな?と思ったのです。 おそらくダイレクトカウントだと加速時に表示が0.1.2.3.4.5と連続せずに0.3.5.6.8.みたいな感じになるのでは?と心配をしているのです。 正直言って実際に作って使用してみないとそれが自分にとって納得できる範囲かどうかが分からないのです。 ちょっと表現方法が悪かったですね。すみません。 パルス毎に速度を計測するレシプロカルの方がよりきめ細かい(なめらかな)表示が出来るのかな?と思ったのです。 もしそうならレシプロカルカウントで実現させたいです。 よろしくお願いします。