「UART←→IrDA」変換IC、MCP2122のクロック供給 #2
MCP2122のクロック供給(ボーレートの16倍の周波数)、8ピン・マイコンで
処理しようとすると、こんな感じかな。
まず、外部発振子が使える「ATtiny25~85」。
「4.9152MHz」の発振子から素直に153.6kHzが作れます。
水晶でもセラロックでもOKというところ。
内部クロックしかダメな「ATtiny13A」の場合、
「工場出荷」状態のクロック精度が「10%」。
ちょっときびしい。
ATtiny13Aだと、OSCCAL値を変えることでクロック周波数が
変化します。
代表特性だと、9.6MHzで90くらいでしょうか。
※しかし、これがけっこう変動
そこで・・・まず問題。
9.6MHzから153.6kHzを出したいんだけれど・・・割り切れない。
クロック 9.6MHz÷153.6kHz = 62.5
デューティ50%の方形波駆動なのでタイマーの設定は1/62。
9.6MHz÷62 = 154.839kHz
解決方法として、内蔵クロックを9.6MHzにするのではなく、
153.6kHz × 62 = 9.5232MHz
153.6kHz × 64 = 9.8304MHz
に調整すると1/62あるいは1/64で誤差が出なくなる
分周比が使えるようになります。
9.8304MHzはATtiny25で図示した
4.9152MHzの倍の周波数。
問題はこの校正方法。
こんな回路にしてみました。
小さい字で書いていますが、
TP2に「1kHzパルス」を入れ込んでリセットしたら、
1kHzの周期を数えてそこから9.8304MHz近傍の
OSCCAL値を出そうという試み。
結果は内蔵フラッシュROMに自分書きして保存。
ATtiny13Aでの「Self-programming」は初体験。
※何かいけないようなことをしている気分・・・
EEPROMでも良かったのですが、
プログラムの中に置いたデータを書き換えるのは
どうすれば?
ATtiny13AのSPM命令、どう使うんだ?
SPMCSRレジスタ、制御の手順は?
の検証です。
ATtiny13AのROMメモリーは、わずかに1kバイト。
制御はとうぜんですが、アセンブラー。
なかなか楽しい。
※ATtiny13A制御のソースファイル(圧縮)
・ダウンロード - irda_x16_1.zip
ちょっと手直しして↓
・ダウンロード - irda_x16_1a.zip
※ATtiny25を使う場合 (XTAL必要)
・ダウンロード - irda_tn25_1.zip
ご自由にどうぞ。
・ヒューズの設定はソースファイル内に記しています。
正しく設定しないと動きません。
・ATtiny25だとプログラムはわずか58バイト。
RAMエリアの初期化ルーチンもありません。
・AVRマイコン・ATtiny13Aのフラッシュメモリ
「自己プログラミング」の例題になるかと思います。
この時しか使わない「AVRマイコンのSPM命令」。
その使い方のサンプルにどうぞ。
アセンブラで書けばマイコンへ命令している
様子がよくわかるかと。
「C」はいろんな関数があって便利なんですが、
あれこれ余計にところ(いろんなマイコンに対応)まで
記述されていて「ほんまはどう動いてんねん!?」が
隠れてしまうことがありますんで、困ったものです。
そうそう。「自己プログラミング」する時は
AVRマイコンのSUT、BODヒューズ
の中の「SELFPRGEN」ヒューズを「許可=0に」しなくちゃ
いけません。
※1kHzクロックパルス供給によるOSCCALの校正実行
校正処理、こんなタイミングです。
2秒ほどで終了。
OSCCALに設定する値を0から順に+1。(maxは127)
その時の1kHz↓エッジパルス間隔をソフトのループでカウント。
目標9.8304MHzと処理サイクル数から欲しいカウント値を
越えたところで停止。
今のと直前のカウント値を見て、どちらのOSCCAL設定を
使うかを決めています。
オシロ波形、PB4に出してる確認パルスを数えれば、
どれだけOSCCALを変えたかが分かります。
その値をフラッシュROMに記録(自己プログラミング)して、
次回の起動はその値を使ってという流れになります。
フラッシュROMの空きには、そのあたりの
情報も書いてますんで、読み出せば校正の結果が
見えます。
※実験(デバッグ)してる様子
SOPのATtiny13Aを4つ用意して(DIP変換基板にハンダ)
あれこれと。
※ATtiny13Aでの校正値の取得方法
MCP2122への供給クロックは153.6kHz。
153.6kHz* 64 = 9.8304MHz。←これに合わせ込む
(1) OSCCALを0から順に+1。 maxは127。
(2) INT0入力1kHzパルスの↓エッジ間の時間を
ループカンタで計測。
(3) 目標の「9.8304MHz」は1msで=9830クロック。
そして、ループのサイクル数が7。
(4) 9830/7で「1404」が判定するカウント値。
(5) この値と同じか大きくなったらOCSCALの
インクリメントを停止。
(6) 直前のカウント値と停止したカウント値、
どちらが「1404」に近いかを判断して、
どちらのOSCCALを使うか(今のか直前のか)
を判断。
(7) 結果をフラッシュROM(0x01F0~0x01FF)に残す。
・フラッシュROMに残すデータ(wordで示す)
0x01F0: 1kHz校正データ これをOSCCALとして使う。(a)
CNT_H検出時のOSCCALデータ。
0x01F1: 工場出荷時のOSCCALLデータ。
0x00
0x01F2: 1kHzチェックカウンタ L側。
カウント越え直前のカウント値
0x01F3: 1kHzチェックカウンタ H側。
1404カウントを越えた時のカウント値
※欲しいのは(a)のデータだけ。
あとはチェック用。
・校正例 チップ#2
工場出荷時のOSCCAL値 65
工場出荷時OSCCALでの周波数 149.9kHz
校正後のOSCCAL 67
校正後の周波数 153.1kHz
直前のカウント値 1397 ←1404に近い
直前のOSCCAL値 67 これを使う
検出カウント値 1413
検出OSCCAL値 68
・チップ#4
工場出荷時のOSCCAL値 77
工場出荷時OSCCALでの周波数 142.0kHz
校正後のOSCCAL 84
校正後の周波数 153.3kHz
直前のカウント値 1392
直前のOSCCAL値 83
検出カウント値 1407 ←1404に近い
検出のOSCCAL値 84 これを使う
| 固定リンク
「IrDA」カテゴリの記事
- FLUKE 87IV デジタルテスターのデータをIrDAで吸い上げる(2022.11.15)
- 周波数つながりで、赤外線受光モジュールのBPF周波数(2022.07.23)
- 手持ちの赤外線リモコン受光モジュールを発掘してみたら・・・(2022.07.08)
- シリアル通信ボーレートとクロック周波数(2022.07.07)
- 「糸ようじ」のプラケースを使うシリーズ:赤外線リモコンチェッカー(2022.07.07)
「AVRマイコン」カテゴリの記事
- ATmega4809のシリアルポート(2023.01.18)
- PWMでD/A変換:アナログマルチプレクサの応用で(2023.01.02)
- ガレージのLED表示デジタル時計がダウン(2022.12.20)
- FLUKE 87IV デジタルテスターのデータをIrDAで吸い上げる(2022.11.15)
- 数値をBCD出力(表示)するルーチン(2022.10.08)
コメント
MCP2122へのリセット出力、ちょっと問題かも。
現在は、クロックを出力後、0.2秒間、Lを保持して(リセット状態)それからHに(リセット解除)してます。
ところが、うまく働かないことがあるのです。
※パルスを受けてるのに受信できない
いったんHに戻して再度リセットするとokに。
電源投入とも絡むんかな。
なんかちょっとクセがあります。
どうしたものか。
投稿: 居酒屋ガレージ店主(JH3DBO) | 2022年6月27日 (月) 17時51分