楽々PIC

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

ジャンプ

18F: テーブル・ジャンプ

「テーブル・ジャンプ」 や 「ジャンプ・テーブル」と言った検索をして来てくれる方がいらっしゃいます。

RRP1320-1-02-1 , RRP1320-1-03-1 , RRP1320-1-04-1 では、赤外線リモコンの受信コードに応じて16個、登録外コード受信時に1個の合計17個のサブルーチンをコールします。 中間コードを比較しながら分岐命令を連ねて受信コード毎の分岐を実現していましたが、ジャンプ・テーブルを使った方法を試してみました。 <PICデバイス=18F1320> 今後アップロードするプロジェクトから適用します。

PIC18F のテーブル・ジャンプは PCLATU , PCLATH にジャンプ先のアドレス上位、中位を準備して、PCL に下位を書くことで実現します。 下図はテーブル・ジャンプを使っているアセンブラ・ソースで、ircchk5 に実行を移す時点で ircode に 1~16(10進数) の値が入っています。

初めに PCLATU , PCLATH , ircd3(私設ワーク) にジャンプ・テーブルの先頭アドレス( ircchk51 )を準備して、( ircode - 1 )を2倍した値を加算することで、目的のジャンプ・アドレスを完成させます。

Jump_Table

最後に PCL に下位アドレス( ircd3 )を書き込んでジャンプ・テーブル内にジャンプします。 初め PCL への転送に MOVFF を使いましたが、アセンブラーがエラーを返して MOVFF は使えないと教えてくれました。 MOVWF なら問題なく BUILD SUCCEEDED です。

連番に基づく分岐処理の他、ジャンプ先のアドレスをデータ・メモリーに書いてジャンプ先を制御したいと言った時に使います。 PICではデータ・メモリーにジャンプ命令を書いて実行させることは出来ませんが、フック( HOOK )同様の動作が可能です。


以下は 18F ニーモニックと小技のインデックスにします。
以前の関連記事インデックスは とにかくビルド! です。


18F: DECF とボロー 
 減算タイマーの処理で DECF を使っていますが、2byte 以上のデータを扱うとボロー(桁下がり)の処理が必須にです。 引き算 SUBWF では上位 byte の引き算に SUBFWB を使ってボロー(Cの反転)を引き算しますが、DECF でも同様にキャリーフラグが動作するのか調べてみました。

18F: BCD 
 BCD ( Binary-coded decimal )は二進化十進数と呼ばれ、10進数を2進数( 4bit )で表現します。 何と言っても慣れ親しんだ10進数を扱う為に必須の手法です。


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



ジャンプ命令の使い分け

 記事「数を数える」で BRA と言う命令について別の記事で説明すると書きました。 BRA を含むジャンプ命令について説明します。 <PICデバイス=18F1320>

ジャンプ命令やサブルーチンコールは、ジャンプ先の範囲、ジャンプの条件、ワード数、によって分類して使い分けるのが良いと思います。

ワード数    命令                ジャンプ先(n)の範囲        ジャンプの条件等
--------------------------------------
                  BC         n
                  BN         n 
                  BNN      n  
      1          BNOV   n          -128以上+127以下         条件成立時に極近傍にジャンプ
                  BNZ       n  
                  BOV      n
                  BZ         n 
--------------------------------------
      1         BRA       n        -1024以上+1023以下     無条件に近傍にジャンプ
                 RCALL  n                                                   無条件に近傍のサブルーチンコール
--------------------------------------
      2         CALL     k                全領域                       無条件にサブルーチンコール
                 GOTO    k                                                   無条件にジャンプ
--------------------------------------

以下の命令は条件成立時にスキップする命令ですが、ジャンプ先固定の条件ジャンプと考えることが出来ると思います。 (ニーモニックだけ列記します。)

CPFSEQ  ,  CPFSGT  ,  CPFSLT  ,  DECFSZ  ,  DCFSNZ  ,  INCFSZ  ,  INFSNZ  ,
TSTFSZ  ,  BTFSC  ,  BTFSS 


今のところ、このブログでは一つのソースファイルにプログラムを書いていますが、プログラムの機能毎にソースファイルを分けるのが一般的ですし、当ブログでもPICデバイスに実装するプログラムはファイルを切り分けて紹介する予定です。 機能ごとにファイルを切り分けられた小さなソースリストの方が、必要な部分に集中して作業を進められて作業が楽になります。 一方で一つのソースファイルを変更した結果、他のプログラムの機能に影響を与えないように簡単な工夫をする必要があります。 効率良くプログラムを書く為に、基本的には次のように考えています。


<<< 全領域 のジャンプとコール >>>
どこでも安心して使えますが、2ワードを要することから近傍へのジャンプには使わないように工夫します。 具体的には他のソースファイル(のラベル)にジャンプしたりサブルーチンコールする場合に使います。

<<< -1024以上+1023以下 のジャンプとコール >>>
1kワードと広い範囲をカバーしますが、プログラムを書き進むうちに間にあるプログラムサイズが増大して、突然ジャンプ可能な範囲を超えてしまうかも知れません。 念の為にも一つのソースファイルの中で使うようにします。

<<< -128以上+127以下 のジャンプ >>>
一つのソースファイルの中で使うのが原則だと思います。 隣接のラベルなど狭い範囲にジャンプするように心がけます。


例として「間接アドレッシング」に示したソースリストの中にある BZ 命令を GOTO に変えてみます。
Block3

上図の30,31行目は (reg0)の値が0なら hotz にジャンプするプログラムですが、プログラムを書いているうちに hotz の相対距離が大きくなって +127ワードを超えないとも限りません。 GOTO 命令を使えば安心です。

30、31行目をコメントアウトして、直後に下図のように5行(内2行はコメント行)を挿入しました。

BZ-GOTO

BRA  $+2*3  で、$は現在のプログラムカウンター値を意味します。 GOTO命令が2ワードなので、BRAと合わせて+3ワードにジャンプすると、37行目の MOVLW を実行すると言う訳です。


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


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



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


アーカイブ
楽々PIC 宛てBlogMail


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

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

    Atsuhiro Imai

    バナーを作成


    プロフィール

    jyosou_robot

    • ライブドアブログ