楽々PIC

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

シミュレーター 5

 シミュレーター 3 に続いて、MPLABがアセンブルした結果、プログラム・メモリーに書いた様子を見ながら、「main.asm 簡単な説明」に書いたアセンブラーの動きを確認してみます。 

[View]→[Program Memory] を選択します。

program_memory


Run の後で Halt したことで、プログラム・カウンターが 0104H になっています。
0100H番地から0106H番地までがFFFFHとは異なる値が書き込まれていて、値の右側にディスアセンブルした結果が表示されています。

program_memory1


上にスクロールすると、0000H番地から0002H番地までがFFFFHと異なっています。

program_memory2

書きかえられた値を逆アセンブルしたものと、ソース・プログラムを見比べてみると、「PICに対して何かを指示するプログラムをプログラム・メモリーに書くように」と指示された内容と一致すると思います。

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


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



main.asm 簡単な説明

 「シミュレーター 2」からダウンロードできるソースファイル(main.asm)について簡単に説明します。

main_asm01

; (セミコロン)で始まり、改行で終わる部分はコメントです。 PICの動作には何ら関係がなく、人の理解を助ける為に使います。 コメントの中には日本語が使えます。

3行目(#INCLUDE <P18F2320.INC>)はアセンブラーに対して、MPLABの標準ヘッダーファイルを指定(インクルード)するように指示しています。 標準ヘッダーファイルはPICデバイス毎に準備されていて、[Microchip]ディレクトリーの下の[MPASM Suite]フォルダーにあります。 拡張子 .inc が全て標準ヘッダーファイルです。
標準ヘッダーファイルをインクルードしない場合は、SFRなど全てのラベルを自分で定義する必要が生じます。 余程特殊な目的でない限り標準ヘッダーファイルの指定が得策だと思います。

11~12行目でアセンブラーに対して自前のラベル定義を指示しています。 000H番地にreg0 001H番地にreg1と言う名前を付けました。

18行目でアセンブラーに対してプログラム・メモリーの0番地からプログラムを書き始めることを指定しています。 PICは電源投入後のリセット直後にプログラム・メモリーの0番地から命令を読み出して実行する為、0番地から書き始めます。

20行目で「PICに対してラベルHOTSから命令を読み出して実行する(ジャンプする)ように指示するプログラムをプログラム・メモリーに書くように」とアセンブラー指示しています。 折角0番地から動き始めたばかりですが、この先には割り込み時に実行を始めるプログラムを記述しければならない領域がある為、その分を飛ばして(HOTS)から実行を始めるようにしています。

23行目でアセンブラーに対してプログラム・メモリーの100H番地からプログラムを書き始めることを指定しています。 100Hと言う値は割り込み時の領域を避けて私が勝手に決めた値です。 200Hでも1000Hでもかまいません。

25行目でアセンブラーに対してラベルHOTSを定義、「このアドレスに」HOTSと言う名前を付けています。 先程100Hから書き始めると宣言した直後ですから、100H番地にHOTSと言う名前を付けたことに成ります。 この定義と20行目の指示を合わせることでアセンブラーはPICに対して100H番地から命令を読み出して実行する(ジャンプする)ように指示するプログラム」を0番地に書きます。

26~27行目はPICに対して何かを指示するプログラムをプログラム・メモリーに書くように」とアセンブラーに指示しています。 内容については「データ・メモリーに値を書く」で説明します。

30行目でアセンブラーに対してラベルHOTZを定義、「このアドレスに」HOTZと言う名前を付けています。 26~27行目までのプログラムの直後の番地にHOTZと言う名前を付けたことに成ります。

31行目で「PICに対してラベルHOTZから命令を読み出して実行する(ジャンプする)プログラムをプログラム・メモリーに書くように」とアセンブラー指示しています。 PICはラベルHOTZから命令を読み出す動作を繰り返すことになります。

33行目でアセンブラーに対してプログラムを書く作業を終わるように指示しています。

アセンブラーに対して」をクドクドと繰り返し、読み難かったかも知れませんが、アセンブラーのソース・プログラムは(当然ながら)アセンブラーに指示を出すものです。 PICは、「MPLABがアセンブル(ビルド)を実行した結果プログラム・メモリーに書かれたもの」を実行します。 「プログラム・メモリーに書かれたもの」を記録したものがHEXファイルです。

「シミュレーター 5」では「プログラム・メモリーに書かれたもの」を確認します。

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


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



とにかくビルド!

「楽々PIC」は楽しく楽してPICを学ぼうと言う主旨ですが、実はPICを学ぶ目的が先に無いと長続きしないと考えています。 私の場合はブラシローラー型水田除草ロボットの速度制御に使うマイコンを選ぶ際に、1個から入手できる安価なマイコンで、活用に必要な情報が豊富な製品と言う観点でPICを選びました。 さらにPICの中から必要な機能を実現できるもので、バンクメモリーの制約が小さく使いやすくなったと言うPIC18Fを使うことに決めて勉強を始めました。

PICを使って何をしたいかが先にあると飽きずに学ぶことが出来ると思います。

そして、PICを勉強すると決めたら、何らか参考書を手に入れて読むと思います。 マイコンそのものが始めての方にとって難解であることは良く理解できます。 一通り参考書に目を通したら怯むことなく「とにかくビルド!」した方が良いと思います。

PICは機器に組み込んで使うコントローラーですから、周辺の電気回路を動かして何ぼのものです。 かといって最初から基板を動かそうとすると、コンフィグやらSFRだ、入出力の設定だイベントタイマーって何?、割り込みって?と言った難関に直面します。 マイコンそのものが初めてと言う方の場合は演算の様子やメモリーの読み書きに必要なニーモニックに触れて試してみる方が近道だと思います。 Cコンパイラーも良いのですが、資源の小さなPICマイコンではアセンブラの方が有利な面もあると思います。

そんな訳で、ニーモニックを試すために「とにかくビルド!」してみた記事を書いてみました。 001H番地にFFHを書き込むだけのプログラムですが、コンフィグもSFR、割り込みと言ったものには一切手をつけず、これ以上簡単な方法は無いだろうと言う「とにかくビルド!」を実現してMPLABのシミュレーターで動作を確認しています。
 当然、費用はゼロ円です。

build_succeeded

watch2

詳しくは以下の各記事をご覧下さい。

シミュレーター 1
 プロジェクトを作成しデバッカーとしてシミュレーターを指定しています。

シミュレーター 2
 ソースファイル(ダウンロード可能)を作成してプロジェクトに追加しています。

シミュレーター 3
 ビルドして動作を確認しています。

main.asm 簡単な説明
 アセンブラが何をするのかを合わせて main.asm の説明をしています。

シミュレーター 5
 プログラム・メモリーに書かれた内容と main.asm の内容を比較します。

PICのメモリー
 PICの内蔵メモリーについて説明しています。

データ・メモリーを任意に書き換える
 main.asm の動作をさらに確認し、データ・メモリーに任意の値を書く命令を解説しています。

データ・メモリーの値を読み出す
 データ・メモリーに保存されている値をプログラムで直接読み出す命令について説明します。

数を数える
 処理回数を数える場面などで頻繁に使う「数を数える」命令について説明します。

間接アドレッシング
 データ・メモリー用の間接アドレス方式について説明します。
一定のメモリー領域を0クリアしたり、一まとめのデータを他の領域に転送する(ブロック転送)などに必須の方法だと思います。

加算・減算
 加算と減算について簡単に説明します。 <PICデバイス=18F1320> 数値を扱う用途では当然ながら使用頻度の高い命令です。

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

掛け算(乗算)
 PICで掛け算をした結果は専用の SFR に記録されます。 PICの掛け算について説明します。 折角ですからテーブル参照をする際に参照アドレスを計算するプログラムを書きました。

コンフィグレーションビット
 MPLABの Configuragion Bits ウィンドウから設定する様子を紹介しています。

ゼロフラグ と キャリーフラグ
 演算結果によって変化するステータスフラグの内、ゼロフラグとキャリーフラグについて説明します。 ゼロフラグはループ処理の終了判定と言った場面で頻繁に使いますし、キャリーフラグは8bit長を超える数値演算で重要な役割を果たします。 

OR と AND 
 1byte データの一部を構成する複数の bit を他の bit に影響を与えずにまとめて変化させる場面で OR と AND を使うことがあります。

ビットシフト 
 32bit( 4byte )のデータを左シフトしています。 最後に実行前キャリーの値によって不定になる 32bit 中の最下位ビットを0クリアしています。 2byte 以上のデータをシフトする時には「キャリー使用」の命令を使います。

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

EEPROM 初期設定 
 EEPROM に初期値を書き込む方法について説明してみます。

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

ポート入出力 
 ポートの入出力を行う SFR には、PORTn と LATn があり上図の LATB はポートBに対応しています。 ポートの入出力を行う前に各ポートについて bit 単位で入出力の設定を済ませる必要があります。

18F: テーブル・ジャンプ 
 PIC18F のテーブル・ジャンプは PCLATU , PCLATH にジャンプ先のアドレス上位、中位を準備して、PCL に下位を書くことで実現します。


記事が長くなってきたので、18F のニーモニック関連記事インデックス18F: テーブル・ジャンプ  に引き継ぎます。


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





シミュレーター 4

 新しいプロジェクトを作成してビルドした結果、以下の Output を経験しました。

select_tool0

Couldn't locate build tool. Check tool locations.  BUILD FAILED とあります。

私の場合はボリュームH:にMPLABをインストールしたのが災いしているようです。 C:ドライブにインストールしたPCでは問題が見られません。 Webで調べて、次の対処でビルド出来るようになりました。


1. [Project]→[Select Language Toolsuite]を選択
select_tool

下図のような赤色バッテン印が付いた画面が現れます。

select_tool1

3つ各々について Browse ボタンを押してファイルを選択します。

select_tool2

mplink.exe はアンダースコアで始まる _mplink.exe を選ばないように注意して下さい。

select_tool3

上図のように赤色バッテン印が取れたら、Store tool locations in project にチェックを入れてOKボタンをクリックします。

私の場合は、これで問題なくビルドできるようになりました。


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


シミュレーター 3

 MPLABのインストールからプロジェクト作成まで、初心者には退屈な作業が続きましたが、やっとアセンブル(ビルド)してみることが出来そうです。 シミュレーター 2の続きです。

<<< 9. ビルド >>>
ここまで来たら、下図の右から2番目のボタンをクリックします。
( [Project]→[Build All] を選択しても同じです。)

build

プロジェクトを作って最初のビルドの時だけ、以下のダイアログが出ますが、Absolute を選択します。
absolute

左下の Output ウィンドウに何やら表示が続き、下図のように BUILD SUCCEEDED と表示されたらビルド(アセンブル)の完了です。

build_succeeded

うまく出来たでしょうか? ソースファイルにタイプミスが無い状態で私が経験した BUILD FAILED の対処法をシミュレーター 4に紹介します。

ビルドに成功したらプログラムの動作を確認しますが、このプログラムは Hello world とは表示してくれません。 データメモリーの一つに FF を書き込むだけの簡単なプログラムです。 その動作を確認するためにデータメモリーの内容を目視確認出来るようにMPLABの準備をします。

<<< 10. Watchの準備 >>>
[View]→[Watch] を選択してWatchウィンドウを開きます。

watch

右上に表示されたWatchウィンドウにある Add Symbol ボタンの右隣のプルダウンメニューから reg0 と reg1 を順番に選択してWatchリストに追加します。 プルダウンメニューには多くのシンボル(ラベル)名が並びますが、アルファベット順ですから必ず見つかります。 予め予約されたシンボルは大文字を使っていますから、自分で定義するシンボルは小文字を使うと決めていれば少し楽になります。

add_symbol

add_symbol1


<<< 11. Run  >>>
以上の準備が出来たら、Watchウインドウの上にあるRunボタン(右向き三角)をクリックしてプログラムを走らせます。

run

Watchウィンドウにも変化は見られませんが、Runボタンの右隣にあるHaltボタンでプログラムを止めるとWatchウィンドウに変化が見られます。

watch2

Symbol reg1 の値が 0xFF に替わったら正常動作です。

これだけ! と思われるかも知れませんが、今後はソース・ファイル( main.asm )をチョット書き換えるだけで、次々とニーモニックの動作を確認する環境が出来たと言うわけです。

MPLABを終了する時には [Project]→[Close]→プロジェクト を選択してプロジェクトを閉じてからMPLABを終了しています。 (いきなり終了しても問題ないようですが・・・)
次からはMPLABを立ち上げて [Project]→[Open]の後、プロジェクトファイルを選択すると前回終了した時と同じ画面から再開できます。

ニーモニックの解説など順次紹介する予定です。

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


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





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


アーカイブ
楽々PIC 宛てBlogMail


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

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

    Atsuhiro Imai

    バナーを作成


    プロフィール

    jyosou_robot

    • ライブドアブログ