PIC10F200のサ ンプルプログラムU         2007.10.13

■動作

 一番小さいPIC、PIC10F200(8ピン DIP品)を使って、赤、緑、青(Red、Green、Blue)のLEDを各々独立してPWM(パル ス幅変調)で調光するサンプルプロ グラムです。PWMはポートのH、Lの比率を変えてLEDの明るさを変えます。 
  aa
 開発環境はPICのサイトから無料でダウンロードできる統合開発環境MPLAB  V7.6xと添付するアセンブラで製作 しました。 MPLABのインストゥール、使い方、アセンブラの仕様などはネット上に多くの例がありますので、それを参考に行なえると思います。書き込み器は電源も供 給で きる PICKitを 使用しました。
pic

■PWM観測波形

wave

■回路図

 CN1はPICKit2用のコネクタです。LEDは秋月電子で販売しているEP204K-35RGBを使用しました。赤、緑、青のLEDが1パッケージ に収められています。それぞれのLEDに10mAの電流を流すこととし、それぞれのLEDの順方向降下電圧が異なりますので、実測して抵抗値を求めまし た。

 計算例 オームの法則 R=V/I より R4 = (5V-3.2V)/10mA = 180Ω  ここで 5V=電源電圧、3.2V=ブルーLED に10mA流したときの 測定した順方向降下電圧(両端の電圧) 
 
 赤、緑、青は光の3原色ですので、明るさを変えることにより(R,G,Bの比率を変えることにより)無限に近い色を発生させることができます。このソフ トで理論的には250×250×250=15、 625、000 色の色を表現できます。
 発振器はPIC10F200内蔵の発振器4MHz(動作は1/4=1MHz≒1μsecで1命令実行)を使用しました。周 波数変動幅が-40℃から85℃で最悪1%以内なので実用上十分です。

 デバック時はCN1にPICkit2を接続してプログラムの書き込み、電源のON,OFFを行います。デバック終了以降はPICkit2をはずし、2番 に+5V、3番にGNDを接続すれば動作します。PIC10Fシリーズはリセット回路も内蔵しています。
cc


■プログラム
;---------------------------------------------------
;    PIC10F200 サンプル
;
;    RGB LED PWM 輝度コントロール
;    プログラムプロテクトモード
;
;    Copyright Beyond the river Inc.
;    Written by H.M 2007.10.13
;---------------------------------------------------

    LIST P=10F200
    INCLUDE P10F200.INC
   
 __config _MCLRE_OFF & _WDT_OFF & _CP_ON

COMP    EQU    D'1'
;COMP    EQU    D'14'            ;プリスケーラ1/1のとき   
RED        EQU H'11'
GREEN    EQU H'12'
BLUE     EQU H'13'
TIMER1   EQU H'14'

    ORG        0
START
    GOTO    PSTART

    ORG        H'40'
PSTART
    MOVWF    OSCCAL            ;周波数調整値セット

    MOVLW    b'00001000'
    TRIS    GPIO                      ;I/O設定 GP0,1,2 出力 GP3入力 

    MOVLW    b'00000111'
    MOVWF    GPIO                 ;LED OFF   

    MOVLW    b'11000011'   
    OPTION                             ;GP2を使うので、T0CKI input 無効,タイマ0内部クロック使用、プリスケーラ 1/16 に割り当て

;    LED PWM 初期値

    MOVLW    D'10'
    MOVWF   RED
    MOVLW    D'50'
    MOVWF   GREEN
    MOVLW    D'100'
    MOVWF   BLUE

    CLRW
    MOVWF    TIMER1

;以下はメインルーチンです

LOOP1
    MOVLW    D'5'
    SUBWF    TIMER1,W            ;4msec×5=20msec
    BTFSS    STATUS,C
    GOTO    LP1

;    20msecに1回色変化する

    CLRW
    MOVWF    TIMER1
    DECF    RED
    DECF    GREEN
    DECF    BLUE
LP1
    CLRW   
    MOVWF    GPIO                ;ALL RED ON
    CALL    RESRGB

    GOTO    LOOP1

;以下はサブルーチンです。

