PICの命令DAWについて

このQ&Aのポイント
  • PICのアセンブラーを勉強中の初心者です。DAW命令についてよくわかりません。
  • DAW命令は、8ビットのWレジスタの上位4ビットと下位4ビットをそれぞれ独立にBCDデータに変換します。
  • 具体的な例として、10進の数値85がWレジスタにある場合、DAW命令の結果は13と33になります。
回答を見る
  • ベストアンサー

PICの命令DAWについて

PICのアセンブラーを勉強中の初心者です。以前にも何度か質問させていただいております。 Wレジスタの値を2桁のBCDに変換するというDAWコマンドの働き方がよくわかりません。 使用中の教本では「8ビットのWレジスタの上位4ビット、下位4ビットをそれぞれ独立にBCDデータに変換する。」とあるのですが、これは次のように解釈してよいのでしょうか? 例えば10進で「85」という数値がWレジスタにあったとすると、これはバイナリーでは '01010101' ですが、これが’8’と’5’を表す '1000' と '0101' に変換されるということでしょうか?つまり、DAW実行後のWレジスターは '10000101' すなわち、「133」という数値になるということでしょうか? 詳しい方、どうぞよろしくお願いいたします。 それから、前もって申し上げておかないといけないのですが、ご回答をいただいても、こちらからお礼を出来ないということが頻繁にあります。お礼の文章を入力してボタンを押しても、その操作は出来ませんという旨のメッセージが出てきて、何度やり直しても出来ません。それで今まで最初の回答者さんをベストアンサーにして質問を締め切るということをやってきました。今回も、もしお礼を出せなくなっても、全てご回答をいただいた方々には深く感謝いたしますので、悪しからずご了承ください。

質問者が選んだベストアンサー

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

> 「8ビットのWレジスタの上位4ビット、下位4ビットをそれぞれ独立にBCDデータに変換する。」 意味不明です。 知らずに適当なことを書いたのでしょう。悪い本に当たってしまいましたね。(参考までになんという本ですか?) この命令は「Decimal Adjust W Register」と書かれている通り、やっていることは変換というよりadjust(補正)です。 一言で言うと、BCD同士を通常の数値と見て加算した結果を正しいBCDに補正します。 なお、「データシートを見る限り、変換時、下位ビットの桁溢れは上位ビットに影響しない様」なのですが、多分データシートの間違いでしょう。データシート通りなら使い道がありません。 また私の見たデータシートの記述はNo1さんのものと違っていて、上位が ・Wレジスターの上位4ビット「+DC」が9より大きいか、Cビットが1なら、上位4ビット「+DC」に6を足してCを1にセット。そうでなければ「上位4ビットにDCを足す」 となっています。これもおかしいのですが、この「DC」をDCフラグのことでなく下位4bitの計算結果で出た繰り上がりのことだと考えればなんとか正しくなりそうです。 と、処理内容は複雑でデータシートすら信用出来ませんので、例を挙げたほうが分かりやすいですね。 ・0x11(17) + 0x11(17) = 0x22(34) の計算をして「22」がWレジスタに入っているとします。 この計算はBCDとして見ても正しいので、DAWを実行しても何も変えません。 ・0x09(9) + 0x19(25) = 0x22(34) の計算をして同じく「22」がWレジスタに入っているとします。 この計算はBCDとして見た場合正しくありません。ここでDAWを実行すると、 ・DCフラグが立っているので、下位4bitは+6されて8。(ここで次で扱うDCを0にする?) ・上位4bit+DC(0)は9以下なので、0を足し2のまま。 結果は0x28となり、9+19=28というBCD演算が完成します。

papashiroSooke
質問者

お礼

早速のご回答、有難うございます。 わたしが考えていたような単純なものではなく、少しややこしい命令のようなので、ご説明いただきました内容をよく読んで勉強させていただきます。 ちなみに、使っている本は、後閑哲也著の「改訂版 電子工作のためのPIC18F 本格活用ガイド」です。DAWの説明は126ページにあります。

その他の回答 (1)

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

