ホームに戻る
 PIC16F84A の覚え書き

0、はじめに

ADWIN 社の「キットで遊ぼう電子回路シリーズ No.5」
という書籍を購入したのでその覚え書きです。
内容は PIC 入門アセンブラ編となっています。

書籍には PIC や必要な電子部品が整っていますが、
PIC ライターは各自購入する必要があります。
あとはPCとインターネットに接続する環境があればOKです。

1、PIC の概要

PIC とは MicroChip 社の製品であり、
PIC16F84A はその中の製品のひとつです。
価格は1個400円くらいです。
MicroChip 社が提供する MPLAB IDE というソフトで、
プログラミングをして内容を書き込みます。
書き込む装置を PIC ライターと呼び、
これは数種類が販売されています。

PIC にできることは主に電圧の Hi と Low の制御です。
スイッチを押した回数をカウントする、
LEDを点滅させる、
スピーカーから指定周波数で音を出す、
モーターの回転速度を制御する、
などが可能で、いろいろな応用が可能です。

2、電源

PIC の動作には直流電源が必要です。
2V〜6Vの電圧で動作するそうです。
例えば5Vの電圧を与えると、Hi が5Vの設定になります。

3、クロック

セラミック発振子は電圧をかけると定周波数の信号(クロック)を発するというものです。
セラミック発振子は1個100円もしません。
PIC16F84A は外部からのクロックを得て動きます。

書籍に付属のセラミック発振子は10MHzなので、
1クロックが0.1マイクロ秒となります。
PIC は1命令に4クロック必要なので、
1命令に0.4マイクロ秒かかる計算になります。

4、リセット

MCLR にはリセットスイッチをつなぎます。
具体的には Low になると PIC が最初の状態にリセットされます。
細かく何がどうリセットされるかは仕様を確認してください。

5、回路のつなぎ方

PIC には電源用の足が2本、クロック用が2本、リセット用が1本あります。
PIC16F84A は足が全部で18本ありますで、残り13本です。
残りの13本は全て入出力用です。
電源、クロック、リセットの回路は正しく接続する必要がありますが、
その他の13本は用途にあわせて接続します。

6、プログラム

プログラムはアセンブラで記述します。
PIC16F84A では35個の命令があります。
1命令が14ビットです。
16ビット幅では無いので注意します。
命令はフラッシュメモリの0000h から 03FFh に書き込みます。
0000h に14ビット命令が1つ、0001h に14ビット命令が1つです。
フラッシュメモリには約1000回までの書き換えが可能。
電源を切っても記録は残ります。
プログラムを組む場合の注意点としては、
戻りアドレスを記録するスタックが8段までしかないので、
サブルーチンの呼び出しの回数に制限があります。

7、コンフィギュレーションワード

フラッシュメモリの 2007h にある特別な領域です。
PIC ライターで書き込みのみ可能です。

bit 13-4: コードプロテクト

_CP_ON or _CP_OFF

1 = コードプロテクトしない 
0 = 全てのメモリーをプロテクトする
 
bit 3: パワーアップタイマー

_PWRTW_ON or _PWRTW_OFF

1 = パワーアップタイマーを使用しない 
0 = パワーアップタイマーを使用する

パワーアップタイマーは電源投入後の約72ms間リセットし続けます。
電源投入直後は動作が不安定なので、プログラムが始まらないようにします。
 
bit 2: ウオッチドックタイマー(WDT)

_WDT_ON or _WDT_OFF

1 = WDTを使用する
0 = WDTを使用しない

ウオッチドックタイマーはオーバーフローするとリセットがかかります。
また、CLRWDT 命令でウオッチドックタイマーを 0 に戻します。
すなわちメインループに CLRWDT を入れておいて、
サブルーチン内で無限ループした場合にリセットをかける等に使えます。
このタイマーは独立したクロックを持っておりオーバーフロー時間は約18ミリ秒です。
 
bit 1-0: クロック

セラミック発振子のタイプによって指定します。

1 1 _RC_OSC 1MHz以下 
1 0 _HS_OSC 4MHz〜20MHz 
0 1 _XT_OSC 4MHz以下 
0 0 _LP_OSC 200KHz以下 
 
8、RAM

電源を入れると初期値で初期化される。
電源を切ると記憶は消える。
1バイトが8ビット。
2つのバンクを切り替える。
バンク0が 00h-4Fh バンク1が 80h-CFh。
書き込み回数に制限は無い。