RESRGB    ;約4msec ウエイト(プリスケーラ設定 1/16の場合、1/1だと250μsec)

    MOVLW    D'8'            ;256- (設定数-2) = 時間, 256-(8-2)=250μsec、250×16(プリスケーラ値)=4msec
    MOVWF    TMR0
WLOOP
    MOVF    RED,W           
    SUBWF    TMR0,W
    BTFSC    STATUS,C   
    BSF        GPIO,GP1        ;GP1=RED OFF

    MOVF    GREEN,W
    SUBWF    TMR0,W
    BTFSC    STATUS,C   
    BSF        GPIO,GP2        ;GP2=GREEN OFF

    MOVF    BLUE,W
    SUBWF    TMR0,W
    BTFSC    STATUS,C   
    BSF        GPIO,GP0        ;GP0=BLUE OFF

    MOVLW    COMP            ;TMR0がCOMP以下を見ている→プリスケーラ値が低い場合、RESRGB頭から命令実行中にカウンタが変わるので大きな値と比較する必要あり(1命 令+1α)
    SUBWF    TMR0,W            ;TMR0 - W
    BTFSC    STATUS,C        ;TMR0 < W = C -> 0
    GOTO    WLOOP
    INCF    TIMER1            ;250μsec×16=4msecごとに+1
    RETURN

    END

■解説
;---------------------------------------------------
;    PIC10F200 サンプル
;
;    RGB LED PWM 輝度コントロール
;    プログラムプロテクトモード
;
;    Copyright Beyond the river Inc.
;    Written by H.M 2007.10.13
;---------------------------------------------------

    LIST P=10F200
    INCLUDE P10F200.INC
   
@ __config _MCLRE_OFF & _WDT_OFF & _CP_ON

    _CP_ONでコピープロテクトをONにしています。これによりPICに書き込まれたプログラムを読み込むことができません。
書 き込みはON、OFFに関わらずできます。

ACOMP    EQU    D'1'
;COMP    EQU    D'14'            ;プリスケーラ1/1のとき   
RED        EQU H'11'
GREEN    EQU H'12'
BLUE     EQU H'13'
TIMER1   EQU H'14'

 TMR0を使用して1周期4msecというPWMのベースタイマーを製作しています。PIC10Fシリーズは割り込みはありません。ですので、時間を知 るためにはカウンターの値をあらかじめ決められた値と比較して見ます。COMPの値はプリスケーラ設定等 により変化させる必要があります。詳しくは後述します。RED、GREEN、BLUEは変数です。ここの値でLEDの輝度が変化します。0〜255を設定 できま す。

B ORG        0
START
    GOTO    PSTART

    ORG        H'40'
PSTART
    MOVWF    OSCCAL            ;周波数調整値セット


 電源ONで0番地よりプログラムは動作しますが、プログラム本体はORG命令によりH'40'から配置しています。理由はPIC10Fシリーズのプロテ クトが全 アドレスでない(0〜3Fまではプロテクトありなしに関わらず読み込めてしまう)ためです。プログラム本体をGOTO PSTRAT命令で読み込めない H'40'からにずらしています。
 次のMOVWF OSCCAL 命令は内蔵発振器の周波数を4MHzちょうどにあわせるためのものです。個々のPIC10Fシリーズは工場出荷時に発振 周波数のばらつきを補正する値をプログラムアドレスの末尾に書き込まれて出荷されています。電源投入時、その値がWレジスタに自動的に書き込まれますの で、ユーザーはWレジスタの内容をOSCCALに書き込めば、周波数のばらつきを極力少なくすることができます。この補正値はライタで消すこともできます ので、誤って消さないようにします。

C MOVLW    b'00001000'
    TRIS    GPIO                      ;I/O設定 GP0,1,2 出力 GP3入力 

 GP0,1,2をそれぞれLEDに対応させていますので、出力に設定します。

D MOVLW    b'00000111'
    MOVWF    GPIO                 ;LED OFF   

 始めに全部消灯します。1で消灯です。

E MOVLW    b'11000011'   
    OPTION                             ;GP2を使うので、T0CKI input 無効,タイマ0内部クロック使用、プリスケーラ 1/16 に割り当て

 GP2は電源投入時、GP0,1,3と異なりカウンタ入力として無効を宣言しないと汎用ポートに使用できません。プリスケーラ設定1/16にしていま す。カ ウンタTMR0は1μsec×16=16μsecを1クロックとしてカウントします。

