« 秋月の赤外光送受信モジュール(AE-RPM851A)を使ってみる(IrDAを試す) #2 | トップページ | みんな「レールスプリッタ」に魅せられるんだ »

2022年6月20日 (月)

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

秋月の赤外光送受信モジュール(AE-RPM851A)を使ってみる(IrDAを試す)
では、MCP2122へのクロック供給(ボーレートの1/16の周波数)
に「74HC4060:14bit バイナリカウンタ」を使いました。
「4060」の前段には発振回路を構成できるゲートが
仕込まれているので、4000番C-MOSの頃から、便利に
使っています。

  ※時計用の32.768kHz水晶から2Hzを取り出せますので
    (1Hzを出すには残念ながら1bit不足)
   計時用パルスを得るのに便利です。

秋月の赤外光送受信モジュール(AE-RPM851A)を使ってみる(IrDAを試す) #2
この時は、Arduino-UNOのタイマー2:OC2Aからクロックを供給。
Atmega-328Pの内部レジスタを直触りして「16MHz / 104」の
方形波を得ています。

Arduinoで用意された関数では、この手の「ハード直いじり」は
できません。
近いところは「tone()」ですが、
  Arduino-UNOでtone()の挙動を調べる

↑このようにソフトでパルスを出していますので、安定した
方形波は出てきません。(高い周波数も無理)


【余談】
AVRマイコンで覚えておいて欲しいテクニック
AVRマイコンの出力ポート、
  ポート入力レジスタに1を書くと出力がトグルする
という機能があるのです。

いわゆるLチカ。 代表はこれでしょか。
void loop() {
  digitalWrite(LED_PIN, HIGH);
  delay( 1000 );
  digitalWrite(LED_PIN, LOW);
  delay( 1000 );
}

delay()を使わず、あるタイミングで点滅させると
なると、こんな感じ。
  digitalWrite(LED_PIN, !digitalRead(LED_PIN));

LEDがつながったピンのH/Lを読んで、それを反転出力する
というまっとうな方法です。
  ※負荷が重くって(電流の流し過ぎ)ポート入力の
   H/L読み出しをミスると、誤作動。

そして、レジスタの直書きを許容すると、
  PORTB ^= (1 << PB5); // LEDはPB5
となります。
これは、
  出力ポートの状態を読んで
  特定ビットをXORで反転
  出力ポートに書きもどし
と、3つの命令に分けて処理します。
  ※AVRマイコン、I/Oレジスタのビット反転を
   1命令で行う命令を持っていないので。
ということは、割り込み処理と競合するポートなら
「アトミック操作」(割込禁止、割込再開)の手順が
不可欠です。

さて、ここからが覚えておいて欲しい内容。
AVRマイコンのデータシート、「I/Oポート」のところを
読むと「Toggling the Pin」という項目をが見つかります。
「PINレジスタに1を書くと、ピンの出力がトグルする」
と解説されています。

PINレジスタはポートの入力レジスタ。
それへの書き込みなんで違和感がありますが、AVRマイコン
特有の機能です。

SBI命令が使えるので「2クロック」で処理ができます。
割り込みとの競合も無関係。

LEDの点滅だと、
  PINB |= (1 << PB5); // LEDはPB5

コンパイラはこんなアセンブラの命令を出します。
  SBI PINB,5  // PINBのbit5をセットせよ

ポートの反転が1命令でできるのです。

さて、今回の本題。
「UART←→IrDA」変換IC、MCP2122のクロック供給を
どうしたものか・・・

・74HC4060を使うとシンプルだが、MCP2122のリセット
 操作に電源電圧検出ICがいる。
・8ピンのマイコンを使ってクロック供給してもOKだが
 マイコン内蔵のクロックの精度だとちょい不安。
・クロック精度はせめてセラミック発振子級で。
  もちろん水晶でもOK。
・マイコンを使ったら、マイコン内蔵の電源電圧低下
 検出が使えてリセットICが不要になる。

AVRマイコンにしろPICマイコンにしろ、
 ・外付け水晶(セラミック発振子)が使用可能。
 ・内蔵タイマーから直接方形波を出力するポートがある。
 ・電源電圧低下検出機能(BOD)あり。
という条件かと。

電波リモコンTele Auto FX-1修理:300kHzセラロック発振子がアウト
ここではATtiny13Aの内蔵クロックを利用しました。
  ※単品の修理だし、精度はあまり要求されなかったから

マイコンの内蔵クロック、その周波数を微調できる機能を
持っているものがあります。
昔々、「内蔵クロック周波数の自動補正」を試したことが
ありました。
  ・クロック周波数を読む。
    (特定ポートに出すパルスの)
  ・許容範囲外なら発振周波数補正値をちょいと
   触って、フラッシュROMを再書き込み。
  ・周波数の動き具合を見て補正値を増減。
こんなことを試したことがあります。
しかし・・・
電源電圧や温度での周波数変動を考えると、
「発振子を使うほうが間違いないでぇ」となって、
やめちゃいました。

今回のクロック供給、さて、どうしたものかと・・・

MCP2122は8ピンのICですが、シリーズのMCP2120(14pin)
だと、発振回路が内蔵されています。
ボーレートに合った水晶をつなげばOK。
9600BPSなら3.6848MHzあるいは7.3728MHz
  ※ボーレートの384倍あるいは768倍を切り替え
このICだと発振回路の心配はなくなります。
  ※リセット回路は必要


|

« 秋月の赤外光送受信モジュール(AE-RPM851A)を使ってみる(IrDAを試す) #2 | トップページ | みんな「レールスプリッタ」に魅せられるんだ »

Arduino」カテゴリの記事

IrDA」カテゴリの記事

コメント

コメント先。 うまいこといくかな?
https://fumimaker.net/entry/2020/01/07/190211
https://www.facebook.com/noriyuki.shimotsuma/posts/pfbid02cTizrVgXGV9TS1yVFDFeFG6LNJDUBTaB5AEUuQTUYvKwTyExqavpWn9fma8JjEsVl

投稿: 居酒屋ガレージ店主(JH3DBO) | 2022年6月30日 (木) 12時08分

コメントを書く



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




« 秋月の赤外光送受信モジュール(AE-RPM851A)を使ってみる(IrDAを試す) #2 | トップページ | みんな「レールスプリッタ」に魅せられるんだ »