PIC10F200のサ
ンプルプログラムU 2007.10.13
■動作
一番小さいPIC、PIC10F200(8ピン DIP品)を使って、赤、緑、青(Red、Green、Blue)のLEDを各々独立してPWM(パル
ス幅変調)で調光するサンプルプロ
グラムです。PWMはポートのH、Lの比率を変えてLEDの明るさを変えます。
開発環境はPICのサイトから無料でダウンロードできる統合開発環境MPLAB
V7.6x と添付するアセンブラで製作
しました。
MPLABのインストゥール、使い方、アセンブラの仕様などはネット上に多くの例がありますので、それを参考に行なえると思います。書き込み器は電源も供
給で
きる
PICKit 2 を
使用しました。
■PWM観測波形
■回路図
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シリーズはリセット回路も内蔵しています。
■プログラム
;---------------------------------------------------
; 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のご
購入はこちらから可能です
■動作動画 デジカメの特性で再生映像は肉眼で見るのに比べ青、緑が綺麗に表現できていません。デ
ジ
カメのオートフォーカスゲインが大きすぎるせいか発光状況でフォーカスがずれます。
LA留学