楽々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」は楽しい道具を作りながら学ぶブログを目指します。



USB CDC BDT

 今回はバッファ・ディスクリプタ・テーブル(BDT)について説明します。 <PICデバイス=18F2550> ターゲットは秋月電子通商さんの USBマイコンボード 完成品(PIC18F2550) +α の RRP2550-0 です。

USBは「ホスト(PC)」と「PIC内部のエンドポイント」の間で通信を行い、PICマイコンはエンドポイントの内容を読み書きすることでホストとの通信を実現すると考えて良さそうです。 エンドポイントは最大で16組み(送信用と受信用)準備することが出来ますが、CDCではコントロール転送( EP0 )用を含めて3組みが必須のようです。

データ・メモリーの一部( 400H ~ 4FFH )には、各エンドポイント毎に位置やサイズ、そして各エンドポイントのステータスを読み書きするバッファ・ディスクリプタ・テーブル(BDT)があります。 各エンドポイント毎に以下 4byte で構成され、全てのエンドポイントをピンポンバッファ(ダブルバッファ)構成とした場合には最大で64エンドポイント(16 x 2 x 2)になります。

今回は、ピンポンバッファを使わず、コントロール通信( 8byte )、インタラプト通信( 8byte )、バルク転送( 64byte )を準備しました。 使わないエンドポイントにも位置とサイズの情報を準備して16組( 32個 )の初期値は下図の通りです。 (コメント末尾 *  は今回使わないエンドポイントです。)

bdt_usb_tbl

4byte 構成のBDTの内、後半2byteはバッファの先頭アドレスを示し、初期設定をすればアクセスする必要の無いものですが、1byte 目(BDステータス)と 2byte 目(サイズ)は通信の都度再設定を要する場合があります。
特に 1byte 目はチョット複雑で重要な役割を担う主役と言えそうです。

BDTで指定する各エンドポイントのバッファは、データ・メモリーの 500H ~ 7FFH に配置するように設定します。 このメモリー空間の内、バッファとして使わない領域は自由に使って問題無いようです。


USB関連記事のインデックスは右記事の末尾にあります。→ USB CDC 


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




音声合成LSI 9 データテーブル

 「音声合成LSI 8 発声終了」の続きです。 今回は「音声合成LSI 7 発声開始」 、 「音声合成LSI 5 データ送信」で紹介したプログラムが参照しているデータテーブルについて説明します。 <PICデバイス=18F1320> 音声合成LSI は、株式会社アクエスト製 AquesTalk pico  ATP3011F4-PU です。

以下はデータテーブルを定義しているアセンブラ・ソース( rcs_tbl.asm の一部)です。

下から説明しますが、315行目( iricdb )からが、赤外線リモコンで受信した各データコード(受信順 3byte 目)のテーブルです。
293行目から始まる、talk000 , talk001 ・・・ talk009 は音声フレーズ・データで、必ず 0DH で終わります。 talk006 , talk007 は2種類のチャイム音を指定しています。
281行目からは talkdb は各音声フレーズ・データの先頭アドレスをテーブルにしたものです。 1レコード 3byte ですが、1ワード( 2byte )の区切りを揃えるために 00H が挿入されてプログラム・メモリーには1レコード 4byte で配置されます。 データテーブルをビルドしたら、プログラム・メモリーをダンプして確認した上でプログラムを書く方が安全です。

talkdb_rcs_tbl

以上で、音声合成LSI 関連の説明を終わります。


以下で、一連の記事で紹介したソース・ファイル(プロジェクト)をダウンロード出来ます。
LHA書庫です。
 http://jyosou-robot.livedoor.biz/pic/RRP1320-0/RRP1320-0-6.lzh


音声合成LSI 関連記事のインデックスはこちら → 音声合成LSI 


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





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


アーカイブ
楽々PIC 宛てBlogMail


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

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

    Atsuhiro Imai

    バナーを作成


    プロフィール

    jyosou_robot

    • ライブドアブログ