« みんな「レールスプリッタ」に魅せられるんだ | トップページ | CQ出版『現代版 真空管入門』 »

2022年6月24日 (金)

「UART←→IrDA」変換IC、MCP2122のクロック供給 #2

MCP2122のクロック供給(ボーレートの16倍の周波数)、8ピン・マイコンで
処理しようとすると、こんな感じかな。

まず、外部発振子が使える「ATtiny25~85」。
Cal20
「4.9152MHz」の発振子から素直に153.6kHzが作れます。
水晶でもセラロックでもOKというところ。

内部クロックしかダメな「ATtiny13A」の場合、
「工場出荷」状態のクロック精度が「10%」。
Cal12
ちょっときびしい。

ATtiny13Aだと、OSCCAL値を変えることでクロック周波数が
変化します。
Cal11
代表特性だと、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の倍の周波数。

問題はこの校正方法。
こんな回路にしてみました。
Cal21
小さい字で書いていますが、
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秒ほどで終了。
Cal11_20220625113301
OSCCALに設定する値を0から順に+1。(maxは127)
その時の1kHz↓エッジパルス間隔をソフトのループでカウント。
目標9.8304MHzと処理サイクル数から欲しいカウント値を
越えたところで停止。
今のと直前のカウント値を見て、どちらのOSCCAL設定を
使うかを決めています。
オシロ波形、PB4に出してる確認パルスを数えれば、
どれだけOSCCALを変えたかが分かります。
その値をフラッシュROMに記録(自己プログラミング)して、
次回の起動はその値を使ってという流れになります。
  フラッシュROMの空きには、そのあたりの
  情報も書いてますんで、読み出せば校正の結果が
  見えます。

※実験(デバッグ)してる様子
12_20220625155501
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  これを使う

 

|

« みんな「レールスプリッタ」に魅せられるんだ | トップページ | CQ出版『現代版 真空管入門』 »

IrDA」カテゴリの記事

AVRマイコン」カテゴリの記事

コメント

MCP2122へのリセット出力、ちょっと問題かも。
現在は、クロックを出力後、0.2秒間、Lを保持して(リセット状態)それからHに(リセット解除)してます。
ところが、うまく働かないことがあるのです。
  ※パルスを受けてるのに受信できない
いったんHに戻して再度リセットするとokに。
電源投入とも絡むんかな。
なんかちょっとクセがあります。
どうしたものか。

投稿: 居酒屋ガレージ店主(JH3DBO) | 2022年6月27日 (月) 17時51分

コメントを書く



(ウェブ上には掲載しません)




« みんな「レールスプリッタ」に魅せられるんだ | トップページ | CQ出版『現代版 真空管入門』 »