PIC 66:SW Controller for LED


[ SLEEPコマンドの追加 ]2010/10/6 [場所はここ]です。
[ SLEEPのまとめの追加 ]2010/10/7 [場所はここ]です。


 「mikroC PRO for PIC2010」になって、Soft作りが又少し変わりました。ボタン・ライブラリを使おうと簡単なプログラムを作って試してみました。
 これをやっていたら、Soft Ver3.8から4.1に変更になっていたのでダウンロードした。このプログラムは4.1でそのままコンパイル出来た。動作不安定の所があったが改善されたのでしようか(9/29)。

[全体の動作]
@SW(ボタン)を押すと[LED]が点灯する。
A次に押すとLEDは1秒間隔で点滅する(次に押されるまで継続する)。
B次に押されるとLEDを消す、@の入力待ち状態になる。
 ライブラリの使い方はプログラム内で[button(ポート・bit・time・アクティブ)]!。

[部品などの構成]
 PICは8ピンのPIC12F629を使い、内蔵の4MHz発振を使いました。
 端子はSW入力(GPIOの3)、出力としてLED(GPIOの2)を付け1KΩを通して点灯させる。
 ICは5Vで動作させる為、3端子レギュレータを付けた。
 プリント基板は実験用なので、以前の物を再利用した。
 ボタンも手元の物を使った。

[プログラム]
★メインプログラムは
1]フラッグが1ならLEDを逆にする(点灯なら消す、消えていれば点灯させる)。
2]0.5秒待つ。
3]SWをチエック(サブ)する。
4]1へ戻る。
★サブプログラムは
1]SW(ボタン)が押されてなければ即終了。
2]押されていれば、離れるのを待って次の処理をする。
 21]1度目ならLEDを点灯させる。
 22]2度目ならフラッグを立てる。これでメインプログラムはLEDを点滅させる。
 23]3度目ではLEDを消し、フラッグをクリヤー・回数を初期に戻す(SWは0回とする)。

コンフイグとして
 自己発振(4MHz)など定番に設定した。[$2007=0X31C4]

[改正されたコマンドに付いて]
 詳細はまだ理解していませんので略します、大文字・小文字などの設定が変更あり。下線が出てミス表示が表示され便利になりましたが、何所を如何に直したらよいか解らず、少し手惑いました。

 それにしても1年毎の変更は困った物です、変更して欲しくない。
 bitに関し[** at GPIO.B3]など、以前はGPIO.F3であったので勘違いをする。



[プログラムを作って!]
 少しミスエラーが続いたが、全体のプログラム量が少ないので直ぐ動くようになった。コンパイル出来れば、その後の修正は少なくて済みそうです。
 慣れがだんだんと解決してくれると思いますが、小さなプログラムで慣れてから複雑な物に手を出さないと、何所で間違えたのかわからなくなります。

 作った[プログラムはこれ]です。

[消費電流]
5Vレギュレーターで2.2mA、PICで1mA、LEDの点灯で約3mA。LEDの点灯状態で合計は6.2mAが現在の状態です。

[応用は・・・]
 「自転車のランプ」かなー、でもまだまだ工夫が必要です。
★スリープコマンドの追加も必要です。
★それに電池動作も考えないとダメだし。
★振動も多いので、問題多く不安・・・。

 制作 2010/9/25


[ SLEEPコマンドの追加 ]
 LEDのON-OFFをやりました。その後、OFFの時エネルギー使用は意味が無いので「SLEEPコマンド」を使って省エネにしようと試して見ました。
 動作はうまく行きました。ただPICを動作させるのに5Vのレギュレータを使っていますが、これが約2mAも使っています。せっかく全体を減らそうと思っていのにここでかなり電気を消耗しています。

 対策としては、全体をOFFにするのと、レギュレータを使わず電池で直接コントロールすれば省エネ動作が期待出来ます。今回は後者を考えて見ました。

 まずはSLEEPが完全に動作するか、を調べる事にしました。但し、前回はLEDの点灯・点滅・消灯の繰り返しでしたが、点滅を省略しました。

