PIC16F84電子遊戯(19) |
最終更新日:2001年4月13日 |
ミラクルライト特別編(1ページ) (2ページ)へ |
|
ミラクルライト特別編を作ろう |
今回はミラクルライトと回路図を同じでソフトを変更して色が徐々に変わるものを作りましょう。題して「ミラクルライト特別編」です。
まずは回路図を見て下さい。SWが付いていないだけでミラクルライトと全く同じです。 |
|
(ミラクルライト特別編の回路図) |
回路はミラクルライトと同じなので説明はしません。ただソフトの基本も同じにしていますので、SWが付いていたところにはそのまま抵抗を付けておきます。
今回は特別ケースに超高密度実装を行います。マイコンの足に直接部品をハンダ付けして組み込みます。では完成予想(?)写真を見て下さい。 |
|
(ミラクルライト特別編の雄姿) |
ミラクルライト特別編の基本仕様 |
特別編として次の基本仕様を考えます。
1)ミラクルライトの色を徐々に切り換えて表示する。その色数はなんと56色!!
今回はこの仕様のみとします。 |
ミラクルライト特別編のポート割付、方向・初期設定、タイマー割り込み設定 |
ポート割付、ポート方向設定、ポート初期設定、タイマー割り込み設定はミラクルライトの時と全く同一です。詳しい説明はそちらを参照して下さい。 |
ミラクルライト特別編のLED制御 |
各LEDはミラクルライトの時と同じく約200usecの割り込みを基準クロックにしてON/OFFすることによって、輝度を変化させます。各LEDはそれぞれ8つのパターンで点灯させます。
200usecの割り込みを何回カウントするかで、時間を決定します。 |
モード |
点灯0 |
点灯1 |
点灯2 |
点灯3 |
点灯4 |
点灯5 |
点灯6 |
点灯7 |
点灯時間 |
0h |
10h |
20h |
30h |
40h |
50h |
60h |
70h |
消灯時間 |
70h |
60h |
50h |
40h |
30h |
20h |
10h |
00h |
|
(8パターンの割り込みカウント設定値) |
モード |
点灯0 |
点灯1 |
点灯2 |
点灯3 |
点灯4 |
点灯5 |
点灯6 |
点灯7 |
点灯時間 |
0ms |
3.1ms |
6.1ms |
9.2ms |
12.3ms |
15.4ms |
18.4ms |
21.5m |
消灯時間 |
21.5ms |
18.4ms |
15.4ms |
12.3ms |
9.2ms |
6.1ms |
3.1ms |
0ms |
|
(8パターンの設定時間) |
点灯・消灯時間を細かく制御して8パターンの輝度を用意しました。
これらの組み合わせで色が徐々に変化していく効果を出しましょう。
LED制御そのものはミラクルライトと全く同じですので、LED設定時間RAM、時間ワークRAM、LED出力イメージRAMも全く同じです。各々のLEDに対するプログラムも同じですので、詳細はミラクルライトの記事を参照下さい。 |
ミラクルライト特別編の色変更処理 |
前回のミラクルライトは2バイト分のRAMのうち9bit分を使用して16色の切り換えを行いましたが、今回は2バイトで56色の切り換えを行います。 |
auto_count1 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
色(黒) |
色(白) |
色(紫) |
色(青) |
色(水) |
色(緑) |
色(黄) |
色(赤) |
|
(色切り換えRAM) |
auto_count2 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
輝度(7) |
輝度(6) |
輝度(5) |
輝度(4) |
輝度(3) |
輝度(2) |
輝度(1) |
輝度(0) |
|
(色切り換えサブRAM) |
色変更ルーチンled_next btfss auto_count2,7
goto led_next2
btfss auto_count1,7
goto led_next3
movlw 01h
movwf auto_count2
movwf auto_count1
led_nexte call led_set
return
led_next3 rlf auto_count1,1
bcf auto_count1,0
movlw 01h
movwf auto_count2
goto led_nexte
led_next2 rlf auto_count2,1
bcf auto_count2,0
goto led_nexte
|
1)色切り換えサブRAM(auto_count2)の7bit目が「1」か調べて、そうでないときは色切り換えサブRAM(auto_count2)を左回転します。このとき0bit目には「0」を入れます。
2)色切り換えサブRAM(auto_count2)の7bit目が「1」のときは色切り換えRAM(auto_count1)の7bit目が「1」か調べて、そうでないときは色切り換えRAM(auto_count1)を左回転します。このとき0bit目には「0」を入れます。
同時に色切り換えサブRAM(auto_count2)を「1」=輝度(0)にします。
3)色切り換えRAM(auto_count1)の7bit目が「1」のときは色切り換えRAM(auto_count1)を「1」=色(赤)、色切り換えサブRAM(auto_count2)を「1」=輝度(0)にします。
4)上記設定が済めば実際に各LEDの点灯・消灯時間を設定するルーチンに行きます。 |
ミラクルライト特別編の色仕様 |
今回のミラクルライト特別編で設定した色を説明します。 |
|
auto_count2 |
|
ビット位置 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
変化 |
auto_count1 |
R |
G |
B |
R |
G |
B |
R |
G |
B |
R |
G |
B |
R |
G |
B |
R |
G |
B |
R |
G |
B |
R |
G |
B |
|
0 |
0 |
0 |
0 |
1 |
0 |
0 |
2 |
0 |
0 |
3 |
0 |
0 |
4 |
0 |
0 |
5 |
0 |
0 |
6 |
0 |
0 |
7 |
0 |
0 |
無-赤 |
1 |
7 |
0 |
0 |
7 |
1 |
0 |
7 |
2 |
0 |
7 |
3 |
0 |
7 |
4 |
0 |
7 |
5 |
0 |
7 |
6 |
0 |
7 |
7 |
0 |
赤-黄 |
2 |
7 |
7 |
0 |
6 |
7 |
0 |
5 |
7 |
0 |
4 |
7 |
0 |
3 |
7 |
0 |
2 |
7 |
0 |
1 |
7 |
0 |
0 |
7 |
0 |
黄-緑 |
3 |
0 |
7 |
0 |
0 |
7 |
1 |
0 |
7 |
2 |
0 |
7 |
3 |
0 |
7 |
4 |
0 |
7 |
5 |
0 |
7 |
6 |
0 |
7 |
7 |
緑-水 |
4 |
0 |
7 |
7 |
0 |
6 |
7 |
0 |
5 |
7 |
0 |
4 |
7 |
0 |
3 |
7 |
0 |
2 |
7 |
0 |
1 |
7 |
0 |
0 |
7 |
水-青 |
5 |
0 |
0 |
7 |
1 |
0 |
7 |
2 |
0 |
7 |
3 |
0 |
7 |
4 |
0 |
7 |
5 |
0 |
7 |
6 |
0 |
7 |
7 |
0 |
7 |
青-紫 |
6 |
7 |
0 |
7 |
7 |
1 |
7 |
7 |
2 |
7 |
7 |
3 |
7 |
7 |
4 |
7 |
7 |
5 |
7 |
7 |
6 |
7 |
7 |
7 |
7 |
紫-白 |
7 |
7 |
7 |
7 |
6 |
6 |
6 |
5 |
5 |
5 |
4 |
4 |
4 |
3 |
3 |
3 |
2 |
2 |
2 |
1 |
1 |
1 |
0 |
0 |
0 |
白-無 |
|
(56色設定内容) |
実際の処理については余にも長い(私が未熟?)のであとでソースをじっくり見て下さい。 |
ミラクルライト特別編の色変化時間処理 |
ビット数 |
カウント数 |
時間 |
13bit |
8192 |
1572msec |
1.6秒 |
|
(カウント数と時間) |
ミラクルライトと同様の処理で色を切り換える時間を決めます。
ミラクルライトの時と同じ2バイトのRAMを用意して割り込みごとにカウントUPします。
色を変化するタイミングはこのRAMの指定する位置にビットが立ったかで判断します。
特別編では約1.6秒ごとに色(輝度)が変化します。 |
色変化時間処理 movlw 01h
addwf auto_sub,1
btfsc STATUS,0
incf auto_sub2
btfss auto_sub2,5
goto red_leds
call led_next
movlw 00h
movwf auto_sub
movwf auto_sub2
;-----------------------
red_leds
|
1)オート時間カウント1(auto_sub)をインクリメントする。桁が繰り上がる時はオート時間カウント2(auto_sub2)をインクリメントします。
2)オート時間カウント2(auto_sub2)の5bit目が「1」か調べる。「1」でなかったら次の処理へ行く。「1」だったら各LEDの点灯・消灯時間を設定するルーチンへ飛びます。
3)オート時間カウント1(auto_sub)、オート時間カウント2(auto_sub2)をリセットします。 |
ということで、今回はこのあたりまでにしておきます。
次回はいきなり完成します。それでは、お楽しみに。
今後も「PIC16F84電子遊戯」をよろしくです。 |
この続きは(2ページ)へ |
|
不明点などあればメールお願いいたします。nonchansoft@nifty.com |
|
|