楽々PIC

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

18F

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



一休み; アンケートに御協力下さい

楽々PICをご覧頂き誠にありがとうございます。

お急ぎのところ恐縮ですが、アンケートのお願いです。

画面右側の中ほどにあるブログパーツを使って、貴方とPIC(18Fシリーズ)との関わりや PICkit3 活用のご意向など気軽にお答え頂ければ幸いです。

アンケート

私自身PICの経験が浅いので、期待に応えられるか解りませんが、PIC18Fを中心に質問や御困りの点などありましたら適当な記事にコメントを付けてみて下さい。 私でも解るものについてはコメントまたは別途記事で応援したいと思います。 他の方からの回答コメントやトラックバックも大歓迎です。

ただし、PICや当ブログに関係の無い(と判断した)コメント/TBは公開せずに削除します。

これからも 楽々PIC を宜しくお願い申し上げます。


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



EEPROM 読み書き

 「EEPROM 初期設定」で紹介し通り、内臓 EEPROMに初期値を書き込む時にはアセンブラの疑似命令 DE を使うのが便利です。 一方で、処理中の定数をEEPROMに保存して、再起動時に活用するような場合は EEPROM にを読み書きするプログラムが必要になります。

下図はプログラム・メモリー上にある 20byte のデータ列を EEPROM に書き込んでいます。 リセット直後の初期化処理用に作った為、1byte 書き込みの都度完了を待つ間(数msec)は他に何もせずにループしています。 リアルタイム処理を行いながら書き込む場合は割り込みを使う必要がありますが、ここでは動作確認済みの読み書き手続きを説明することを目的にします。 <PICデバイス=18F1320>

EEPROM に書き込む手順は以下の通りです
 (1) EEADR にアドレスを書き込む
 (2) EEDATA にデータを書き込む
 (3) アクセス先として EEPROM を選択 ( BCF  EECON1 , EEPGD )
 (4) 書き込み許可指示 ( BSF  EECON1 , WREN )
 (5) 書き込みシーケンス1として EECON2 に値 055H を書き込む
 (6) 書き込みシーケンス2として EEOCN2 に値 0AAH を書き込む
 (7) 書き込み指示 ( BSF  EECON1 , WR )
 (8) 書き込み完了待ち EECON1 <WR> が 0 になるまで待つ
    (あるいは完了割り込み処理を作成)
 (9) 書き込み禁止指示 ( BCF  EECON1 , WREN )

連続して 2byte 以上を書き込む場合は、1byte 目に(3)~(4)を実行して 2byte 目では省略しても問題ないようです。 念の為、下図の通り EEPROM アクセスの最初に BCF  EECON1 , CFGS も実行し、誤ってコンフィグレーションビットにアクセスしないようにしています。

EEPROM書き込み


下図は、正しく書き込めたか確かめるべリファイ処理です。

EEPROM を読み出す処理は以下の通りです。
 (1) EEADR にアドレスを書き込む
 (2) アクセス先として EEPROM を選択 ( BCF  EECON1 , EEPGD )
 (3) 書き込み指示 ( BSF  EECON1 , RD )
 (4) EEDATA からデータを読み出す

読み出し時には完了待ちや割り込み処理は不要で、(3)の後すぐに読み出せます。
連続して 2byte 以上の読み出しを行う場合の(2)は、前述書き込み時と同様の扱いです。

EEPROMべリファイ

以上のようにプログラムで書き込んだ内臓 EEPROM の内容は MPLAB の EEPROM ウィンドウに反映されない点に注意が必要です。 ブレークポイントを設定し、プログラムを止めて EEDATA の内容を見るなどデバックに手間がかかります。 最終的には EEPROM から読み出した値をデータ・メモリーに書き出して確認しました。

今回は、上図のプログラムはいずれも不採用にしましたが、近いうちに赤外線リモコンを使ってプログラム定数を変更する場面で EEPROM の読み書きが必要になると思います。 その時には EEPROM 割り込みを使ったプログラムを紹介したいと思います。


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



EEPROM 初期設定

 RRP1320-1-02 では予め内臓 EEPROM に記録した赤外線リモコンの受信コードを元に、押されたボタンを特定して所定のサブルーチンを CALL します。 EEPROM に初期値を書き込む方法について説明してみます。  <PICデバイス=18F1320>

