ドットマトリックスを使った流れる時計製作(LEDスクロール時計) H22.1一部修正 ホームページへ戻る
既に、スクロール時計はキット化されており今更ですが、必要に迫られた(夜中でも見える時計)のとダイナミック表示のお勉強で、
作ることにしました。
1 基本仕様
・表示装置 8x16ドット(8x8を2組)
・月差±1秒以内(目標?)
・アラーム 1ch
・温度表示
・電源 ACアダプター(停電補償回路付加)
2 回路構成
・部品を減らすためダイナミック制御をシフトレジスタICを使わないようにI/Oピンが多くて、A/Dコンバータ付き
の8535(家に眠っていた)を使用。
・ドットマトリックスは8x8(秋月電子38x38mm)を2つ使用。
AVRとの接続(制御) 行:B・Cポート、列:Dポート
・温度センサーS8100B(秋月電子 -40〜100℃ -8mV/℃)
・電源はDC9VのACアダプタ出力を三端子レギュレータで5V
9V側にバックアップ用のニッケル水素電池7.2V(006P型)を接続
回路図
3 ソフト
◇処理フロー
メインルーチン 時刻・アラームの修正、アラームOn/Off
割込み処理 時刻制御・表示・温度計測
◇時計制御とダイナミック表示
・正確な時計(時間)を刻み、ダイナミック制御でも周期的に表示列切替が必要なため、タイマ割込を利用する。
割込み周期は、ダイナミック表示更新時間(1/30S以下)、処理量および時計処理の簡素化を考えて次のようにした。
割込み時間(表示列切替時間) 1.25ms
表示更新周期 1.25msx16=20ms (1/50S)
文字スクロール周期 200ms (表示更新周期x10回) 試行錯誤で決定
時計の1S 表示更新x50回 20msx50=1S
・時計の微調整は、割り込み周期が800Hz(1/1.25ms)となるように、A-5ポートをチェック出力として使用し、周波数カウンタ
で周波数を確認して、タイマカウンタ値を調整。
精度:タイマカウンタはクリスタル周波数を直接使用しているので(125ns=1/8MHz)、調整は125n毎可能
125nsx3600sx24hx30日=0.324s(月差) クリスタルの温度変化等の変動が無い場合
・表示処理
LEDに表示させるビットデータ領域を76列分確保(76バイト)
実際の表示エリアは16列分なので、表示開始位置をスクロール周期で左にづらし16列分表示
・アラーム
時刻とアラーム設定時刻が一致している間(1分間)、200ms(文字スクロール周期を利用)のOn/Off繰り返しによる鳴動
◇温度
・1Sに1回サンプリングし表示を更新
・下記により1℃単位の計測とした。
S8100Bの温度−電圧特性は、−20℃:1.908V、80℃:1.095Vの比例特性(電源5V時) 温度≒80-125℃/V x
(V-1.095)
A/Dコンバータの基準電圧を2.047Vにすると 2mV/digit
∴温度=80−0.25(Vdigi−548) → 温度=(875−Vdigi)/4 (℃)(875=
868+7 +7は切捨等誤差補正)
今回はじめて基準電圧AREFをAVCCから任意の電圧に変更したが、思うような結果得られず悩む。原因は、ADCの活かし
(ADCSRのADENビット設定)を、使用時のみ活かしたため基準電圧が不安定となっていた。→常時設定にしたら解決。
◇時刻・アラーム合わせ(修正モード)
時刻合わせ処理は、時・分値の設定・アラームのon/offを順番に行うなうので、メインルーチンで処理する。
修正モード中も時計は正常に動くよう割り込み処理は、時刻処理およびKye入力の確認のみ行う。
◇Key操作
Key入力は、割り込み処理で入力されたものを、メインルーチンで処理する。
赤:設定モードへの移行および決定、(時刻の分決定時は、秒がは0秒に切り捨てでセット)
青:プラス・時刻修正選択、
通常モードでメッセージ1回表示
黄:マイナス・アラーム時刻修正選択、通常モードでアラームon/off
ソース
別バージョン
部品が入手できないとタイの方?から問合わせを頂いたので、CPUをMEGA8535(基本的に変更無し)に温度センサをLM35に
変更した回路・ソースを作りました。
回路図 ソース