重箱の隅

2024年4月12日 (金)

I2C液晶のアクセス、割り込みで処理しないようにすると

I2C液晶のアクセス、割り込み処理で遅れる原因らしきもの

I2C液晶の処理と高レートのタイマー割り込みとの競合、
その原因がI2C液晶アクセスでの割り込み処理だという
ことがわかりました。

I2Cアクセスでの最後、I2Cバスを待機状態に戻す
「ストップコンディション」の処理に時間待ちが
入れられていました。
  割り込み処理の中での時間待ちはちょっとなぁ。
そのせいで、こんな具合に抜けや遅れが出たのです。
Aa004

Aa000_20240408135301

そこで、I2C液晶の表示ルーチンを割り込みを使わない方法で
書いてみました。
   詳細(スケッチ例)は、また報告します。

普通は液晶アクセスでの遅れなんて問題にしないでしょうが、
特殊な場合はアカンでぇ!ということで、その解決方法の
一例と見てください。

10μ秒割り込みルーチンの抜けや遅れが無くなりました。
Ff000
Ff001
Ff002

割り込みを使うことで処理が早くなったり便利(次の処理に
早く移れる)になるんなら良いのですが、現状の液晶表示
手順の場合は、割り込み処理にするメリットがありません。

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

・基本のタイミング
Ep11
・リセット方法
Ep12
・コマンドのキャンセル
   SCLをHにしてSDAをL・H
Ep13

※テストプログラムをアップしておきます。
  ・ダウンロード - test_i2c_lcd_acm0802_2b.zip

ちなみに、超低速2相パルス発生回路 のI2C液晶表示を
wireライブラリを使わないようにしたら(wireの中からtwi
を呼んでいる)、プログラムのサイズが1.8kバイトほど減少。
RAMエリアも200バイトほど減りました。
単一の液晶表示のように、単純に「書くだけ」だとずいぶん
処理が簡単になるというのが理由かと。



| | コメント (0)

2024年4月 7日 (日)

トラ技2024年5月号に「3.3/65535」

トランジスタ技術の最新号、2024年5月号を
パラパラめくりしていたら、p.70のリスト1に
怪しい記述を発見。
A/D値から電圧値を計算するための定数を出す
のに「3.3/65535」と。

Pp21
65536と65535の差はほんの僅か。

でも、リストの7行目のPID演算のところで、
6桁の数値が出ているんで、5桁数値の最小桁で
の1違いは大きくないかいなとちょいと心配。

電源電圧「3.3V」も、「ほんまかいな」だし。

元データはA/D値のまま使い、「CAL(校正)したらこうなった」
にして、「浮動小数点化したmap関数」を使って線形補間して
答えを出すてなほうが「理にかなっている」ような気がします。

ラズピコだと1/65535が出現:トラ技2022年5月

※検索
ラズパイマガジン2022年12月12日の訂正
   ・・・本文中の「1023」は「1024」、図2下の式の
  「4095」は「4096」の誤りです。
   ・・・Raspberry Piのところで分割数が「4095」と
  あるのは「4096」の誤り、Raspberry Pi Picoでは
  「65535」が「65536」、micro:bitとArduinoでは
  「1023」が「1024」の誤りでした。
訂正が出ています。

 

| | コメント (0)

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つ
が遅れて出現しました。

Aa000_20240408135301
終端部を拡大 (時間経過でSDA波形が↑のと異なります)
Aa004

I2C(TWI)の割り込みが悪さをしてるとしか考えられない。
割り込みを使わないでI2Cを処理するプログラムを
書かないといけないなぁ。
マスターだけならそんなに難しくないけどついつい
ライブラリを頼ってしまうんで。

もう一度言います!
  『割り込み処理の中では時間待ちはするなぁ~

Wire.cはI2C処理の手順を示すだけで実際の
ハードウェアアクセスはutility/twi.cの中でごそごそ。

※さらに追記
メインループの先頭でLEDポート(PB5)をトグル出力させると
いろんな処理時間が見えてきます。

今回の10usタイマー割り込みと液晶アクセスは
こんな具合。
A1000

一番下のch4の波形がトグル出力。
なにもせず(メインループがヒマ)グルグル回っていると
フルスピードでパルスが出ます。
しかし、何かの処理が長引くとトグル出力が一次停止
します。

