楽々PIC

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

ソース

ディジタル温度センサー3

DS18B20+ で温度測定をする為に「ディジタル温度センサー2」で紹介したように1秒間を超える手続き(ポート入出力)が必要です。 この間も温度制御や赤外線リモコン受信を並行して進める為に、可能な限り割り込み処理で必要な手続きを進める必要があります。

1-Wire バス・プロトコルは少々面倒な部分がありますが、今回の目的を実現する分には予め決まっているタイミングで以下4種類の処理を組み合わせて淡々と進めるだけで、複雑な分岐処理はありません。

1. ポートに Low を出力
2. ポートに High を出力
3. ポートを入力ポートに設定
4. ポートの値をサンプリング

RRP1320-1-04-2 の温度センサーを DS18B20 に置き換える為、他の処理(例: 赤外線リモコン受信)よりもシビアなタイミング管理が必要な 1-Wire バス・プロトコル用に、高位割り込みに設定した TIMER3 割り込みを使うことにしました。
DS18B20 は RB0 に接続し、RB0 について先の4種類の処理を行います。 クロックは内臓 8MHz のままです。

タイミングがシビアなので、割り込み発生の都度分岐するのではなくて、割り込み直後に前述4種類の内(予め決められた)いずれか一つの処理を行い、次のタイミング(割り込み)に備えて TIMER3 を設定し、次回割り込み時に実行するプログラムを指定(予約)することにしました。

TIMER3 割り込みの都度指定されたプログラムを実行する為に、フック( HOOK )を使っています。 データ・メモリーとプログラム・メモリーが分かれている PIC の場合はフックと呼べないかも知れませんが、TIMER3 割り込み処理の先頭で所定のデータ・メモリー( 3byte )を参照して指定(予約)されたアドレスにジャンプします。

下図は、TIMER3 割り込みを処理する高位割り込みプログラムのアセンブラ・ソースです。

inthigh-0

割り込みフラグをクリアして直ぐに、データ・メモリーに指定(予約)されたアドレスにジャンプしています。(10~13行目)

下図はジャンプ先の一例で、リセットパルスの後でデバイスの存在パルスをサンプリングするプログラムです。 ディジタル温度センサー2 に示したタイミング図の内、リセット・パルスの丸囲みSに相当するタイミングで実行されます。

inthigh-2

44行目でサンプリングを行い、結果を dsstf < 1 > に反映させるとすぐに次の割り込みタイミングを規定する為に(予め準備された) TIMER3 を設定しています。(46,47行目)

続いて、次の割り込み時に次々回の割り込みタイミングを規定する TIMER3 の設定値を準備し、次回割り込み時のフックアドレスを指定(予約)します。 続く書き込み(送信)処理に必要なワークの準備を済ませて、最初の図の15行目にジャンプしています。
67行目に RETFIE  FAST と書いても良いのですが、フックを使うと解り難いソースになる為、少しでも読みやすくする工夫のつもりです。

関連記事のインデックスは右記事の末尾にあります。 → ディジタル温度センサー


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





温度センサー5 テーブル参照

 「温度センサー4」の続きです。 今回は、A/D変換結果を元にデータテーブルを参照してLCDに温度を表示します。 <PICデバイス=18F1320> 温度センサーはNational Semiconductor 製 LM60 で、AN4に接続しています。

下図は、データテーブル参照を行い、LCD に表示する為に仮想 V-RAM に ASCII コードを転送するサブルーチンのアセンブラ・ソース( scan.asm の一部)です。 メイン処理から500msec間隔でサブルーチン・コールされます。

他のメイン処理プログラム(RCサーボ用)が先に使っている為、サブルーチンの最初と最後にテーブル・アクセス用のアドレス・ポインター ( TBLPTRU , TBLPTRH , TBLPTRL ) の退避と復旧を行っていますが、他で使っていなければ退避と復旧は不要です。

23~28行目でテーブル・アクセス用のアドレス・ポインターを「温度センサー4」で紹介したデータ・テーブルの先頭に指定します。 A/D変換結果の下位 8bit とデータテーブルのレコード長( 4byte )を掛け算した値を加えて、読み出すべきデータの先頭にアドレス・ポインターを移します。

scan_tmpslcd

39~44行目でLCDの3行目に相当する仮想 V-RAM に、温度を示す ASCII コード 3byte を並べて、終了です。 LCDに転送する作業は「LCDに自動転送」で紹介したプログラムが担当してくれます。

以上で、温度センサーの説明を終わります。


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


温度センサー関連記事のインデックスはこちら → 温度センサー 


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



