I2C液晶のアクセス、割り込み処理で遅れる原因らしきもの
超低速2相パルス発生回路・ケース入れでの処理遅れ、
I2Cの処理をしているソース「twi.c」をざっと追いか
けてみると、
・TWI(I2C)の割り込み処理
ISR(TWI_vect)
この中にtwi_stop()というルーチンが出てくる。
・twi_stop()の処理を見ると、
_delay_us(10); という時間待ちがある。
※実際にこれが動いているのかどうかは不明
・_delay_us()がどこにあるのか探してみると
util\delay.hの中
・関数のヘッダは void _delay_us(double __us)
「double __us」って何よ。
・もし、_delay_us(10)で10us遅らせているとしたら、
オシロでの観察結果と合っている気がする。
『割り込み処理の中では時間待ちはするなぁ~』
っと叫びたくなるゾ!
※追記
波形観察できるよう、簡単にテスト。
・タイマー0を停止
じゃまされないよう
・タイマー1で10us割り込みを作る
割り込み期間、Hパルスを出力
・I2C液晶を使い1秒間隔で2文字を表示
カーソル位置指定+2文字書込みの3データ
・10usパルスはいつも見えるはず
・I2Cの割り込みと重なった時にズレが出る
ところが・・・そのズレの量が大。
I2Cのストップコンディションと重なった部分の
割り込みパルスが1つ消失して、その後の1つ
が遅れて出現しました。
終端部を拡大 (時間経過でSDA波形が↑のと異なります)
I2C(TWI)の割り込みが悪さをしてるとしか考えられない。
割り込みを使わないでI2Cを処理するプログラムを
書かないといけないなぁ。
マスターだけならそんなに難しくないけどついつい
ライブラリを頼ってしまうんで。
もう一度言います!
『割り込み処理の中では時間待ちはするなぁ~』
Wire.cはI2C処理の手順を示すだけで実際の
ハードウェアアクセスはutility/twi.cの中でごそごそ。
※さらに追記
メインループの先頭でLEDポート(PB5)をトグル出力させると
いろんな処理時間が見えてきます。
今回の10usタイマー割り込みと液晶アクセスは
こんな具合。
一番下のch4の波形がトグル出力。
なにもせず(メインループがヒマ)グルグル回っていると
フルスピードでパルスが出ます。
しかし、何かの処理が長引くとトグル出力が一次停止
します。
液晶アクセス中にメインが回っていないということは、
何のための割り込み処理なの?
っと、思っちゃいます。
割り込み処理してるんだったら、ひとかたまりを
書き終わったら、メインに戻ってきて欲しいところ。
I2Cの送出完了でバッファから読み出し、無くなるまで
順次転送ということをしてくれたら良いのになぁっと。
シリアル送信なんかはそうなっている。
10us割り込みのところを拡大すると。
割り込み処理そのものに加えて、その前準備と後始末に
けっこう時間が食われているのが見えます。
割り込み内で出しているパルスの前後に見えない
時間があるということが、メインループで出す
トグルパルスで見えてきます。
| 固定リンク
「Arduino」カテゴリの記事
- 1/nカウント方式とDDS方式の2相パルス発生回路(2024.10.13)
- おっと。map関数の計算桁に注意(2024.10.06)
- DDS方式の2相パルス発生回路、周波数スキャン機能を付ける(2024.10.05)
- 1クロックでも速くしたい 割込を「ISR_NAKED」で(2024.09.30)
- 1クロックでも速くしたい DDS方式の2相パルス発生器(2024.09.27)
「重箱の隅」カテゴリの記事
- ステッピングモータ駆動回路を24Vだけで(2024.10.29)
- おっと。map関数の計算桁に注意(2024.10.06)
- リターンパスの無いオペアンプ入力回路(2024.05.31)
- サーミスタでの温度測定、「inf」の出現に耐えられるか?(2024.05.13)
- I2C液晶のアクセス、割り込みで処理しないようにすると(2024.04.12)
「割り込み処理」カテゴリの記事
- 1クロックでも速くしたい 割込を「ISR_NAKED」で(2024.09.30)
- 1クロックでも速くしたい DDS方式の2相パルス発生器(2024.09.27)
- 最適化処理のせいで悩んだぞ 呪文volatile再び(2024.06.06)
- I2C液晶のアクセス、割り込みで処理しないようにすると(2024.04.12)
- I2C液晶のアクセス、割り込み処理で遅れる原因らしきもの(2024.04.07)
コメント