- ベストアンサー
PICでのBCD変換について教えてください
PIC初心者です。 PICと液晶表示器を使って車の電圧計(XX.Xで表示)を作ろうとおもっています。 AD変換して得た値(精度は求めていないので8ビット)をBCD変換して液晶表示器に送ればよいことはわかったのですが、肝心のBCD変換の概念?というか流れがよくわかりません。 いくつか参考になりそうなプログラムを見ました。ここでもQNo.4399051で同じような質問がありました。でも、たとえば、割って商に0x030を足すのはなぜなのか、理解できません。もしかして、アスキーコード表というものに合わせるためでしょうか? じっくりとプログラムを読めばよいことかもしれませんが、経験者の方よろしければ簡単にお教えください。よろしくおねがいいたします。
- abbbbbbbba
- お礼率63% (7/11)
- その他(趣味・娯楽・エンターテイメント)
- 回答数1
- ありがとう数3
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
『もしかして、アスキーコード表というものに合わせるためでしょうか?』 そうです。この部分はBCD変換ではなくASCII変換ですね。 BCD変換くらいは人のプログラムを見るより算数で考えたほうが理解は簡単です。 ある8bit数 x があります。0~255ですね。求める10進数各桁は、100の位をA、10の位をBとします。 A、Bの初期値を0にします。 xが100以上なら、xから100を引いてAに1を加え、この行を繰り返します。xが100未満なら次の行へ。 これで100の位Aが分かり、xには元の数を100で割った余りが入っています。 xが10以上なら、xから10を引いてBに1を加え、この行を繰り返します。xが10未満なら次の行へ。 これで10の位Bが分かり、xには元の数を10で割った余りが入っています。つまり1の位はxです。 以上で2進→10進変換おわり。これをBCDコードにするのも簡単ですが液晶表示のためにASCIIコードが欲しいならBCDコードは意味が無いでしょう。 ASCIIコードの"0"は0x30、"9"は0x39ですから、A、B、xに0x30を加えると、100の位、10の位、1の位のASCIIコードになります。
関連するQ&A
- PIC 10ビットをBCD変換をする方法おしえて
あるサイトで、8bitをBCD変換する方法をみつけました。それは 『 BCD変換くらいは人のプログラムを見るより算数で考えたほうが理解は簡単です。 ある8bit数 x があります。0~255ですね。求める10進数各桁は、100の位をA、10の位をBとします。 A、Bの初期値を0にします。 xが100以上なら、xから100を引いてAに1を加え、この行を繰り返します。xが100未満なら次の行へ。 これで100の位Aが分かり、xには元の数を100で割った余りが入っています。 xが10以上なら、xから10を引いてBに1を加え、この行を繰り返します。xが10未満なら次の行へ。 これで10の位Bが分かり、xには元の数を10で割った余りが入っています。つまり1の位はxです。 』 非常にわかりやすい説明です。ところで、10bitをBCD変換するには どうしたらいいでしょうか。たとえば、PICの10bitのA/Dコンバーターを 使うと、2bitのX_HIGHと8bitのX_LOWの二つのファイルに分割 されてでてきます。これをBCD変換したいんですが。
- 締切済み
- 物理学
- picを使った温度計
picと温度センサーを使ってLCDに温度を表示するようなものを作ろうと思っています。 温度センサーはS-8100Bというものを使って直接picに接続しており、picに内蔵された10bitのAD変換器を使って温度を測定しようと思っています。 AD変換の基準電圧を5Vにしてうまくフルスケールになるようにと思っているのですがどう計算したらいいのかわからなく困っています。 センサーの温度特性は-8mV/℃で30℃の時1.508V、80℃の時1.095Vを出力します。 精度としては室内の温度を測定したいので、小数点以下は四捨五入して0~80℃(実際は80℃もいりませんが)の範囲で考えています。 また、部品数を少なくしたいので電圧値がらみの計算は全てプログラム上でやろうと思っています。 フルスケールでかつプログラム上で処理しやすくするにはどのように電圧値を考えたらよいのでしょうか。
- ベストアンサー
- その他([技術者向] コンピューター)
- PIC18F4550でAD変換
PIC18のAD変換を使用しているのですが わからない部分があるので質問させていただきます。 ・現象 リファレンス電圧は電源電圧+5V(Vdd)を使用し10bit分解能で行っているのですが90mV位(低い電圧のAD変換)の時の変換値がずれます。 ・測定方法 測定はテスターでPICのVss端子にGND、アナログ信号入力端子に+側を当て直接PICの足をさわっています。 ・結果 1023=5Vですので1=約0.0049V 0.097V=19を示して欲しいのですが17となります。 5V時は1023を示し2.5V時は511が出ており電圧を上げると計算通りに示します。 リファレンス(電源電圧)を意図的に変えてみたのですが低い電圧の時は変化がありませんでした。 上記点より低い電圧での変換では精度が出ないという事なのでしょうか。 またこのあたりの仕様が記載されている資料などありましたら宜しくお願い致します。
- ベストアンサー
- 電気設計
- PICで小数点の演算
PIC16F877Aを使ってプログラムを作っています。その内容がセンサー(例えば温度センサー等)から取り入れた電圧をPICのA/D変換(10bit)を行って、その値を使ってpicで計算し、その結果を液晶に表示するといった内容なのですが、その計算過程で小数を扱わなければならないのですが、その計算がうまくいきません。A/D変換後の値をxとし具体的に式で書くと、 v = x * 5 / 1023 ・・・(1) ここでvはセンサーから取り込んだ電圧値(値の範囲は0.935~1.748)です。 y = 218.5 - v / 0.008 ・・・(2) 又は y = 218.5 - 125 * v ・・・(3) 上記の式はA/D変換後の値xを一度アナログ電圧値vに変換し(1)、そこから(2)又は(3)へ代入して得たい情報yを算出するといった少々面倒なものなのですが、これをアセンブラで書きたいのですが、このPICには乗除命令がないことや小数点の演算方法、16bitの乗除等の部分が引っかかってどうもうまくかけません。小数部分は固定小数点形式で考えて最終的にyは少数第二位を四捨五入したいと思っています。 どのようにプログラムを作ればよいのでしょうか。実際にソースを書いていただけると大変理解しやすいです。
- ベストアンサー
- その他(プログラミング・開発)
- PICでAD変換すると電圧降下がおきます。
現在PIC24FJにてAD変換をしようとしています。 AD変換の入力端子は、3.3Vで常時プルアップ(10KΩ)されています。 しかし、AD変換実行している時だけ、アナログ電圧が3.3Vから0V付近へ落ちてしまい、AD変換終了後は3.3Vに戻るというような現象が発生してしまいます。 AD変換のステータス自体は正常に完了したことになっており、デジタル値も実際の電圧(0V付近)が取得できています。 このような現象は、対処方がわからず困っています。 どなたかアドバイスをいただければ助かります。 よろしくお願いします。
- 締切済み
- 電気・電子工学
- 負電圧を正電圧に変換したい(PIC AD変換)
PICマイコンを使いLCDにATX電源の電圧表示をする回路を組んでます。 使っているマイコンはAD変換付きの16F877です。 3.3V,5V,12Vは問題ないのですが、-12Vの測定で悩んでます。 まだ試してないのですが 1・別途AD変換ICを容易して-12VをGNDにする 2・分圧しOPアンプで反転・増幅して取り出す(出来るのでしょうか?) アドバイス・ヒントで構いません。よろしくお願いします。
- ベストアンサー
- その他(学問・教育)
- PICマイコンについて
PICマイコンについての質問です。 現在LCDドライバをPICマイコンで動かして液晶に表示させようとしてます。 PIC16F1619のCuriosityを使用してます。 この条件では、液晶は表示され問題なかったのですが、メモリの大きい PIC16F18346に置き換えて同じプログラムで動かそうとしたところ、 (もちろんMCCで必要な部分の設定はし直したことろ)、デバッグはOKになったものの 全く液晶に表示されませんでした。 おかしいなとおもってロジアナで波形を確認したところ、CS、A0、SDO、SCKの 波形が異なっていました。プログラムが全く同じなのにこんなことはありえるのでしょうか? 原因はそれだとは思いますが、わかりましたら、ご連絡願います。よろしくお願いいたします。
- ベストアンサー
- 電気設計
- PIC16F877を用いたC言語でのAD変換について
PICを用いてAD変換をしようとしていますが,思うように出力が出ず困っています. 可変抵抗を用いて0-5V間を調整可能な入力をAN0ピンに接続し,AD変換の結果をBポートに出力しようとしています. 使用条件は,mikroC使用,PIC16F877使用,C言語使用,水晶20MHz,Aポート入力(AN0ピンアナログ入力),Bポート出力,Tad=1.6μsです. 以下のプログラムで間違っている点をご指摘いただきたいと考えています. unsigned int out_b; void port_initialize() { INTCON=0; //割り込みなし ADCON0=0x81; ADCON1=0x8E; //AD変換中の入力範囲設定は電源と共有 TRISA = 0x3f; //AD変換用ポート(1で入力) TRISB = 0; //出力用ポート(0で出力) PORTB = 0; } void value_initialize() { out_b=0; PORTB=out_b; } void main() { port_initialize(); value_initialize(); while(1){ //endless ADCON0=0x81; //AD変換bitを選択 Delay_us(24); //アクィジション時間+AD変換後の待ち時間 ADCON0=0x85; //AD変換開始 Delay_us(20); //AD変換待ち時間 out_b=ADC_Read(0); PORTB=out_b; } }
- ベストアンサー
- C・C++・C#
- PIC初心者です。 16F84Aから16F88への移行について
PIC初心者です。 PIC16F84A使って、液晶(SC1602)に文字を表示させる実験をしていました。それがうまくいったので、今度は16F88を使って同様に表示させてみようと思いました(回路の変更なしです)。というのも、将来的にAD変換を使ってみたかったのです。ここでのプログラムの変更点は、コンフィグレーションビットとインクルード文を16F84A用→16F88用に変更しました。これで、16F84Aで液晶に表示していたものと同じように表示されるハズだと思ったのですが、なにも映りません。 自分の考えでは、クロックの設定がまずかったのではないかと思っております。内部クロックを使うのか、外部なのか。OSCCONで設定するのでしょうか?ただ、ネット上で公開されているプログラムを見ると、OSCCONの設定はないものばかりでしたので、それが理由とも考えられません。 どのような点がまずかったのか、いくら考えてもわかりません。経験ある方、どうぞご教授ください。よろしくおねがいいたします。
- ベストアンサー
- その他(趣味・娯楽・エンターテイメント)
お礼
ありがとうございました。アドバイスを参考になんとなく書いてみました。