F;    LED PWM 初期値

    MOVLW    D'10'
    MOVWF   RED
    MOVLW    D'50'
    MOVWF   GREEN
    MOVLW    D'100'
    MOVWF   BLUE

 PWMは0〜250の範囲でパルス幅が可変できる仕様です。初期値で動作開始時の各LEDの輝度をあえて変えています。ここを変えると配色が変わりま す。

;以下はメインルーチンです

LOOP1
G MOVLW    D'5'
    SUBWF    TIMER1,W            ;4msec×5=20msec
    BTFSS    STATUS,C
    GOTO    LP1

;    20msecに1回色変化する

    CLRW
    MOVWF    TIMER1

 はじめのMOVLW D'5'の設定値を変えることにより、配色変化の時間を4msec〜4msec×255=1.02秒まで変えることができます。

H DECF    RED
    DECF    GREEN
    DECF    BLUE
 
 色を変えるためにそれぞれ変数を-1しています。  

I
LP1
    CLRW   
    MOVWF    GPIO                ;ALL RED ON
    CALL    RESRGB

 はじめに全部のLEDを点灯させます。

J GOTO    LOOP1

 LOOP1までを無限ループします。

;以下はサブルーチンです。

K
RESRGB    ;約4msec ウエイト(プリスケーラ設定 1/16の場合、1/1だと250μsec)

    MOVLW    D'8'             ;256- (設定数-2) = 時間, 256-(8-2)=250μsec、250×16(プリスケーラ値)=4msec
    MOVWF    TMR0
WLOOP
    MOVF    RED,W           
    SUBWF    TMR0,W
    BTFSC    STATUS,C   
    BSF        GPIO,GP1        ;GP1=RED OFF

    MOVF    GREEN,W
    SUBWF    TMR0,W
    BTFSC    STATUS,C   
    BSF        GPIO,GP2        ;GP2=GREEN OFF

    MOVF    BLUE,W
    SUBWF    TMR0,W
    BTFSC    STATUS,C   
    BSF        GPIO,GP0        ;GP0=BLUE OFF

  
こ こで、各色をそれぞれRED、GREEN、BLUEの変数値によってOFFさせています。変数値が小さくなればLED ON時間が短くなり、暗くなり ます。大きくなれば明るくなります。R、G,Bの輝度比率が変わるので、3色以外の混合色が表現できます。

L
    MOVLW    COMP            ;TMR0がCOMP以下を見ている→プリスケーラ値が低い場合、RESRGB頭から命令実行中にカウンタが変わるので大きな値と比較する必要あり
                                        ;(プリスケーラ不使用時で 1命令 ≒ TMR0カウント 1カウントアップ)

   SUBWF    TMR0,W          ;TMR0 - W
    BTFSC    STATUS,C       ;TMR0 < W = C -> 0
    GOTO    WLOOP
    INCF    TIMER1              ;250μsec×16=4msecごとに+1
    RETURN

    END

 カウンターTMR0とCOMPの値を比較して4msec経過したかどうか見ています。TMR0はプリス ケーラ設定1/16なので、16μsecに1カウント アップします。ここのプログラムは4msec経過するまでWLOOP間をループします。基本的にはTMR0=0 (H’FF’からのオーバーフロー発生時)のときに4msec経過なので すが、プリスケーラの設定とループ内のプログラムの長さによっては次回見るときは数値が1,2,3,4、、、と上がっている可能性がありま す。場合に応じて適切にCOMPの値を決定し、それ以下で4msec経過したと判断します。

■ダウンロード

上記内容の回路図(pdf) MPLAB用プロジェクトファイル、ソースファイル(LHA圧縮)をダウンロードすること が出来ます。


■お問い合わ せ、ご質問は以下のところまでお願いします

有限会社ビーリバーエレクトロニクス 

http
://beriver.co.jp 

■PIC10F200、 pickit2のご 購入はこちらから可能です

■動作動画 デジカメの特性で再生映像は肉眼で見るのに比べ青、緑が綺麗に表現できていません。デ ジ カメのオートフォーカスゲインが大きすぎるせいか発光状況でフォーカスがずれます。