以下たくさんありますが詳細設定は STATUS、OPTION_REG、ITCON の3ヶ所。

バンク0
00h: INDF 間接メモリデータ(物理的に存在しない)
01h: TMR0 タイマー値 (初期値:00000000h)
02h: PCL プログラムカウンタの下位8ビット (初期値:00000000h)
03h: STATUS (STATUS 後述)
04h: FSR 間接メモリアドレス(INDF と連動)
05h: PORTA (入出力 後述)
06h: PORTB (入出力 後述)
08h: EEDATA (EEPROM 後述)
09h: EEADR (EEPROM 後述)
0Ah: PCLATH プログラムカウンタの上位5ビット (初期値:00000h)
0Bh: ITCON (ITCON 後述)
0Ch-4Fh: GPR 汎用メモリ(自由に使って良い)
バンク1
81h: OPTION_REG (OPTION_REG 後述)
83h: STATUS
85h: TRISA(入出力 後述)
86h: TRISB(入出力 後述)
88h: EECON1 (EEPROM 後述)
89h: EECON2 (EEPROM 後述)

9、Wレジスタ

演算や入出力を行う際に使う汎用レジスタ。

10、プログラムカウンタ

プログラムの現在の位置を示すカウンタ。

11、間接メモリ

FSR にアドレスを設定しておくと、
INDF に書き込む動作が FSR の指すアドレスの位置への書き込みになる。
連続した領域にループで数値を書くときなど便利。

12、入出力

TRISA と TRISB で入力か出力かを決めます。
TRISA は RA0 〜 RA4 まで TRISB は RB0 〜 RB7 まであります。
入力の場合 1 に、出力なら 0 にします。
入出力を調べるには PORTA や PORTB を読み書きします。
Wレジスタを介さないと読み書きできません。

13、STATUS

バンクの切り替えはここで行うので重要です。

bit 5: RP0

1 = バンク1
0 = バンク0

bit 4: タイマーのタイムアウト表示ビット

1 = 電源投入直後、CLRWDTまたはSLEEP命令を実行時 
0 = ウオッチドックタイマーのタイムアウトが発生 

bit 3: パワーダウン表示ビット

1 = 電源投入直後、CLRWDT命令を実行時 
0 = SLEEP命令実行時 
 
bit 2: 演算結果表示ビット

1 = 演算結果がゼロ 
0 = 演算結果がゼロでない 

bit 1: デジットキャリービット

1 = 演算結果の下位4ビットからのオーバーフローが発生 
0 = 演算結果の下位4ビットからのオーバーフローが発生していない 
 
ビット0: キャリービット

1 = 演算結果の最上位ビットからのオーバーフローが発生
0 = 演算結果の最上位ビットからのオーバーフローが発生していない 
 
14、OPTION_REG

bit 7: ポートBプルアップ抵抗指定

1 = プルアップ抵抗を使用しない 
0 = プルアップ抵抗を使用する 

bit 6: RB0/INT の割り込み指定

1 = RB0/INTピンの立ち上がりで割り込み 
0 = RB0/INTピンの立ち下がりで割り込み 
 
bit 5: RA4/T0CKI のクロック選択

1 = RA4/T0CKI をクロック入力に使用 
0 = 内部クロックを使用(CLKOUT) 
 
bit 4: RA4/T0CKI のカウントアップ指定

1 = RA4/T0CKIピンの立ち下がりでカウントアップ 
0 = RA4/T0CKIピンの立ち上がりでカウントアップ 
 
bit 3: タイマープリスケーラーの選択

1 = プリスケーラをWatchdogタイマーに使用 
0 = プリスケーラをTMR0タイマーに使用 

bit 2-0: プリスケーラのスケール値

PS2 PS1 PS0  TMR0   WDT
  0   0   0   1:2   1:1
  0   0   1   1:4   1:2
  0   1   0   1:8   1:4
  0   1   1  1:16   1:8
  1   0   0  1:32  1:16
  1   0   1  1:64  1:32
  1   1   0 1:128  1:64
  1   1   1 1:256 1:128

15、ITCON

bit 7: 全割り込み指定ビット

1 = 全割り込みマスク解除 
0 = 全割り込み禁止 

