回路図

;インクルードファイルを取込む

LED 点滅回路

 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を安定に動作させるためのものです。今回の動作は点滅だけの単純な動作ですが、プログラムは高速で動作しているので、どんな場合でも入れるようにしています。