[動作の説明]
 電源ONでSLEEPに入り消費電流はゼロになります。次にボタンを押すと割り込み(変化)が発生しLEDを点灯させます。
 次にボタンが押されると、LEDを消してボタンが上がるのを確認してからSLEEP状態に入ります。
 これだとメカ・スイッチと同じですがICを使うと別な物も自動でコントロール出来るので「メカ・スイッチと同じ」ではないのです。

 テスターで動作を確認すると、SLEEP状態でほとんど電流は流れていません。これはSWが不要ということです。
 現在の状態は5Vのレギュレータがほとんどエネルギーを食っています。電池動作にすれば待機時にはエネルギーがほぼゼロになります(普通のテスターでは測定不能のレベル)。
 最後のプログラムで[SW Over ?]のチエックをしていますが、Button関数を使うと待っているようでSLEEPに入りませんでした、で次のコマンドに置き換えています。
while (GPIO.B3==0);
 それに電源のON-OFFをしないので、BOD動作はさせません(コンフイグの設定を変更しています)。これを設定しないと、少し消費電流が増加します(電流がゼロにならないので分かります)。

 今回は端子の位置は変更せず、プログラムの変更だけでICに書き込んで差し変えただけです。今回の[プログラムはこれ]です(コピーして[.c]にすればコンパイル出来ます:文字だけなので解り難かったかも知れません)。
(2010/10/06)

SLEEPのまとめ PIC12F629など(Type I/O Portchange)
 スリープ動作のメリット
 スリープコマンドを動作させると消費電流はほとんどゼロになる。従って、電池動作で休み期間がある場合、使うと節電に有効です。

 スリープから抜け出す!
 リセットや割り込みを利用すると再起動させることが出来ます。
 例えば、「INT」端子を使う・「ピン変化で動作する(ON-Chenge)」、「タイマー」などが用意されています。今回はピン変化を使ったのでこれを中心に説明します。

 外部の入力端子
 I/Oピンは各bitごとに、プルアップが可能です。但し、MCLR端子はプルアップとしては利用出来ません、ポート・チェンジ端子としては使えます。
 今回は前回の続きということで5.6KΩで(机にあったもの)プルアップして、同じ端子を使っています。他のピンを使えばこの抵抗は略せます。
 設定の手順
A.ポートを入力にする。TRSIOの設定。
B.プルアップする為、WPUレジスターで各ピンを設定(必要以外をプルアップしない)、約20KΩで接続されている状態で外部に抵抗があると電流が流れます。
C.OPTION_REGの7ピン(NOT_GPPU)を0に設定すると、プルアップ有効となる(普通と逆なので注意)。
 [今回はBとCは利用していない。]
D.ポートの変化を利用するので、そのピンをIOCレジスタで設定する。
E.割り込み許可をINTCONレジスタで設定する。
 GIE:Global Interrupt Enablebit
 PEIE:Peripheral Interrupt Enablebit
 GOIE:GPIO Portchange Interrupt Enablebit
 それぞれを1に設定すると作動する。
F.SLEEPを入れる。C言語ではコマンドがあるのか不明、でアセンブラの「asm SLEEP」を入れている。
G.割り込みがあるとIntrrupt()関数のプログラムが実行される。
 今回は何もせず、INTCON.GPIFでフラッグをクリヤーしている、これを入れないと再度割り込みが入る。
H.割り込みが終了すると、SLEEPコマンドの次の命令が実行される(SLEEPを抜ける)。
 注意点
☆PICの発振が再開されのでタイミングを使っている場合、安定してから(待ち時間を入れる)使うようにする。今回は単にLEDの点灯なので配慮しなかった。
☆プルアップされている端子に、流れ出すような低インピーダンスの物が接続されている場合、節電効果が薄れるので、流れ出す電流に注意する。
 対策としては、一時的にプルアップを止める。
☆最後のループを抜ける時、ボタン関数が予想の動作をしなかったので、シンプルなプログラムに変更した。
 [2010/10/7]

 [MENU] [MAIN MENU]

inserted by FC2 system