はじめに
この実装設計は、AitendoのAKIT-112にMCU書き込み不具合並びに、MCU添付不足という事態が発生していたことに基づいてハードに合わせてSoftwareを書き起こそうとしたことから始まりました。同じような構成の時計キットのキットが入手できてこちらは動作にこぎつけていたのです。
この実装設計は、AitendoのAKIT-112にMCU書き込み不具合並びに、MCU添付不足という事態が発生していたことに基づいてハードに合わせてSoftwareを書き起こそうとしたことから始まりました。同じような構成の時計キットのキットが入手できてこちらは動作にこぎつけていたのです。
Hardware
AT89C2051は、ATMEL製の8051互換のCMOS/FLASH搭載のMCUで、8051同様に2KBのプログラム領域をもち、128Bの広大なRAMを搭載しています。
このAKIT112は、12MHzのXTALとAT89C2051、設定SW一つ、六個の7Seg LEDとドライバートランジスタなどで構成されています。同様な中華製時計キット(SHE879)とは7Seg LEDのセグメント配置とLEDの桁ドライブ配置とが異なりますが、基本的には同様な構成です。
AT89C2051は、ATMEL製の8051互換のCMOS/FLASH搭載のMCUで、8051同様に2KBのプログラム領域をもち、128Bの広大なRAMを搭載しています。
このAKIT112は、12MHzのXTALとAT89C2051、設定SW一つ、六個の7Seg LEDとドライバートランジスタなどで構成されています。同様な中華製時計キット(SHE879)とは7Seg LEDのセグメント配置とLEDの桁ドライブ配置とが異なりますが、基本的には同様な構成です。
Software
開発環境は、手持ちのROMライター(Topwin6/TOP853)とFreeVersionのMikroC Pro for 8051 V3.6.0です。ROMライターはWindows7の上で動作させています。Flash搭載のMCUなので小気味よく消去、書き込みが出来ますが落ち着いてデバッグが必要です。なお、Mikro C Pro for 8051では、内蔵タイマーやI/Oなどのシミュレーション機能はありません。割り込み条件を起こすことは出来ますのでデバッグはやりやすいかと思います。
開発環境は、手持ちのROMライター(Topwin6/TOP853)とFreeVersionのMikroC Pro for 8051 V3.6.0です。ROMライターはWindows7の上で動作させています。Flash搭載のMCUなので小気味よく消去、書き込みが出来ますが落ち着いてデバッグが必要です。なお、Mikro C Pro for 8051では、内蔵タイマーやI/Oなどのシミュレーション機能はありません。割り込み条件を起こすことは出来ますのでデバッグはやりやすいかと思います。
UIの目標
残念ながら、Aitendo AKIT112の動作するものが有りませんので同様な中華製Kit SHE879の動きに範をとって動作面からUIを作りました。
1) 電源Onで00:00:00からのスタート(ただし、Litium電池で保持出来る)
2) 通常モードから表示offモードへは操作キーのクリック
3) 通常モードから時刻設定モードへは操作キーの長押しで分表示の設定を点滅で表し
クリックで現状表示時刻からの分パートをインクリメント、長押しで時表示の設定を点滅で表し、クリックで現状表示時刻の時パートをインクリメント、ここから長押しで通常モードへ遷移する
残念ながら、Aitendo AKIT112の動作するものが有りませんので同様な中華製Kit SHE879の動きに範をとって動作面からUIを作りました。
1) 電源Onで00:00:00からのスタート(ただし、Litium電池で保持出来る)
2) 通常モードから表示offモードへは操作キーのクリック
3) 通常モードから時刻設定モードへは操作キーの長押しで分表示の設定を点滅で表し
クリックで現状表示時刻からの分パートをインクリメント、長押しで時表示の設定を点滅で表し、クリックで現状表示時刻の時パートをインクリメント、ここから長押しで通常モードへ遷移する
処理方針
1) 8051のタイマーを用いてソフトに起因する誤差が起きないように処理する。
2) LEDのダイナミック点灯にはちらつきがない程度の周期で更新する(mSオーダー)
3) 二種類の基板を制御できるように、#ifdefで差分情報を選択させる
4) 適切な変数サイズで設計する(8051は8bitマイコンであり時計ロジックはcharで十分)
1) 8051のタイマーを用いてソフトに起因する誤差が起きないように処理する。
2) LEDのダイナミック点灯にはちらつきがない程度の周期で更新する(mSオーダー)
3) 二種類の基板を制御できるように、#ifdefで差分情報を選択させる
4) 適切な変数サイズで設計する(8051は8bitマイコンであり時計ロジックはcharで十分)
実装上の工夫
1) UI上必要なBlink機能の実装をダイナミック点灯処理とメインロジックとで分担
2) Blink周期のオーダーは、ゆっくりでよいので周期カウンターの上位ビットを適当に選択して利用
経緯と課題
1) 8051では連続タイマー動作が8ビットでしかかけられないことから、当初16ビットタイマーを割り込み処理側で補正しながら使う構成で試作した。
–>カウンターの更新が連続して動作していることを考慮して読みだし補正することを処理したがデバッグしきれず、8ビットタイマーを用いて処理分割した
2) モジュール化を細かく実施したところ、動作しなくなった。
–>スタックがあふれたように見受けられたのでコードは関数としては大きな構成にしてしまった。
3) Optmize版ではidleモードを導入して出来るだけCPUを止めて、電流を抑えている。
–>Main版では、250us周期でwakeupしているので消費電流が大きい。
Optimize版では、2.5ms周期でのダイナミック点灯処理の間は、止まっている。(ダイナミック点灯処理は64uS)、25ms周期での処理は30uS程度しか走らないので、ほぼスリープすることになります。
1) 8051では連続タイマー動作が8ビットでしかかけられないことから、当初16ビットタイマーを割り込み処理側で補正しながら使う構成で試作した。
–>カウンターの更新が連続して動作していることを考慮して読みだし補正することを処理したがデバッグしきれず、8ビットタイマーを用いて処理分割した
2) モジュール化を細かく実施したところ、動作しなくなった。
–>スタックがあふれたように見受けられたのでコードは関数としては大きな構成にしてしまった。
3) Optmize版ではidleモードを導入して出来るだけCPUを止めて、電流を抑えている。
–>Main版では、250us周期でwakeupしているので消費電流が大きい。
Optimize版では、2.5ms周期でのダイナミック点灯処理の間は、止まっている。(ダイナミック点灯処理は64uS)、25ms周期での処理は30uS程度しか走らないので、ほぼスリープすることになります。
総括
コロンの部分の電流は常時流れてしまいますので、本来は、ここもダイナミック点灯にすると減るでしょうね。
コードはgithubに置いている。
西山 茂丸 様
1.質問です。本CLOCKのCPUですが、AT90S2313ではだめです?AT89C2051
でないとだめですか?H/Wの問題は当方で対応します。
2.厚かましいお願いですが、IC(CPU)を木更津の方へ郵送しますので、
本CLOCKのソフトを書きこんで、御返送(返信用封筒も送付。)頂けますか?
当方には書き込み器が有りません。
以上、質問と厚かましいお願いでした。よろしくお願いします。
敬白
喜多村さん、こんにちは。
1.質問です。本CLOCKのCPUですが、AT90S2313ではだめです?AT89C2051
でないとだめですか?H/Wの問題は当方で対応します。
AT90S2313はATMEL社でのチップですがシリーズが異なりますので、本ソフトは8051シリーズのAT89C2051で動作するようになっています。
Cソースの提供はgithubから可能ですが、移植してハード相違点などに対応しないといけないです。
2.厚かましいお願いですが、IC(CPU)を木更津の方へ郵送しますので、
本CLOCKのソフトを書きこんで、御返送(返信用封筒も送付。)頂けますか?
当方には書き込み器が有りません。
89C2051に書き込むのでしたらお引き受けしますが、あるいはコンパイルされたイメージが
そちらでシミュレート確認されているのでしたら、AT90C2313に書き込みもできるかと思います。
西山茂丸