目次8章.機能が豊富なPICを使う(PIC12F683)>(3)内部クロックで動作させる

内部クロックで動作させる (PIC12F683)
更新日2005.12.17

PIC12F683を使ってみます。
まずは、外部にレゾネータ(セラロックなど)を接続せずに、内部クロックのみで動作させましょう。

実験回路
出力としてLEDを5個使用した簡単な回路を作ります。
8ピンしか無いのに、5ピンを入出力として使用できます。更に1ピン(GP3)は入力として使用できます。

GP3は入力専用ですので、今回は使用しません。

各LEDの並びは気にしません。
今回は、各ポートを出力として制御できる確認だけします。

プログラムの仕様
0.5秒毎に5つのLEDを同時にオン/オフさせます。
クロックは、内部クロックを使用し、内部クロックの最大である8MHzで動作させます。

プログラムの概要
0.5秒毎に点滅させる

0.5秒待つ方法、点滅させる方法は、「5章(1)LEDを点滅させる」と全く同じです。
処理フローも同じで以下の通りシンプルです。

0.5秒の待ちは、命令を一定回数ループさせる事で実現します。
ただし、クロックが「5章(1)LEDを点滅させる」では10MHzでしたが、今回は8MHzです。
従って、実行させる命令サイクル数は次のようになります。

1命令実行時間:(1/(8MHz×1,000,000))×4=0.5u秒(マイクロ秒)
命令サイクル数:(0.5秒×1,000,000)/0.5u秒=1,000,000

この処理は、「5章(1)LEDを点滅させる」と同様に、3つのサブルーチンで行います。ただし、命令サイクル数が違うのでサブルーチン内のループ回数は異なります。(プログラム全体を見て下さい。)

PICの初期化(使用するレジスタ)

PIC12F683の初期化では、いくつかのレジスタの設定が必要です。
PIC16F84Aに比べて機能が多いため、どの機能をどのように使用するかを設定するためです。

今回のプログラムで初期設定するレジスタと、その設定値について説明します。
GPIOレジスタ以外は、最初に設定するだけで実行中に変更する必要はありません。

ここでは、今回設定する値を中心に説明します。
PIC16F84Aに近い使い方(追加された機能を使わない)に設定しており、この設定が基本になります。
レジスタのもう少し詳しい説明は、「PIC12F683のレジスタ(特殊レジスタ:SFR)」を参照して下さい。

<GPIOレジスタ>

ビットBit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
記号--GP5GP4GP3GP2GP1GP0
設定値

ポート(GP0〜GP5)のON/OFFを制御するレジスタで、0をセットするとOFF(LEDは消灯),1をセットするとON(LEDは点灯)になります。
初期値としては、全て0にします。
尚、Bit3,6,7は設定が無視されますが、プログラムでは0をセットします。

<TRISIOレジスタ>

ビットBit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
記号--TRISIO5TRISIO4TRISIO3TRISIO2TRISIO1TRISIO0
設定値

ポート(GP0〜GP5)を入力で使うか出力で使うかを指定します。

該当ポートは出力
該当ポートは入力

尚、Bit3,6,7は設定が無視されますが、プログラムでは0をセットします。

<CMCON0レジスタ>

ビットBit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
記号-COUT-CINVCISCM2CM1CM0
設定値

コンパレータの動作を設定するために使用しますが、今回はGP0〜2をデジタル入出力として使用しますので、CM0〜CM2には1を設定します。

<OSCCONレジスタ>

ビットBit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
記号-IRCF2IRCF1IRCF0OSTSHTSLTSSCS
設定値

OSCCONレジスタでは、オシレータの動作モードを設定します。
今回は8MHzで動作させますので、IRCF0〜IRCF2は全て1を設定します。

<ANSELレジスタ>

ビットBit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
記号-ADCS2ADCS1ADCS0ANS3ANS2ANS1ANS0
設定値

ANSELレジスタでは、アナログ入力(A/D変換)の設定を行います。
今回は、AN0〜AN3(GP0,1,2,4)はデジタル入出力で使用しますので、全て0にします。

コンフィグレーションビット(__CONFIG命令の設定)

__CONFIG命令では以下の記述をします。

__CONFIG _CP_OFF & _CPD_OFF & _WDT_OFF & _BOD_ON & _IESO_OFF& _PWRTE_ON & _INTOSCIO & _MCLRE_OFF

_CP_OFFプログラムメモリコードプロテクトしない
_CPD_OFFEEPROMメモリコードプロテクトしない
_WDT_OFFウォッチドックタイマ使用しない
_BOD_ON電源電圧低下監視を有効にする
_IESO_OFF内部・外部切り替えモード無効
_PWRTE_ONパワーアップタイマ有効
_INTOSCIOオシレータは内部クロック使用(2番ピン:GP5,3番ピン:GP4)
_MCLRE_OFFマスタクリア無効(4番ピンをGP3として使用)

プログラム全体
上記の処理を組み込んだプログラムはこちらです。
メモ帳などのテキストエディタに取り込んで、P683INTOSC1.ASMという名で保存し、MPLABでアセンブル&PICライタでPICに書き込んで動かしてみて下さい。

今まで、PIC16F84Aを使用していた場合は、MPLABのプロジェクトウィザードで「PIC12F683」を選択して下さい。
また、PICライタでも同様に「PIC12F683」を選択して下さい。

0.5秒毎に5個のLEDが点滅すれば成功です。