液晶アクセス中にメインが回っていないということは、
何のための割り込み処理なの?
っと、思っちゃいます。
割り込み処理してるんだったら、ひとかたまりを
書き終わったら、メインに戻ってきて欲しいところ。
I2Cの送出完了でバッファから読み出し、無くなるまで
順次転送ということをしてくれたら良いのになぁっと。
  シリアル送信なんかはそうなっている。

10us割り込みのところを拡大すると。
A1001

割り込み処理そのものに加えて、その前準備と後始末に
けっこう時間が食われているのが見えます。
割り込み内で出しているパルスの前後に見えない
時間があるということが、メインループで出す
トグルパルスで見えてきます。

| | コメント (0)

2024年3月30日 (土)

ラズピコだと1/65535が出現

Arduinoでぐだぐだ言ったのが1023 vs 1024問題

トラ技のラズピコ特集、2022年5月号を見ていたら・・・
Pc12
A/D変換の値から電圧を計算するのに「1/65535」が
出ていました。

ただし言語は「python」。
analogioを検索してみると、Aanaloginは
16bitの値になるそうで、
https://learn.adafruit.com/circuitpython-essentials/circuitpython-analog-in
ここでは1/65536して電圧に変換しています。

https://www.denshi.club/pc/python/circuitpython/circuitpython-10-3.html
ここは、「65535は間違いなので」と注記があって
1/65536になっています。

https://logikara.blog/raspi-pico-basic/
ここは1/65536。

もう一つ、気になったのが
  v / (ref - v)
のところ。
Pc11

vが電圧値でrefが基準電圧つまり3.3Vなら、
adc.valueがフルスケールの65535になったときは
  v = 65535 / 65535 * 3.3 で
   = 3.3 となります。
すると、
  3.3 / (3.3 - 3.3)
で、ゼロ除算が発生。

図15のCDSが外れて、A/D値がフルスケールになると
ゼロ除算してしまうわけです。
1/65536にしていれば、v = 3.29995となり、
ゼロ除算は避けられます。

pythonでの数値型がよく分かってないので、
これでどんな挙動になるのかは知りません。
記事をぱっと見して、
  1/65535が出てきたぞ
  1023 vs 1024と同じ匂いか
っと、感じた次第です。

 

| | コメント (0)

2024年2月13日 (火)

トラ技のArduino Uno R4特集でも1/1023

Arduino Uno R4を知っておこうと
トランジスタ技術2024年1月号
パラパラめくりしていたら・・・
1/1023」を発見。

場所はp.106。
R42
記事のタイトルは
  Uno R4低消費電力の実力!
   家庭菜園用バッテリ動作2ch温度ロガー

その中の「R3からR4への乗り換え時の注意!
という章。
P.107の【図5】にはこんなものさしの絵も。
R43
1023と10進じゃなく0x03FFと16進表記にして
半値やら1/4値、3/4値を入れ込むと目盛がはっき
りするかと。

こちらでの「ものさし」表記。
Ss12

・1cmを1mm分解能で
Ss2_20221126092001
※こんな解説かな
・絵の縮尺の関係で、1cm位置が実際は5.0mやった。
・mmでの測定値a (0~9の範囲)から実際の長さを
 求める式は・・・
   a × (5.0 ÷ 10) が答え (単位はm)
          [ ÷9ではない ]

※参照
1023 vs 1024 、255 vs 256 なんでみなさん「2^n-1」が好きなの?

| | コメント (0)

2024年2月10日 (土)

delayMicroseconds(50000)をオシロで確認

トランジスタ技術2024年3月号に掲載してもらった
  ・『実はワナだらけ…確実に動かすArduino Uno R3』
この記事の中の『時間待ちのワナ』、これの実際の様子を
オシロ波形で見てもらいましょう。

Dm11_20240210085601

ch1がオシロトリガ用の波形。
  1サイクル回るごとにPB4をトグルしています。
ch2がdelayMicroseconds時間確認のための波形。
  1msのH/L
  50msのH/L  ←のつもり
を出力して回っています。
しかし実際は・・・
  delayMicroseconds(50000)が0.85msほどに
  なっています。

こんなスケッチを使って見ています。

#define PB5_H       (PORTB |=  (1 << PB5))  // LED on
#define PB5_L (PORTB &= ~(1 << PB5)) // LED off
#define PB4_X (PINB |= (1 << PB4)) // PB4トグル

