楽々PIC

水田除草と言うブログを書いていますが、PIC関連の記事が意外に人気で驚いています。 PICを使った電子工作に興味を持つ方が多いことを知って、一緒にPICを学ぶブログを作りたいと思いました。 「楽々PIC」は教材と言うよりも少し実用性?のある楽しい道具を作りながら学ぶブログを目指します。

キャリー

18F: DECF とボロー

RRP1320-1-03 は減算タイマーの処理で DECF を使っていますが、2byte 以上のデータを扱うとボロー(桁下がり)の処理が必須にです。 引き算 SUBWF では上位 byte の引き算に SUBFWB を使ってボロー(Cの反転)を引き算しますが、DECF でも同様にキャリーフラグが動作するのか調べてみましたが納得できる資料が見当たらないので実験で確かめることにしました。 <PICデバイス=18F1320>


下図をソースに書き足し、行番号の右隣で灰色の部分をダブルクリックして、ブレークポイントを設定します。

DECF_Break


Run して、ブレークポイントで止まった所で、下図のように Watch ウィンドウで DECF 後の値と、STATUS レジスターの中を表示させます。

DECF_Break_STATUS


プログラムを書き換えて DECF 処理前の値毎に記録したのが下表です。 ついでですから、N , OV , Z , DC , C と言った全てのステータスフラグについて記録しました。

 N     演算結果が負を示すネガティブフラグ
 OV  符号付き演算のオーバーフローフラグ(7bit を超えると1)
 Z     演算結果が0を示すゼロフラグ
 DC  演算結果が下位 4bit からのオーバーフローを示すデジットキャリーフラグ
 C     演算結果が 8bit からのオーバーフローを示すキャリーフラグ

DECF_結果

やはり、DECF 直後にキャリーフラグの反転をボローとして扱えるようです。 DC の反転も上位 4bit からのボローとして機能しています。 何ごとも自分で確かめれば自信を持って先に進めます。


18F ニーモニックと小技のインデックスはこちら → 18F: テーブル・ジャンプ 


楽々PIC」は楽しい道具を作りながら学ぶブログを目指します。






13bit 加算・減算

 「加算・減算」と言う記事で、1byteデータの加算を例示していますが、今回は 13bit 以下のデータ同士の加算と減算です。 コーディング中の赤外線リモコン受信プログラムの一部アセンブラ・ソースで説明します。 <PICデバイス=18F1320>

下図のコメントに 16bit とありますが、197~202行目の加算処理ではオーバーフローの可能性があることに注意が必要です。 赤外線リモコン受信プログラムの中で下図が扱うデータは 13bit 長以下のためこのまま使います。 また181~186行目で入力値の大小比較に基づく分岐を行って、減算時結果が負にならない設計です。 デバックの結果、下図の大小比較には不充分な点があります。 加算・減算部のみ参考にして下さい。 (08/20日追記)

13bits_add_sub

プログラムは、入力値( shiftwh , shifutwl , irtoldh , irtoldl , irtim0h , irtim0l )を破壊することなく出力先( irtdth , irtdtl )に演算結果を記録します。
なお、前述ラベル名の末尾 h , l はそれぞれ上位、下位を示します。

加算・減算共に下位から演算を初め、下位同士の演算ではキャリーまたはボローを含まない命令を使います。 続く上位同士の演算ではキャリーまたはボローを演算に含めます。 16bit 長を超える値同士の演算も同様に、最下位の演算だけはキャリーまたはボローを含まず、他はキャリーまたはボローを含む命令を使います。


一連の記事のインデックスは 「とにかくビルド!」の末尾をご覧下さい。


楽々PIC」は楽しい道具を作りながら学ぶブログを目指します。





加算・減算

 加算と減算について簡単に説明します。 <PICデバイス=18F1320> 数値を扱う用途では当然ながら使用頻度の高い命令です。 「データ・メモリーf」を単に f と書くことがあります。

          ADDWF         f , d , a     ; データ・メモリー f の値に W の値を加えて W または f に記録
          ADDLW         k               ; W の値に、値 k を加えて W に記録
          ADDWFC      f , d , a     ;  f の値に W の値とキャリーを加えて W または f に記録

          SUBWF         f , d , a     ; データ・メモリー f の値から W の値を減じて W または f に記録
          SUBLW         k               ; 値 k から W の値を減じて W に記録
         SUBWFB      f , d , a     ;  f の値から W の値とボローを減じて W または f に記録
          SUBFWB      f , d , a     ;  W の値から f の値とボローを減じて W または f に記録
                                                    ボローはキャリーの反転

キャリーやボローは8bit長を超えるデータを扱う時に使います。

簡単な例で試してみます。 main2.asm の一部を書き換えます。

add

上図で、48行目追加、51行目コメントアウト、52,53行目を追加しています。

ラベル hot2 で始まるループでデータを転送する際に、転送元の値に30Hを加えて転送先に書いています。

間接アドレッシングからダウンロードした main2.asm をビルドして、データ・メモリーの0番地(reg0)の値を08Hに変更し、 Run & Halt してから上の変更を行って再度ビルドして Run & Halt した結果( File Registers ウィンドウ )を下図に示します。

add1

転送先に加える値を変えて試す場合は、先のソース48行目の値を変更してビルドです。 53行目、ADDWFの代わりにADDLWを使ってみるのも面白そうです。

8bit 長を超える値の加算・減算は「13bit 加算・減算」を参考にして下さい。


加減算の他に次のような論理演算もありますが、実際に使う場面で説明した方が良いように思います。  ここではニーモニックだけ列記します。

ANDWF  ,  COMF  ,  IORWF ,  NEGF  ,  XORWF  ,  ANDLW  ,  IORLW  ,  XORLW


一連の記事のインデックスは 「とにかくビルド!」の末尾をご覧下さい。


楽々PIC」は楽しい道具を作りながら学ぶブログを目指します。



ダウンロードコーナー
記事検索
アンケートに御協力下さい


アーカイブ
楽々PIC 宛てBlogMail


--- ご了承下さい ---

注意して記事を書いていますが、記事及びリンク先の情報による不利益について、一切責任を負い(負え)ません。
QRコード
QRコード
アクセスカウンター

    Atsuhiro Imai

    バナーを作成


    プロフィール

    jyosou_robot

    • ライブドアブログ