I2C液晶のアクセス、割り込みで処理しないようにすると
I2C液晶の処理と高レートのタイマー割り込みとの競合、
その原因がI2C液晶アクセスでの割り込み処理だという
ことがわかりました。
I2Cアクセスでの最後、I2Cバスを待機状態に戻す
「ストップコンディション」の処理に時間待ちが
入れられていました。
割り込み処理の中での時間待ちはちょっとなぁ。
そのせいで、こんな具合に抜けや遅れが出たのです。
そこで、I2C液晶の表示ルーチンを割り込みを使わない方法で
書いてみました。
詳細(スケッチ例)は、また報告します。
普通は液晶アクセスでの遅れなんて問題にしないでしょうが、
特殊な場合はアカンでぇ!ということで、その解決方法の
一例と見てください。
10μ秒割り込みルーチンの抜けや遅れが無くなりました。
割り込みを使うことで処理が早くなったり便利(次の処理に
早く移れる)になるんなら良いのですが、現状の液晶表示
手順の場合は、割り込み処理にするメリットがありません。
I2Cでの割り込み処理、I2Cアクセスでのエラーが生じた時に
対応しやすいという面は否定しません。
でも、液晶表示の場合はエラーが生じても、一連の表示ルーチン
さえ抜ければ次に進めるという処理でかまわないでしょう。
ロックせずに「STOP」まで進めれば、なんとかなるかと。
I2Cでのエラー解除、本来はSDA=Hの状態(マスター側がHにする
つもりで)でダミークロックを流し込むという手法を使います。
※昔のI2C解説本ではよく見たけれど
現状、そういった処理はしていませんので、せっかくの割り込みが
生かされていません。
I2C簡単そうだけどトラブったときの対策、けっこうやっかいです。
ノイズが多い環境でスカタンしたら
そのリカバリーがたいへんなんです。
昔々、マイコンに搭載されたI2C機能を使うのが面倒くさくって、
H/Lパルスを自分で出してI2Cを制御したこともありました。
エラー発生時の手順が自由になりますので。
※参考
ROHMのBR24Lxxx EEPROMデータシートより
・https://fscdn.rohm.com/jp/products/databook/datasheet/ic/memory/eeprom/br24lxxx-w-j.pdf
・基本のタイミング
・リセット方法
・コマンドのキャンセル
SCLをHにしてSDAをL・H
※テストプログラムをアップしておきます。
・ダウンロード - test_i2c_lcd_acm0802_2b.zip
ちなみに、超低速2相パルス発生回路 のI2C液晶表示を
wireライブラリを使わないようにしたら(wireの中からtwi
を呼んでいる)、プログラムのサイズが1.8kバイトほど減少。
RAMエリアも200バイトほど減りました。
単一の液晶表示のように、単純に「書くだけ」だとずいぶん
処理が簡単になるというのが理由かと。
| 固定リンク
「Arduino」カテゴリの記事
- 液晶表示:CG-RAMの表示がちょいと違う(2024.09.12)
- ひさしぶりのバージョンアップ:チャートレコーダ(2024.07.02)
- 最適化処理のせいで悩んだぞ 呪文volatile再び(2024.06.06)
- 数値をBCD出力(表示)するルーチン #3(2024.05.03)
- ダイソー SHOOTING LIGHT:撮影用ライト LEDの輝度変化を探る #2(2024.05.03)
「重箱の隅」カテゴリの記事
- リターンパスの無いオペアンプ入力回路(2024.05.31)
- サーミスタでの温度測定、「inf」の出現に耐えられるか?(2024.05.13)
- I2C液晶のアクセス、割り込みで処理しないようにすると(2024.04.12)
- トラ技2024年5月号に「3.3/65535」(2024.04.07)
- I2C液晶のアクセス、割り込み処理で遅れる原因らしきもの(2024.04.07)
「割り込み処理」カテゴリの記事
- 最適化処理のせいで悩んだぞ 呪文volatile再び(2024.06.06)
- I2C液晶のアクセス、割り込みで処理しないようにすると(2024.04.12)
- I2C液晶のアクセス、割り込み処理で遅れる原因らしきもの(2024.04.07)
- 超低速2相パルス発生回路・ケース入れ(2024.04.03)
- 超低速2相パルス発生回路(2024.03.25)
コメント