void setup() {
pinMode(13, OUTPUT); // PB5 基板上LED
pinMode(12, OUTPUT); // PB4 トグル出力(オシロのトリガ用)
}

void loop() {
cli(); // 割り込み禁止でloopを回る
while(1){
PB4_X; // PB4トグル
PB5_H;
delayMicroseconds(1000); // 1ms H
PB5_L;
delayMicroseconds(1000); // 1ms L
PB5_H;
delayMicroseconds(50000); // 50ms(???)
PB5_L;
delayMicroseconds(50000); // 実際は0.85msほど
}
}


※元記事/関連記事
Arduino-UNOでのdelayMicrosecondsの設定は16383までだ!
Arduinoから「タイマー0」を取り上げる(ユーザーが使う)

| | コメント (1)

2023年11月 1日 (水)

C-MOS ICの入力ピンをオープンにすると


MMさんからのコメントで未使用「74HC74」の端子処理

の話が出てました。

ブレッドボードを使ってゴソゴソしていたところだったので、
74HC74を捜索。
モトローラのと東芝のが見つかりました。

7_12

HC74にはフリップフロップが2つ入っていて、
入力が CLK D /SET(/PR) /CLR(/CL) の4本。

/SET(/PR)をHに、/CLR(/CL)をLにして、CLKとD入力に対し
0~5Vのノコギリ波を加えてみました。 
チップの電源は5V。

道具はこれ↓
2023年9月27日:6年ぶりの改造:0Vから出力電圧が直線的に上昇するノコギリ波発生回路

  ※オシロ波形のメモ、「三角波」と記してしまいましたが
   正しくは「ノコギリ波」。

電流の測定ツールはこれ↓
2022年12月14日:Arduino UNOを使ったUSB電流計 4桁表示も

電流検出抵抗が75mΩ。
電流検出アンプが100倍。
出力電圧を100で割って実ドロップ値を求めて、
それを電流検出抵抗値の75mΩで割ったら電流が
計算できます。

Hc74

まず、東芝の74HC74。 (クリックで拡大↓)
Hc74_004
Hc74_005
Hc74_003

続いてモトローラの74HC74
Hc74_001
Hc74_000
Hc74_002

電源電圧の中央付近で電流が増えてます。
いわゆる貫通電流。
入力部のバッファに電流が流れるのでしょう。

/CLR=Lで出力を固定できる条件ですが、やはり入力端子の
放置はマズイです。
ハイインピーダンスなので、放置入力の電位がどうなるかは
周囲の環境次第。
近所にパルス信号が走っていたら、その誘導を受けてしま
います。
74の出力(Qと/Q)は変化しませんが、電源電流がうろうろと
挙動不審に。
面倒でも、ちゃんとしておかないといけません。

※関連
2020年04月25日:Arduino やっぱり気になる放置ポート
2020年05月02日:Arduino 放置したポートが及ぼす電源電流変化 
2020年05月02日:Arduino ポートの初期化と通信設定

※参考
(続)その未使用ピンをどうにかしなさい! アナログデバイセズ


| | コメント (0)

2023年10月31日 (火)

トラ技の作図能力が落ちている・・・かもの続き

2023年10月27日:トラ技の作図能力が落ちている・・・かも
トランジスタ技術2023年11月号
  「メカ式7セグを使ったラジオ周波数表示回路」

しつこいですが、この続き。
  磁気反転式表示器が出てきたので、
  興味深く読んでいたら、アラが気に
  なり出したという次第。
掲載回路図で気になるところが、さらに出てきました。

p.73の「・」抜けのすぐ上。
AM帯とFM帯の周波数入力切り替えにHC157が使われています。
Ca1
その未使用入力端子がオープン。
C-MOS IC使用法の基本に反しています。
TTLならほったらかしでエエんですが、C-MOSは
HかLにレベルを安定させとかなくちゃなりません。

よく見ると、ディケードカウンタ HC390のBクロック入力も、
C結合だけ。
常にクロックが入る場所ですが、これも×。

その下のU21インバータは1M抵抗で帰還してアナログ的動作を
期待。

さらに、p.72のHC373も未使用入力がオープン。
Ca2

「×」マークがプルアップ抵抗接続なりを意味する注記が
あるのかと探したのですが不明。
未使用出力端子にも「×」が付いてますし。

そして、p.76のC14。
「なんだぁ この描き方は」という表記。
Ca3

