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