1つのLEDを点滅させるだけの単純な回路です。使用するPICも最もポピューラーと言われているPIC16F84Aです。Cでプログラムすれば僅か数行で済んでしまいますが、今回はアセンブラでプログラムしました。0.5秒周期で点滅させるだけです。ハードも簡単なのでブレッドボードにしました。単純なのですが動いたときは良い気分になりました。

list p=16F84A
#include <p16F84A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
;コードプロテクトOFF,ウオッチドッグ
;タイマOFF,パワーアップタイマON,
;クロック発振モードはHS
COUNT1 EQU 0x0C ;0C番地をCOUNT1のメモリとして使用する
COUNT2 EQU 0x0D ;0D番地をCOUNT2のメモリとして使用する
ORG 0x000 ;メインプログラムの開始アドレス
GOTO main
ORG 0x004 ;割込み開始アドレス
GOTO main
main
bcf STATUS,RP0 ;メモリバンクを0に設定
bcf STATUS,RP1 ;メモリバンクを0に設定
CLRF INTCON ;割込み禁止
CLRF PORTA ;Aポートをクリア
bsf STATUS,RP0 ;メモリバンクを1に設定
clrf TRISA ;Aポートを出力に設定
clrf TRISB ;Bポートを出力に設定
bcf STATUS,RP0 ;メモリバンクを0に設定
clrf PORTA ;Aポートをクリア
clrf PORTB ;Bポートをクリア
main_1 ;LED点滅ルーチン
bsf PORTA,1 ;LEDをオフ
call DELAY_250 ;250mS間維持
bcf PORTA,1 ;LEDをオン
call DELAY_250 ;250mS間維持
goto main_1
;************************Delay************************
DELAY_250 ;250ms
movlw 0xFA ;COUNT1に250を代入
movwf COUNT1
DELAY1 ;1ms
movlw 0xc8 ;COUNT2に200を代入
movwf COUNT2
DELAY2
nop ;1サイクル何もしない
nop ;1サイクル何もしない
decfsz COUNT2,f ;COUNT2をデクリメント、0になったら次々行へ
goto DELAY2
decfsz COUNT1,f ;COUNT1をデクリメント、0になったらリターン
goto DELAY1
return
END
LEDのアノードとGND間にかかる電圧の波形です。0.25秒のHigh、Lowで周期は予定どおり0.5秒になっています。
目的は250mSecの時間を作り出すことにあります。ここでは1サイクルは1uSecです。プログラムのDELAY2の最初から4行で5サイクル費やし、COUNT2が200ですから5uSec×200で1mSecになります。COUNT1が250ですから1mSec×250で250mSecになります。mainルーチンでバンクとポート設定をし、main_1ルーチンでLED点滅をします。
セラミック発振子はDELAYの計算がしやすいので4Mにしました。クロック周波数が4MHzですので、クロック周期は0.25μsecです。PICの1サイクルは、原発振の4サイクルですので1μsecになります。発振器はコンデンサ内蔵のセラミック発振器を使いました。LEDに直列に入っている抵抗は、10mAにするため270Ωにしています。電源ラインに入っている0.1μのコンデンサはPICを安定に動作させるためのものです。今回の動作は点滅だけの単純な動作ですが、プログラムは高速で動作しているので、どんな場合でも入れるようにしています。