「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だと発振回路の心配はなくなります。
※リセット回路は必要
| 固定リンク
「Arduino」カテゴリの記事
- 初めて買ったArduino UNO・・・今は(2023.05.25)
- 液晶表示コントローラ HD44780で迎撃(2023.05.16)
- Arduino UNOで3相モーターを回す(2023.05.01)
- Arduino サーミスタを使った温度測定で 【ゼロ除算問題】(2023.03.23)
- A/Dコンバータでサーミスタの抵抗値を読む サーミスタをつなぐ場所は?(2023.03.21)
「IrDA」カテゴリの記事
- FLUKE 87IV デジタルテスターのデータをIrDAで吸い上げる(2022.11.15)
- 周波数つながりで、赤外線受光モジュールのBPF周波数(2022.07.23)
- 手持ちの赤外線リモコン受光モジュールを発掘してみたら・・・(2022.07.08)
- シリアル通信ボーレートとクロック周波数(2022.07.07)
- 「糸ようじ」のプラケースを使うシリーズ:赤外線リモコンチェッカー(2022.07.07)
コメント
コメント先。 うまいこといくかな?
https://fumimaker.net/entry/2020/01/07/190211
https://www.facebook.com/noriyuki.shimotsuma/posts/pfbid02cTizrVgXGV9TS1yVFDFeFG6LNJDUBTaB5AEUuQTUYvKwTyExqavpWn9fma8JjEsVl
投稿: 居酒屋ガレージ店主(JH3DBO) | 2022年6月30日 (木) 12時08分