bit 6: EEPROM 書き込み完了割り込み指定ビット

1 = EEPROM書き込み完了割り込み可能 
0 = EEPROM書き込み完了割り込み禁止 

bit 5: TMR0 オーバーフロー割り込み指定ビット

1 = TMR0 オーバーフロー割り込み可能 
0 = TMR0 オーバーフロー割り込み禁止 
 
bit 4: RB0/INT 割り込み指定ビット

1 = RB0/INT 割り込み可能 
0 = RB0/INT 割り込み禁止 

bit 3: RB4-RB7 割り込み指定ビット

1 = RB4-RB7 割り込み可能 
0 = RB4-RB7 割り込み禁止 

bit 2: TMR0 オーバーフロー表示ビット

1 = TMR0 オーバーフローが発生(ソフトでのクリアが必要) 
0 = TMR0 オーバーフローは発生していない 

bit 1: RB0/INT 割り込み表示ビット

1 = RB0/INT 割り込みが発生(ソフトでのクリアが必要) 
0 = RB0/INT 割り込みは発生していない 
 
bit 0:

1 = RB4-RB7 割り込みが発生(ソフトでのクリアが必要) 
0 = RB4-RB7 割り込みは発生していない 

16、割り込み

割り込みが発生するとプログラムが
フラッシュメモリの 04h に飛ぶと決まっています。
割り込みの処理は 04h から書きます。
よってプログラムの開始ではいきなり割り込み処理を飛び越えて、
メインの処理へ飛ぶ処理を書く必要があります。

割り込み発生後に必要なのは STATUS とWレジスタを退避し、
処理を返すときに復帰することです。

17、タイマー(TMR0)

タイマーを使用する場合はまずクロックを選択します。
RA4 から外部クロックを入力するか内部クロックを利用します。
内部クロックはいわゆる PIC のクロックをそのまま利用します。
カウントは1命令ぶんの時間で1カウントします。
TMR0 は8ビットなので 256 でオーバーフローします。
時間の調節には初期値を与える方法とプリスケーラを使う手があります。
初期値は TMR0 に書き込んで最初から進めておく方法で、
プリスケーラはカウントを遅らせる方法です。
例えばプリスケーラに 1:256 を設定しておくと、
1カウントに必要な時間を256倍してくれます。
プリスケーラーを使用する場合は、
TMR0 か WDT のどちらに割り振るかを決めておく必要があります。

18、入出力割込み

RB0 と RB4-RB7 の2つで割り込みができます。
RB4-RB7 はどれかひとつが変化するだけで割り込みます。
立ち上がりか立ち下がりかを選択できます。

19、EEPROM

電源を切っても内容が消えない。
領域は64バイト。
書き込み回数が約100万回。
保存期間が約40年。

100万回書き込めるのは多いようだが、
ループ内で使ってしまうとすぐに100万回を超える。

EEADR のアドレスに EEDATA で読み書きします。
64バイトなので EEADR は下位6ビットしか意味がない。
ソースに書く場合は 2100h からとします。

書き込みの制御で EECON1、EECON2 の設定が必要。

20、EECON1

bit 4: EEPROM 書き込み完了割り込み表示ビット

1 = 書き込み完了割り込みが発生(ソフトでのクリアが必要) 
0 = 書き込みが完了していないか書き込み動作が行われていない 

bit 3: EEPROM 書き込み障害表示ビット

1 = 書き込み動作が完了前に終了 
0 = 書き込み障害は発生していない 

bit 2: EEPROM 書き込み指定ビット

1 = 書き込み可能 
0 = 書き込み禁止 

bit 1: EEPROM 書き込み制御ビット

1 = 書き込みサイクルを初期化(ソフトで設定、ハードでクリア) 
0 = 書き込み初期化動作はしていない 

ビット0: EEPROM 読み込み制御ビット

1 = 読み込みサイクルを初期化(ソフトで設定、ハードでクリア) 
0 = 読み込み初期化動作はしていない 
 
21、EECON2

ここに 55h AAh を続けて書き込むと EEPROM の書き込みロック解除となる。

22、ICSP

ICSP とは PIC にプログラムを書き込む方法のことです。
詳しくは書きませんが、書き込み用のクロックを与えながら、
特定のピンに Hi か Low を与えることで、
PIC のフラッシュメモリにプログラムを書き込んでいます。

inserted by FC2 system