貫通コンデンサ」かと思いましたよ。

筆者さんの手抜きなのか、編集側での作図ミスなのか・・・
「ちょっとなぁ」です。

| | コメント (5)

2023年10月27日 (金)

トラ技の作図能力が落ちている・・・かも

トランジスタ技術2023年11月号、特集が『新・ラジオの製作』。
なかなか面白い。
  ※ラジオじゃないけど私の製作記事も
   載せてもらってます

パラパラめくりしていて、
 「メカ式7セグを使ったラジオ周波数表示回路」
に、磁気反転式表示器が出てきたので興味深く読ませて
もらいました。

ところが・・・作画担当や編集担当の手抜きなのか、
筆者さんの校正抜けなのか・・・
p.72,73の図4がいけません。

123a

黄色線、電源につながるはずなのですが浮いてます。
ピンクの線が電源ですんで黄色とピンクが交わる
十字部に入れるはずの「・」が抜けたのでしょう。

また、R7、R8の抵抗値が「100Ω」になっていて、
74HC123のタイミング抵抗としては小さすぎます。

そして、筆者さんの作画ポリシーなんでしょう、
「▽」のGND記号は使われてますが、電源記号を
使われてません。
上の絵の黄線とピンク線も電源記号を使ってバラけ
させていたらこんなミスは無かったんじゃないかと・・・。

※関連
2017年7月10日:「十字接続は避ける」
2022年10月26日:「十字接続は避ける」、再び

※他にも「・」抜けか、というところが。HC00のU3b出力。
 ここも十字接続するポイント。

「十字接続は避ける」が仇となってしまったか。

※さらに、U20のHC157の未使用入力ピンが浮いてます。

※校正原稿の上がりが遅いと、できあがってきた回路図を
 隅々までチェックできません。

| | コメント (0)

2023年6月 7日 (水)

不安な接続記号「●」

回路図の配線、電線や部品をつなぐ記号は「●」。
  ※「T」字でつなぐ場合だと省略の
   可能性があります。

過去、「十字接続はやめよう」を唱えたことがあります。
 ・2014年11月15日:回路図での交差信号の描き方
 ・2016年07月01日:回路図、配線の交差と接続
 ・2017年7月10日:「十字接続は避ける」

図書館にリクエストした
  ・富田 豊 著 『すぐに使える!オペアンプ回路図100

C51_20230607140001

この本を眺めていたら・・・
  ちょいと不安な「●」が出てきました。

・2-39 対数変換回路 (p.53)

Cc20
←★ のところの「●」。
 「何か部品につながるんとちゃうか?」
 「配線のつなぎを忘れてへん?」
っという不安を感じます。

さらに、2つあるトランジスタの型番も「なんだこれ?」
  2SK2920は東芝の200V・5AというSW用MOS FET 。
  2SC2920だと富士通の400V・15A。パッケージはTO-3。
何を誤植したんでしょ。

もう一つ。第2章 オペアンプ回路解説の最初。
・2-1 反転増幅回路 (p.12)
Cc23_20230607140401

拡大
Cc24_20230607140401

鉛筆書きで訂正されていました。

※正誤表を発見!
https://www.maruzen-publishing.co.jp/fixed/files/pdf/293331/errata_pdf_293331.pdf
  対数変換回路のはありませんでした。


※追記

ARO さんから指摘のあったログアンプ回路の図、
記事内に残しておきます。

ICL8048のブロック図
L10
私の製作物ではこんな回路を使っていました。
  ・「大声トライアル」の大声レベル測定用のログアンプ
L11_20230612090801

詳細は→ http://www.vector.co.jp/soft/dos/hardware/se298245.html
測定値は「0~255」の範囲で、単位は「なん点」。
校正用機材が無いので「dB」ではありません。

手持ちの本にはこんな回路が出ています。

  ・稲葉保著「精選アナログ実用回路集

L12_20230612090801


  ・玉村俊雄著「OPアンプIC活用ノウハウ

L13_20230612090901
L14_20230612090901

AROさんの指摘が正しいかと。

※さらに追記
正体不明の2つのトランジスタ「2K2920」。
これ、2N2920  の誤植と推測 。

6本足パッケージの
「デュアル NPN トランジスタ」
  60V 30mA 350mW

220

2n

| | コメント (3)

より以前の記事一覧