初版 2006.10.23
PIC のプログラミングに関しては 15 種類以上の書籍が出版されており、 インターネットにも有益なサイトが多数あります。 自分がやりたいことと完全に一致するサンプルプログラムが あればいいのですが、そうでない場合は自分で PIC を選び、 その PIC 用のコードを書く必要があります。ところが、PIC は 型番が異なるとピンの役割、レジスタ構成 Configuration 項目が微妙に 異なります。正しく Configuraton を設定しないと動作しません。
私は ADWIN 社の「キットで学ぼう電子回路 PIC編」で PIC の勉強を始めました。 このキットでは 16F84A が取り上げられていました。 16F84A は入門用として最適な PIC なので様々な書籍で取り上げられています。 しかし、私が行いたかった A/D 変換機能は 16F84A には 含まれてないので、A/D 変換機能を持つ 16F819 に乗り換えました。 さらに、16F819 には USART 機能がついてなかったので、16F873A に乗り換えました。
先述したように、PIC は型番が異なると、ピンの役割、レジスタ構成、Configuration 項目などが微妙に異なります。 以下では、私がハマッた事項についてまとめておきます。 なお、ここでは Microchip Technology 社の MPLAB IDE の アセンブラを使用して開発を行います。
書籍の例題に載っていない PIC を使う場合、 PIC のデータシート(www.microchip.com に PDF としてあります)を 印刷しておく必要があります。全てのページを印刷すると 100 ページ以上 になるので、最低限「ピンの役割のページ」「レジスタ構成のページ」を印刷し、 さらに、自分が必要なレジスタの設定方法のページを印刷すればよいでしょう。
PIC には Configuration の設定が必要です。 16F84A の場合のアセンブラコードの冒頭の例を示します。
LIST P=PIC16F84A INCLUDE P16F84A.INC __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
3 行目で Configuration の設定を記述しています。_HS_OSC は高速の外部発振器を 使うことを表し、_WDT_OFF は Watch Dog タイマを使わないことを表しています。 この部分を自分の目的に合わせて設定する必要があります。 16F819 の場合の例を示します。
LIST P=PIC16F819 INCLUDE P16F819.INC __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _BODEN_ON & _MCLR_ON & _LVP_OFF
ここで、_LVP_OFF は Low-voltage Programming をしないことを表します。 デフォルトでは _LVP_ON となっており、_LVP_ON の場合は PORTB の bit 3 を デジタル出力用のピンとして使うことが出来ません。 16F84A の場合は PORTB は常にデジタル入出力用のピンとして使えたのですが、 16F819 の場合は _LVP_OFF を明示的に設定する必要があります。
個々の PIC にどのような設定項目があるかは、
C:\Program Files\Microchip\MPASM SUITE\P16F84A.INCなどのインクルードファイルの最後の部分を見れば分かります。 自分が使う PIC の Configuration にどのような設定項目があるのかを 確認しておく必要があります。
PIC にはリセット用として使える端子があります。 この端子をリセット用として使うときは、 通常は 5 V をかけておき、リセットのときに 0 V にします。 従って、この端子に 何もつながずに open にしておくと、PIC が動作しなくなってしまいます。
16F819 の Configuration の例で _MCLR_ON という記述がありますが、 これは MCLR という端子をリセット用に使うという記述です。 16F819 の場合はこの端子をリセット用として使わない場合は、リセット回路は 不要ですが、16F873A はリセット専用の端子があるので、この端子 を Open にしておくと、PIC が動作しません。
PIC にはハードウェア割り込み用の端子があります。 割り込みが発生すると 4 番地に飛ぶそうです。 データシートによると、16F873A はデフォルトで 全ての割り込みは不許可になっているのですが、 プログラムの最初に
MOVLW B'00000000' MOVWF INTCON ; 全ての割り込みを不許可
を入れない場合、PIC のパワーオン後、数秒〜10秒程度で動作がストップ する、という現象に遭遇しました。 割り込み処理用コードを記述していない場合、 明示的に INTCON レジスタに 0 を入れておくのが無難なようです。