EEPROM に初期設定を書き込む際には、下図のようにアセンブラの DE 疑似命令を使います。 プログラム・メモリーにテーブルを準備する時に使う DB 疑似命令と同様に使えるようです。

EEPROM_DE

ORG 疑似命令で先頭を指定して、DE 疑似命令を並べます。 PIC18F シリーズでは 0F00000H ~ 0F000FFH の 256byte を指定します。 上図のように指定した結果は、EEPROM ウィンドウでも確認できます。

PICkit3 をプログラマーに設定して PIC に書き込む際には、Programmer → Settings で表示される PICkit3 Settings ウィンドウの Program Memory タグにある Memories EEPROM にチェックが入っていることを確認する必要があります。

Programmer_Settings


DE 疑似命令を使うと下図の通り、自動的にチェックが入るようです。

Program_Memory

初めは DE 疑似命令を知らずに、プログラム・メモリーに DB 疑似命令でテーブルを準備して、自前のプログラムで EEPROM に転送していたのですが、一般的でない上に EEPROM ウィンドウに反映されない為、DE 疑似命令による初期設定に変更しました。

EEPROM に転送するプログラムは書き込みとべリファイの為の読み出しを行うものですが、動作中にEEPROMを書き換える時に応用できると思いますので、別の記事「EEPROM 読み書き」で動作確認済みソースを紹介しています。


赤外線リモコン受信の関連記事インデックスはこちら → 「赤外線リモコン受信


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


PWM 4 回路図

 「PWM 3 速度変更」の続きです。 今回は、回路図とノイズ対策の話を書いてPWM関連記事を終わります。 <PICデバイス=18F1320> PWM制御対象はマブチモーター RE-140RA ( FET 2SK2232 でドライブ)です。

PWM関連の実験を終えた、RRP1320-0-7 の回路図は下図の通りです。 図をクリックして別ウィンドウで見ると、定数等も確認出来ると思います。 「音声合成LSI 2」で紹介した通り、回路変更(CPU端子の割り付け変更)を行っています。 RRP1320-0-5 以前のプロジェクトを試す場合はご注意ください。

RRP1320-0-7_circuit


FET のゲート抵抗漏れを修正しました。 2012/09/20日
LCDコントラスト調整用ボリューム配線の誤記を修正しました。 20012/09/21日

なお、この記事からダウンロード出来る、RRP1320-0-7 は、これまで紹介した全ての機能( LED点滅LCDに自動転送RCサーボ赤外線リモコン受信温度センサー音声合成LSIPWM)を含みます。


今回は、モーターのブラシとコミュテータ間で発声するノイズ対策について紹介します。 購入したままのマブチモーター(RE-140RA )を接続して動作確認するとノイズの影響で回路動作が不安定になります。 目に見える症状は以下の通りです。

(1) 赤外線リモコン受信は休みなくノイズを受信します。
(2) LCDが予定外の表示をすることもあります。
(3) PICkit3 が Failed to get PC. と言うメッセージを表示して Run 出来なくなる。
    パソコンと同期が取れなくなったと言うエラーです。
(4) Release 版をプログラムして PICkit3 を切り離しても同様(かえって悪い)です。
    頻繁にリセットするようです。

モーターの端子とケースの間にコンデンサを入れるのが一般的な対策ですが、先にモーターの電源を別電源にしました。 それぞれに異なるACアダプターで給電しても効果なし、モーター側を乾電池にしても変りません。

とうとう、モーターの端子とケース間をセラミックコンデンサー(103 0.01uF )で接続したところ、すっかり安定しています。 赤外線リモコンも安定しています。(モーター無しでも稀にノイズ受信していましたから同程度です。)

DSC00118

2本のリード線とケース間に、各々上図のようにコンデンサーを半田付けします。

DCモーターのノイズ対策は、コンデンサーを付けることが先決ですね。


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


PWM 関連記事のインデックスはこちら → PWM 


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



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


アーカイブ
楽々PIC 宛てBlogMail


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

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

    Atsuhiro Imai

    バナーを作成


    プロフィール

    jyosou_robot

    • ライブドアブログ