サンプルプログラム(SLEEP TMR0 間接アドレシング)
BookT、BookUで登場していないPICマイコンの機能をいくつか取り上げ、サンプルプログラムを紹介
します。
サンプルプログラムは、右クリックして「対象をファイルイに保存」でダウンロードしてください。
1)「SLEEP」
「SLEEP」命令を書くと、PICマイコンは文字通り眠ったような状態になります。そして、眠りに入る直前
の状態を保ち、目覚めるとその状態に復帰します。スリープの間はクロックが停止し、従って命令は実行
せず、各種機能も働かなくなるので、極めて低消費電力の状態になります。ですから、何かの信号をじっ
と待ち受けるというようなときに、省エネという意味で有効です。スリープから目覚める条件はいくつかあ
りますが、中でも重要なのは割り込みによるものです。すなわち、RB0の外部からの入力による割り込み、
およびRB4〜7による状態変化による割り込みです(BookT参照)。下のサンプルプログラム「sleep.asm」
は、スタート直後にスリープ状態となり、RB7の状態変化割り込み(0Vから+5Vに変化、またはその逆)で
目覚めたあとひとしきりパフォーマンスをして、再びスリープ状態になります。本書の実験用ボードでは、
LEDがつながっているRB7の抵抗のリード線を、+5Vからの線で触れることで、実験できます。
sleep.asm
2)「TMR0」
「TMR0」というのは、あるプログラムを実行しつつ、@外部からの信号の入力をカウントする(カウンタ)、
Aある決められた時間ごとに動作を起こす(タイマー)、という二つ機能のことを言います。このうちのAは
あまり 実用的ではありません。インターバルを最大に設定しても、数十mS程度の時間しか得られない
(OSCが10MHzの場合)からです。なお、「PA.EXE」では、この「TMR0」が本来の機能を発揮しません。
何故かというと、「16F84.H」を見ると分かりますが、本来81hに定義されるべきはずの「OPTION_REG」が
「TMR0」と同じ80hに置かれているためです。@において、「OPTION_REG」でプリスケーラを、例えば4に
設定すれば、4回の入力で、1カウントアップするはずなのですが、「OPTION_REG」が機能しないため、常に
1回の入力で、1カウントアップします。このことは、カウンタとしての働きを無意味にするものではなく、十分
有意義に機能します。サンプルプログラムを見ると分かりますが、「OPTION_REG」は何も設定することなく、
TMR0レジスタを読み取れば、いつでもRA4からの信号の入力をカウントできます。当然ですが、このような
入力を処理するのには、チャタリング対策が不可欠です(チャタリングに関しては本文を参照してください)。
なお、TMR0レジスタを 読み取るだけでは、256までしかカウントできませんが、プログラムの中で、TMR0
が256になるごとに、1アップするような変数を用意すれば、どんなに大きな数までもカウントできます。
tmr0.asm
3)「間接アドレシング」
RAM(ファイルレジスタ)のアドレス指定は、三通りの方法があります。@およびAが直接アドレシングで、
Bが間接アドレシングです。
@ mov
20h,#10101010b
; ファイルレジスタの20h番地に10101010bを格納
つまり、このやり方では、直接RAMの20h番地に10101010bを書き込んでいます。
Adata_1 ds,20h
; ファイルレジスタの20h番地に変数data_1を定義
・・・
mov
data_1,#10101010b
; data_1に10101010bを格納
あらかじめRAMにdata_1という変数を定義して、そのdata_1に01010101bを書き込みます。通常はこの方
法を用います。言うまでもなく、プログラムが分かりやすくなるからです(単に20h番地というより、data_1と
いう名称に設定した方が分かりやすい)。
Bサンプルプログラムで紹介するのが、間接アドレシングです。SFRの「FSR」と「INDF」レジスタを用います。
データを書き込みたいRAMのアドレスをFSRに格納し、書き込みたいデータをINDFに格納すると、RAMに
データが書き込まれます。逆に、FSRにアドレスを書き込み、INDFを取得すれば、RAMのデータを読み出
すことが出来ます。FSRを変数のように扱うことが出来るので、データを連続的に読み書きすることが可能
になります。サンプルプログラムを見た方が、そのあたりのことは分かりやすいでしょう。
※BookT(オレンジ本)の「(ねずみロボットの)動きをインプット」、BookU(グリーン本)の「メロディークリ
エータ」は、間接アドレシングを用いれば、もっとスマートにプログラムをまとめられます。
indf.asm
上記のサンプルプログラムは、いずれも、ご自身の責任においてご活用ください。ご活用に際して、何か不
利益が生じたとしても、当方としては責任は取れませんので、宜しくご了解ください。