PIC 18ファミリーのデータシートを見る限り、 Wレジスターの値を正しくBCDに変換する、 ということらしいですね。 質問者殿の理解とちょっと違います。 Wレジスタの上位8ビット(とC)、下位8ビット(とDC)の値(BCD)から、正しいBCDに変換する、とことらしいですね。下記の様な処理をします。 Wレジスターの下位4ビットが9より大きいか、DCビットが1なら、下位4ビットに6を足す。そうでなければ何もしない。 Wレジスターの上位4ビットが9より大きいか、Cビットが1なら、上位4ビットに6を足してCを1にセット。そうでなければ何もしない。 (※データシートを見る限り、変換時、下位ビットの桁溢れは上位ビットに影響しない様ですね。 データシートの例では、下記が書いてあります。 A5H なら、 下位バイトは 5なので、そのまま。上位バイトは Aなので、6を足して、10H ⇒ Cが1.結果、C=1、W=05H。(DCは0です) CEHなら、下位バイトは4、上位バイトは3で、C=1となります。(DCは何故か0) 質問者殿の例で、Wレジスタが55Hだったら、DAW実行後そのまま55Hになるはずです。 実験環境がもしあれば、いくつか数値を入れてみて、試してみると良いでしょう。 ご参考に。

papashiroSooke
質問者

お礼

早速ご回答をいただきまして、有難うございます。 自分の理解とは違うようなので、説明いただいたことをよく読んで勉強したいと思います。

関連するQ&A

  • PICの「SWAPF」の意味について

    PICを学びはじめたばかりの初学者です。混乱してしまい、バイト命令「SWAPF」の意味がわかりません。 質問1: 「SWAPF」という命令は「ファイルレジスタfの上位4ビットと下位4ビットを入替えた結果を(d)に入れる」と出ています。 http://homepage3.nifty.com/mitt/pic/pic42_1.html この「上位4ビットと下位4ビットを入替え」というのは例えば次のようにすることを言うのですか? ----------- (SWAPF前) 上位4ビット 下位4ビット △△△△   □□□□ (SWAPF後) 上位4ビット 下位4ビット □□□□   △△△△ ----------- 質問2: 質問1が正しいとしたら、次の記述の訳はどのようなことなのですか? こちらのページを拝見しますと、下記引用のようになっています。 http://www.picfun.com/arch09.html ----ここから引用-------------------- 【スワップ命令の使い方】 SWAP命令を有効に使う例は、下記のような場合です。 例1 割り込み時のレジスタの待避、復帰     SWAP命令がSTATUSに影響しないことを利用しています。 PUSH  MOVWF  W_TEMP    ;Wレジスタ待避     SWAPF  STATUS,W  ;STATUS取り出し     MOVWF  ST_TEMP   ;STATUS待避 ----ここまで引用-------------------- ↑この中の「;STATUS取り出し」のところですが、「SWAPF」を使って「上位4ビットと下位4ビットを入替え」てからでないとSTATUSのHとLを取り出すことが出来ないのでしょうか? 質問3: もし、 「SWAPF」を使って「上位4ビットと下位4ビットを入替え」てからでないとSTATUSのHとLを取り出すことが出来ない、 のだとしたら、それはPICの仕組み上のことなのでしょうか? 初学者の質問で馬鹿らしいかもしれません。ご解答が面倒で無い方がいらしたら、どうぞご教示よろしくお願いいたします。

  • PIC/SWAP命令でWregをrestore?

    先日こちらで「SWAPF命令」についてご教示いただきました。ありがとうございました。 その後、いつも学習させてもらっている下記のページにある「割り込み例」の記述で、わからないところがあって、再度お世話になります。超初学者の質問です、どうぞよろしくお願いいたします。 -----ここから引用(ただし各行先頭の番号と:は行数指示のため追加)---------------- 01:【例】WレジスタとSTATUSレジスタの待避と復旧 02: 03:(0004)番地 04:    GOTO   PUSH    ;割込みジャンプ 05:    | 06:    | 07:PUSH  MOVWF  W_TEMP    ;Wレジスタ待避 08:    SWAPF  STATUS,W  ;STATUS取り出し 09:    MOVWF  ST_TEMP   ;STATUS待避 10:    | 11:    |(割込み処理) 12:     | 13:    SWAPF  ST_TEMP,W  ;STATUSを戻す 14:    MOVWF  STATUS   ; 15:    SWAPF  W_TEMP,F  ;Wレジスタを戻す 16:    SWAPF  W_TEMP,W 17:    RETFIE       ;割込み許可リターン -----ここまで引用---------------- (http://www.picfun.com/pic08.html) 基礎知識の確認事項: PIC特有の問題として、 1:PICにはステータスレジスタを直接退避する命令が無く、一旦WREGにステータスレジスタの値を転送してからメモリに退避する必要が有る。 2:MOV命令でステータスレジスタをWREGに転送すると、ステータスレジスタの値が変化してしまう。 3:これらの理由でステータスをWREGに転送する際は、ステータスが変化しないSWAPF命令を使用する。 4:ところがSWAPF命令を使うと、移動しようとするデータの上位4ビットと下位4ビットが入れ替わってしまういわば「副作用」が現れる。 4:それで復帰する時にもSWAPF命令を使用して上下4ビットを元へ戻す。 (前回ご教示いただいたことをまとめると上記のようになりますね。) 質問1: 引用した記述で7行目の「PUSH」は単にラベルとして使用しているだけで、命令としてはPICには無いものですね?PUSH~POPは単語の意味として、AVRに限らず使用できる一般的な意味のある単語なのでしょうか? (補足) AVR命令セットのPDFがアップされています。 http://www.atmel.com/images/doc0856.pdf こちらの13ページををみますと、表の下から2~1段目にPUSH~POPがあります。 しかしPICではPUSH~POPが命令セットに見あたりません。 それでPUSH~POPがAVR専用の命令語だとわかりました。 でも引用したページでは「POP」を使っています。 質問2: 引用した記述の7行目でMOVWF命令を使ってWレジスタをsaveしています。 ところが15行目、16行目では1回ずつSWAPFを使い、合計2回のSWAPFを使っています。7行目でWレジスタをW_TEMPにsaveするときはSWAPFを使わないのに、どうしてrestoreするときはSWAPFを2回も使用するのでしょうか? (補足) 「合計2回のSWAPFを使う部分の機能」が上位~下位反転してしまったピットを戻す機能であることはわかります。 しかし、それであれば7行目でWレジスタをW_TEMPにsaveするときはSWAPFを使えば良いように考えたのですが、、、 それでrestoreするときにSWAPFを再び使用したら良いのでは?と、、、 基礎知識の確認事項2で「MOV命令でステータスレジスタをWREGに転送すると、ステータスレジスタの値が変化してしまう。」としました。 7行目で移動するのは割り込み直前の「Wreg」で「status register」ではないのに、それでも移動すると値が変化してしまうということでしょうか? 初学者の質問で馬鹿らしいかもしれません。 ご解答が面倒で無い方がいらしたら、どうぞご教示よろしくお願いいたします。

  • PICでのBCD変換について教えてください

    PIC初心者です。 PICと液晶表示器を使って車の電圧計(XX.Xで表示)を作ろうとおもっています。 AD変換して得た値(精度は求めていないので8ビット)をBCD変換して液晶表示器に送ればよいことはわかったのですが、肝心のBCD変換の概念?というか流れがよくわかりません。 いくつか参考になりそうなプログラムを見ました。ここでもQNo.4399051で同じような質問がありました。でも、たとえば、割って商に0x030を足すのはなぜなのか、理解できません。もしかして、アスキーコード表というものに合わせるためでしょうか? じっくりとプログラムを読めばよいことかもしれませんが、経験者の方よろしければ簡単にお教えください。よろしくおねがいいたします。

  • PIC16F88で500という数字を8ビット+2ビットのレジスタに設定

    PIC16F88で500という数字を8ビット+2ビットのレジスタに設定する方法を教えていただきたいです。 変数D1,D2,D3にそれぞれ、0,0,5 という500を意味する各桁の数字が入っているのですが、 これをPWMのDutyのレジスタに8ビット+2ビットで設定したいのですが、 どんな手順をとったら10ビットの2進数に変換できるでしょうか?

  • PICでのA/D変換

    現在PICについて勉強しています。 そこで基本的な質問なんですが、USARTを用いて非同期でデータを送る場合、スタートビットとストップビットは自動的につくのでしょうか?? またデータを送信する際、送信できるかどうかを判断するプログラムはどのようにしたらいいのでしょうか??TSRレジスタやTXREGレジスタのところがよくわかりません。 めちゃくちゃな質問かもしれませんが、もしよかったら回答のほうよろしくおねがいします。PICの言語はアセンブラでやってます。

  • PIC18F2550でのUSARTの使い方について

    フリーのC18コンパイラで電子工作をしています。 今回18F2550でシリアル通信に挑戦していますが、自分の目的の動作のためのレジスタ設定が理解できません。教えて下さい。 動作内容はPICからシリアル通信でデータを送り12ビットシリアル-パラレル変換の「NJU3714」でシリパラ変換させることです。PICのデータ受信は今のところしないつもりです。

  • PICでのAD変換について

    PIC16F873を使って、入力信号のAD変換をして、基準値との差により、PWM信号を生成しようとしています。 変換結果の上位8bitがADRESHレジスタに格納されるということなのですが、PWMの周波数を確保するため、できればこの8bitの値をを7bitに落としたいと考えています。 何か方法があれば教えてください。

  • PIC、TMR2とPWMについて。(再投稿)

    カテ違いなのか説明が悪いのか回答が付かなかったので 再投稿しました。 PWMでTMR2の10ビットの理屈がわかりません。 まず現状の理解ですが以下のとおりです。 ・分解能10ビットでPWMを使うにはPRxを255に設定する。  PRxに設定した値がTMR2のカウント最大値になる。  PRxを255に設定したのでTMR2も255までカウントされる。  (PRxに設定した値がPWMの周期として動作する最大値) ・パルスの幅はCCPRxL(上位8ビット)および、DCxB1,DCxB0(下位2ビット)の10ビットで設定する。 実際のPWMの動作は以下のとおり CCPRxL,DCxB1,DCxB0 の10ビット ↓コピー CCPRxH(10ビット) ↓比較 一致でPWMの出力が反転 TMR2(上位8ビット + 謎の下位2ビット) ↑比較 一致でTMR2 + 謎の下位2ビットがクリア PRx(8ビット) わからないぶぶんなんですが 1、TMR2の下位2ビットって具体的にどのレジスタなんでしょうか。 2、プリスケーラを設定しない場合(等倍)はPSという2ビットが付加されTMR2は10ビットカウンタとして 動作するとなっていましたが、0,1,2,...1023までカウントされるんでしょうか。 3、TxCKPS1,TxCKPS0 に値をセットしてプリスケーラを4,8,64等にした場合 TMR2の8ビットと下位2ビットはどういう関係になるんでしょうか。 単純に1024階調(0-1023) * 4tocs * プリスケール値 で0から1023までカウントされると考えていいんでしょうか。 4、PRxは8ビットしかないのにTMR2 + 2ビットの10ビットとどうやって比較されてるんでしょうか。 たとえばDCxB1,DCxB0(下位2ビット) のみ設定してCCPRxL(上位8ビット)を0にした場合、何と比較されるんでしょうか。 5、TMR2をスタートする前にカウンタをリセットしますが10ビット分リセットするにはTMR2のクリアと下位2ビットはどのレジスタをクリアすればいいんでしょうか。 PICは16F1936を使ってます。 MPLAB X + XC8で開発してます。 説明がわかりずらいかもしれませんが上記の部分がいまいち理解できません。 この辺の事に詳しい方、教えていただけると助かります。

  • ビットリバース

    PICからバイナリーデータを抽出したのですが、ビットリバースという作業を行われているようで、変換をしないといけません。 このビットリバースとはどういった作業を行うのでしょうか。 11 AA 22 というバイナリデータの場合、ビットリバースするとどうなるのでしょうか。 00110000→00001100 という作業でしょうか。

  • PIC 自作プログラムライタ Read機能追加

    PIC16F877を使用しています ブートローダをPICライタ(市販)で書込み、 現在自作のプログラムライタに装着し、 PC側のプログラム(自作)からユーザコードを書き込めるところまで完成しました。 現在 ユーザコードをReadする機能を追加しようとしているのですが、 読み込んだところ、コンフィグレーションビットが元の書き込んだHexファイルとは 違う数値が返ってきてしまいます。 ブートコードの仕様書を見たところ、 「ブートコードからコンフィグレーションレジスタにはアクセスできません」 と書いてありました。 もし、この場合 Readしようとしたら どんなビット列が返ってくるのが正しいのでしょうか? どなたかご教示いただけませんでしょうか、お願いします。

専門家に質問してみよう