RCサーボ3

 「RCサーボ2」の続きです。 前回説明したように、TIMER3 の割込み処理によって自動的にRCサーボの制御信号が送り続けられています。 今回は0.5秒間隔のイベントタイマーとメイン処理で制御角度を変更してクマさんの動きを作ります。 < PICデバイス=PIC18F1320 >

制御角度を規程するワークの値を0.5秒間隔で書き換えてクマさんの動きを作ります。 ワークに送られるデータ・テーブルはプログラム・メモリー上にあって、下図の様に4byte x 10行です。 -60度、±0度、+60度と言う3つの値(TIMER3 のカウンター設定値)が並んでいるだけです。

rsctbl1


メイン処理で書き換えるワークはデータ・メモリー上にあって、下図の内11行目~14行目の4byteです。


rsc_symbol


TIMER0にで作った0.5秒間隔で4byteのデータを転送する書き換え処理を繰り返すことで実現し、4byte転送10回毎に転送元(プログラム・メモリー側)アドレスを rcstbl1 に戻します。 下図は転送元アドレス設定を行うアセンブラ・ソースです。


rcs_block_t_1

転送先のアドレスは、転送処理の先頭で rcs0hth に設定し、下図のように 4byte をブロック転送します。
73行目の TBLRD *+ で転送元から TABLAT にデータを読み出して転送元アドレスを+1し、74行目の MOVFF TABLAT,POSTINC0 で TABLAT の値を転送先データ・メモリーに書き込んで転送先アドレスを+1しています。 これを4回繰り返して転送を完了します。

rcs_block_t_2

クマさんの軽快な動きは以上のソースで実現していますが、もっとゆっくりとした繊細な動きをさせる場合は問題が予想されます。

4byteブロック転送の最中にTIMER3割り込みが発生すると 16bit データの上位と下位が同期しないままRCサーボ制御信号を作り出す可能性があります。 ワークを2つ準備して、TIMER3 割込み処理が書き換え中のワークを参照しないようにすると言った対策が有効ですが、今回の様にラフな制御であればこのまま使えます。


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


RCサーボ関連記事のインデックスはこちらです。 → RCサーボ


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




RCサーボ2

 「RCサーボ」の続きです。 今回はTIMER3のオーバーフローで発生する高位割込み処理です。 ポート出力を切り替え、データ・メモリー上に予め準備されたデータをTIMER3に設定して割込み処理を抜けることで、RCサーボ制御信号を作り出します。 < PICデバイス=PIC18F1320 >

RCサーボ信号の出力端子は RB2 を使います。 データ・メモリーは下図の 5byte を使いますが、10行目の rcscnt は2個以上のRCサーボを使う時用で今回は利用しません。 他は制御信号が High 及び Low の間の TIMER3 設定値で、各々2byte 必要です。 この 4byte をメイン処理で書き換えるだけで、RCサーボの制御角を変化させることが出来ます。

rsc_symbol

下図は、TIMER3で動作する高位割込み処理のアセンブラ・ソースです。 これまでに紹介してきた汎用イベントタイマー( TIMER0 )とLCD用のタイマー( TIMER2 )は低割り込みを使っています。 高位割り込みは、低位割込み処理中にも発生しますから、TIMER3 を高位割込みに設定することで、他の割込み処理時間の影響を無くする狙いです。

inthigh_asm

今のところ、高位割込みは TIMER3 でしか発生しませんから、割込み要因による分岐はありません。 割込みフラグをクリアして、RB2の値を調べて分岐します。 分岐先ではRB2 の状態を切り替えて TIMER3 のカウンター値を書き換えた後に割込み処理を抜けます。

ここで注意したいのは TIMER3 のカウンター値変更の際には必ず上位8bitを先に設定することです。 TMR3H の値は、TMR3Lを書き換えた時に16bit同時に更新される仕組みに成っているからです。

下図は TIMER3 の初期設定を行っているアセンブラ・ソースです。 必要な設定と共にTIMER3を動作させ、最初の図に示したワークを初期化して、TIMER3 を高位割込みに設定後、割込み許可しています。

timer3_def

以上のプログラムで、既にRCサーボを制御しています。 MPLABのデバッカーで Run の後で一旦 Halt して最初の図の時間設定値(4byte)を書き換えて再び Run すればRCサーボの停止位置が変化するはずです。

RCサーボの割込み処理についての説明を終わります。

RCサーボ関連記事のインデックスはこちらです。 → RCサーボ


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








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


アーカイブ
楽々PIC 宛てBlogMail


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

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

    Atsuhiro Imai

    バナーを作成


    プロフィール

    jyosou_robot

    • ライブドアブログ