岩塩ランプ・プログラム(LED_M1)の概要
プログラムはMPLAB IDE7.50を用い作成しました.ソース・ファイルとHEXファイルを用意しました.HEXファイルはPIC16F648Aに秋月通商のAKI-PICプログラマV4構成で書き込みテストしたものです.また、JDMアダプタとIC-progV1.05Dのソフトでの書き込みテストしました。
ソース・プログラムは必要があれば,MPLAB IDEで修正し,動作を変更することができます.
●PICの使用条件
PIC16F648Aを次の条件で使用しています.
-クロックは内蔵の4MHzとしています.
-RA0はデジタル出力ですが、使用していません
-RA1,2,3,4はデジタル入力のスイッチ入力ですがRA1のみ使用しています。
-RB0-3の4ビットは起動時の動作を決めるためDIPスイッチ入力です。
-RB5,6,7はLEDをドライブするポートですが、RB7のみ使用しています。
-ソフトPWM処理等のためタイマ割り込み処理を使用しています.
-Config値は予め指定してあります。
以上の条件でプログラムしてあります.
●ソース・プログラムの概要
ソフトPWM処理を実現しています。タイマ割り込みは256μsごとに発生させて、PWM処理のクロックにしています。DIPスイッチの設定で次の動作を行います。
(ゼロはスイッチOFF、1はONを示す)
; RB3 RB2 RB1 RB0
; 0 0 0 0 常時点灯 SW1にて遅延消灯、即点灯
; 0 0 0 1 75%点灯 SW1にて遅延消灯、即点灯
; 0 0 1 0 50%点灯 SW1にて遅延消灯、即点灯
; 0 0 1 1 25%点灯 SW1にて遅延消灯、即点灯
; 0 1 0 0 ゆらぎ ランダム点灯1
; 0 1 0 1 ゆらぎ ランダム点灯2
; 0 1 1 0 ゆらぎ シーケンシャル点灯1
; 0 1 1 1 ゆらぎ シーケンシャル点灯2
; 1 x x x 予備(常時点灯動作になっています)
動作を設定するDIP値0〜3は、PWMのDUTY比の違いによる明るさを変更するものです。DIP値4〜7までは明かりをゆらゆら変化させるためにDUTY値を入れ替えています。DIP値8〜15はあけてあります。
RB7ポートには5端子レギュレータのON/OFF端子がつながれており、その出力がLEDにつながっていて、明るさを制御する点灯動作を行います。
RA1に接続されたボタン・スイッチは点灯中に押すと、約8秒後に消灯します。また、消灯しているときに押すと即点灯します。
(1) タイマ割り込みルーチン
タイマ0の割り込みを256μsごとに発生し、変数名count256μsでカウントします。この変数のカウントがオーバフローしたら、65536μsごと(約65ms)に変数名count65msでカウントします。
(2) 初期設定ルーチン
I/Oポートの入出力設定、内蔵クロックを4MHzへ、タイマ0の基本設定,DIPスイッチ用ポートのプルアップ、ポートAをディジタルへ設定、変数のクリアなど行います。
(3) メイン処理ループ ここの処理を繰り返す
DIPスイッチの値を読んで処理先にジャンプします。予備のDIP値8以降は単に100%の明るさで点灯するだけになっています。
(4) DIPスイッチの値 0番〜3番(調光)
スイッチング周期122HzでRB7ポートにPWM波形を出力します。ONしている時間を変化させています。
DIPスイッチの値が0ならばDUTY=100%です。連続点灯した明るさになります。DIPスイッチ値1はDUTY=75%、2はDUTY=50%、3はDUTY=25%で出力します。DUTY値とLEDの明るさは比例していません。
(5) DIPスイッチの値 4番〜7番(ゆらぎ)
ここでは、DUTY値を毎回変化させることにより、ろうそくや焚き火の明かりにしています。
DIPスイッチ値4番はランダムなDUTY値を32個準備して入れ替えています。ろうそくの明かりのつもりです。DIP値5番はもう少し少ない16個でやってみました。一方、DIPスイッチ値6番7番はDUTY値をシーケンシャル・データにしてあります。このあたりはぜひ値を変更して試してみてください。
(6)ソフトPWM処理ルーチン
256μsx32=8.192msが周期になります。最初にポートをONして点灯させたLEDを指定した256μsのカウント(DUTY)になったとき消灯させます。
(7)ボタン・スイッチ
点灯中にRA1に接続されたボタン・スイッチを押すと約8秒程度で消灯します。消灯しているときに押すと即点灯します。
ソース・プログラムのDIPスイッチ値8以降は空いていますので、オリジナル動作を追加できます。
2007年1月16 後田 敏