PICを使った30分、60分オフタイマーの製作

私が寝室で使っているテレビのマイコンに不具合があり、リモコンで消したテレビの電源が勝手に入ったり、オフタイマーが働かなかったりしていました。PICマイコンがなんとか使えるようになったので、PICの学習も兼ねてテレビにも使えるオフタイマーを作ってみました。

PIC12F629を使ったオフタイマーの製作

PICマイコン楽天 がなんとか使えるようになったので、PICの学習も兼ねてテレビにも使えるオフタイマーを作ってみました。うまくできましたので紹介します。PICマイコンPIC12F629と秋月電子通商のソリッドステートリレー(SSR)のキットを利用して作りました。

PICのアセンブラープログラムはフリーソフトのTera-Padエディターで作成しました。PIC開発ツールはMicrochip社のMPLAB IDE Ver.7.4、PICプログラムの書き込みは秋月のAKI-PICプログラマーVer.4を使いました。

もちろん、テレビ以外にもラジオやラジカセ、時間の変更や放熱板の変更でエアコンでも使えるようにできます。

30分、60分オフタイマーの製作方法

完成した基板と周辺機器

オフタイマー基板等の写真

左からDC5V用の携帯電話充電用電源アダプタ、秋月のSSRキット、PIC12F629を使ったタイマー基板です。ケースに入れる前の状態です。何度もPICのプログラムを書き換えて試せるようにICソケットを使っています。

PIC12F629でタイマーを作る場合はセラロックか水晶発振子を使った方が良いのですが、内部発振でもそこそこの精度があります。また回路が非常に簡単なのも魅力です。

30分、60分オフタイマーの回路図

PICを使ったオフタイマーの回路図

秋月のソリッドステートリレーはフォトトライアックを使っているので直流電圧をかけてやる必要があります。またPICマイコンを働かせるには5V程度の電源が必要です。これらは不要になった携帯電話の充電用のACアダプタを使いました。DC5V0.55Aでスイッチングレギュレータで電圧は安定化されています。

製作の注意点と使い方

PICアセンブラープログラム

PICで正確なタイマープログラムとするには

できるだけ正確な時間のタイマーにする為に工夫したところを紹介します。プログラムはアセンブラーで作成しています。

要するに500mSを遅らせるサブルーチンプログラムの中の2mSを作る部分で、PIC内部クロックが正確ならばこの精度をきっちり2mSになるようにしたことです。500mSのサブルーチンの誤差はサブルーチンコールも入れて+5μS程度です。プログラム上での精度は1/100,000以下です。

私がプログラム作成の参考にした秀和システムの「やさしいPICマイコンプログラミング&電子工作」高橋隆雄著 ではgoto命令を1サイクルとしていますが、これは間違っています。

(128ページにPIC16F628のgoto命令は1サイクルと書いてあります。また4μS*250=1000μSと言っておきながら、250でなく240をセットしていると歯切れの悪い表現になっています。それなら5μS*200=1000μSではありませんか。)

(ラーメンタイマーの記事(PIC12F629を使用)で248ページの1mSを作る部分で4*250=1000μSとしています。正確にはgoto命令が2サイクルなのでnopをひとつ減らす必要があります。)

PIC12F629のgoto命令は2サイクルが正しいのです。いくら実験しても正確な時間にならないのでよく調べてみてわかりました。

また最初のDLY_1ループでできるだけサイクル数を多くした方が正確な時間にすることができます。これはレジスターが8ビットなのでループ回数は256以内に制限されるので、サイクル数を多くするとDLY_1ループの時間が長くなり、このループ外の誤差が同じなら誤差を少なくすることができるからです。このサイクル数を8としましたので、内部クロック4MHzでは1サイクル=1μSなのでここで8*249=1992μSとなります。

次にDLY_2を一巡するサイクル数を考えると前半で( )でくくったサイクル数の合計は6サイクルで6μSです。後半では、本来のDLY_1部分の8サイクルを除いてやると2サイクルで2μSとなります。クロックが正確なら合計で正確な2000μSとなります。

DLY_500		;500mS
movlw	d'250'	;		2mS*250=500mS
movwf	CNT2	;
DLY_2	;2mS	;    DLY_2 loop	DLY_2 を一巡する時間 6+ 8*249 +2=2000μS
movlw	d'249'	;	(1)	1cycle=1μS
movwf	CNT1	;	(1)
nop		;	(1)
nop		;	(1)
nop		;	(1)
nop		;	(1)
DLY_1	;    DLY_1 loop
nop		;1	 1
nop		;1	 1
nop		;1	 1
nop		;1	 1
nop		;1	 1
decfsz	CNT1,f	;1	 2	(TMP_CNT1が0になると2サイクル)
goto	DLY_1	;2		(goto は2サイクル)
decfsz	CNT2,f	;	 1
goto	DLY_2	;	(2)
return		;

オフタイマーのアセンブラープログラム

オフタイマーのアセンブラープログラム

私の作成したアセンブラープログラムです。プログラム部分をエディターに読み込んでファイル名をtimer30_60.asm等にして保存して使ってください。