Help me! (助けて!)

2020年9月21日 (月)

『アトミック操作』・・・8bitマイコンに限り何か別の言い方なかったか?

2019年3月25日:割り込みで処理させるwordデータの扱い
に書きましたが、Arduino-UNOで使われているAtmega-328Pは
8ビットマイコンです。
ですんで、割り込みで処理される2バイト以上のデータをメイン側で
読み書きする時は「割り込み禁止状態にして」というのが基本です。

この手順を「何て言うの?」っと調べたら・・・
  ・アトミックに処理を
  ・アトミック操作
  ・不可分処理
っと、出てきます。

でも、アトミック操作とはで調べると、8ビットマイコンでの
割り込み処理の話が出てこずに、
  スレッドやプロセスや
  RISCやCISCや
  マルチスレッドやシングルスレッドや
っという8ビットマイコンの世界とはちょいと縁遠いお話し
ばかりが出てきます。

この「アトミック操作」ですが、昔々の8ビットマイコンの
世界じゃ(8080,6800~Z80あたりの年代で)なんかもっと他の
言い方、無かったでしょうか?

「8ビットマイコンの割り込み処理で多バイトデータを扱う時、
 メインでは割り込み禁止で読み書きを」を一言で表現できる
言葉、こんなの無かったですかね?

当時、アトミック処理や不可分処理なんて言葉で言わなかった
よう・・・

『アトミックにアクセス』なんて言い回し・・・
ラジオペンチさん に教えてもらった。
   (この↑記事のコメントの前にもあったはずだけど探し出せてない)


| | コメント (0)

2020年8月18日 (火)

Arduino デューティー計測のためのインプットキャプチャータイミング

2020年8月16日:Arduino UNOのPWM出力を(ちょっと精密に)確かめる

2020年8月16日:Arduino UNOのPWM出力を(ちょっと精密に)確かめる
の中の、デューティー計測回路。
これはタイマー1のインプットキャプチャー機能(日本語訳だと捕獲入力)
を使って実現しています。
ICP1入力のパルスエッジ↑↓を捉えて、↑パルスを検出した時は
「L区間のタイマー1カウント値」、↓パルスを検出した時は「H区間の
カウント値」として、内部クロック16MHzを数えます。

16bitカウンタですので65535が最大。
周波数約244Hz以下のパルスになるとこれがオーバーフロ-します。
そこで、タイマー1のオーバーフロー割り込みを使って、32bit値の
上位桁をカウントアップ。
これで、10Hzや1Hzなどの低周波パルスでもそのデューティが測定でき
ます。

問題は、デューティーが「0%」や「100%」に近づいた時。
0%や100%ならLかHに固定しちゃうんで、「パルス無し」なんですが、
例えば「analogWrite」のval値を1や254にしたような時に、
「16MHz/64 = 4us」のHあるいはLのパルスが出てきます。
これの検出がギリギリなんです。

その様子。
上が入力パルス。(このくらいだと十分間に合う)
真ん中がPB2に出力したICP1割り込みの実行時間。
下がPB3に出しているオーバーフロー割り込みの処理時間。

Dt001

ポートを観察して見えるICP1割り込みの実行時間は6usほど。
しかし・・・パルスの↑↓エッジからPB2が現れるまで、2~3us
の時間がかかっています。
また、オーバーフロー割り込みが↑↓エッジの直前に入ると、
ICP割り込みの起動が遅れている様子が見えます。


この短パルス、もっと短くするとこうなってしまいます。
Dt004

↑↓エッジの切替処理が間に合わなくなり、デューティーの
測定ができなくなってしまいます。

この遅れの原因が「C言語」特有の「レジスタの待避処理」。
割り込み処理が始まると、割り込みで使うレジスタを全部
プッシュします。
この手順が遅れの原因。

「C」で書いている割り込み処理はこんなの。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/***** タイマー1インプットキャプチャー割込 *****/
// ICP1の↓↑エッジでキャプチャー
ISR(TIMER1_CAPT_vect)
{
uint32_t cnt_d;     // 差の計算用
word cnt_r;       // ICR1読み出し
  PB2_H;         // (!!!)
  cnt_r = ICR1;      // キャプチャー値 ★1
  XCG_EDGE1;       // 次にそなえて↑↓エッジをトグル ★1
// オーバーフロー有無
  if(CK_OVF1){      // 割込処理中にOVF発生したか? ★2
    if(cnt_r < 160){  // 10uS(160ck)未満なら未処理のOVFがある
      cnt1_ovf += 1; // オーバーフローカウンタ+1
      CLR_OVF1;    // オーバーフローフラグをクリア
    }
  }
// カウント差を計算
  cnt1_n = (uint32_t)cnt_r +
      ((uint32_t)cnt1_ovf << 16); // 32bitでカウント値
  cnt_d = cnt1_n - cnt1_x;   // 前回値との差分
  cnt1_x = cnt1_n;        // 次回用に残す
// ↑↓エッジをチェック
  if(CK_EDGE1){      // ↑になった H区間
    cnt1_caph = cnt_d;
  }
  else{          // ↓になった L区間
    cnt1_capl = cnt_d;
  }
  f_plsin = 1;      // パルス有フラグをon
  f_plsin2 = 1;      // min,maxチェック用
// 次の↑↓パルスが来てるかどうかのチェック
  if(CK_ICF1)   f_plsovl = 1;    // パルスがオーバーラップ
  PB2_L;         // (!!!)
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

★1の処理をできるだけ前に持ってきたいのですが、展開された
機械語はこうなってしまいます。

=============================
356 <__vector_10>:
356: 1f 92    push  r1
358: 0f 92    push  r0  
35a: 0f b6    in r0, 0x3f ;sreg
35c: 0f 92    push  r0
35e: 11 24    eor r1, r1   ;△
360: 2f 93    push  r18  ;△
362: 3f 93    push  r19  ;△
364: 4f 93    push  r20  ;△
366: 5f 93    push  r21  ;△
368: 6f 93    push  r22  ;△
36a: 7f 93    push  r23  ;△
36c: 8f 93    push  r24  ;△
36e: 9f 93    push  r25  ;△
370: af 93    push  r26  ;△
372: bf 93    push  r27  ;△
374: 2a 9a    sbi 0x05, 2   ;PB2
376: 20 91 86 00 lds r18, 0x0086 ;cnt_r = ICR1 ★1
37a: 30 91 87 00 lds r19, 0x0087
37e: 90 91 81 00 lds r25, 0x0081
382: 80 e4    ldi r24, 0x40  ;XCG_EDGE1 ★1
384: 89 27    eor r24, r25
386: 80 93 81 00 sts 0x0081, r24
38a: b0 9b    sbis  0x16, 0 ;if(CK_OVF1) ★2
38c: 0e c0    rjmp  .+28    ; 0x3aa
38e: 20 3a    cpi r18, 0xA0  ;if(cnt_r < 160)
 ※長いので以下省略
=============================

★1の処理をできるだけ前に持ってきたいのです。
そうすれば、短いパルスもちゃんと処理できるようになります。

10個ある△の「push命令」。
命令実行の手順としては、これを★1より後に下げても同じ。
先にpushしてるr0とr1でもって処理できます。

アセンブラで書けば自由になるんですが、「Arduino」の環境だと
如何とも・・・
   ↑
 ここらがhelp!でっす。

※豆知識
AVRマイコンの割り込み優先順序(同時に割り込み要因が起動し
た時、どっちが先に処理されるか)、割り込みベクトルの若い方
(先頭に近い方)が優先されます。
タイマーではオーバーフローより、コンペアマッチと
インプットキャプチャ-が優先されます。

リストの★、もう一つが★2。
これがオーバーフローの処理。
ICP割り込み処理の前にオーバーフローが発生し、その割り込み
処理が遅れても32bitのカウント値は正しく読めます。

※参考図
D21
しかし、ICP割り込みとOVF割り込みが同時、あるいは微妙な
タイミングならどうかというのを考えたのがこの図です。
D22

ICP割り込みで、
・OVF割り込みフラグが無ければクリチカルな問題は無し。

・処理されてないOVF割り込みフラグが残っていても、
 その時のキャプチャーカウント値が十分に大きければ
 クリチカルな問題じゃ無い。

・OVF割り込みフラグがあって、キャプチャーカウント値
 が小さい時は、微妙なタイミングが発生してる。
 その時は、ICP割り込み内でもオーバーフローの処理が
 必要。

こんな処理がICP割り込み内に必要です。
でもこれは↑↓エッジ検出から遅れても問題なし。

短パルスを捉えるため、ICP割り込みでまず優先しなくちゃ
ならないのはキャプチャーカウンタの読み出しと↑↓エッジ
検出の逆転処理です。


※Arduino環境で機械語命令をどう書く、というのが課題・・・

※調べてたらこんなのが・・・
 これで、解決できそうな。
    ISR(TIMER1_CAPT_vect, ISR_NAKED)

ISR_NAKEDを入れると、割り込みルーチンのpush、pop、reti、
それにsregのセーブとリストアのルーチンが全部無くなります。

ISR_NAKEDを入れる前と入れた後を比較して、抜けてる
処理を手で(インラインアセンブラで)入れ込めば
解決(★1処理をちょっとでも速く)できるかっと。

こりゃ面白い!

| | コメント (1)

2020年7月28日 (火)

この機体は? A320? B767?

1992年3月5日に行われた「VAP-NET Airボード主催」の
大阪空港全日空工場飛行機見学会。
この時の機体って、何だったんでしょか?

10_20200728095201 

11_20200728095201

専門家なら、機体の面構えやコクピット計器の様子で分かるんじゃ
ないかと・・・

ちなみに、赤色ジャンパーが次男、綠色ジャンパーが長男。
『絶対にスイッチやボタンを触ったらあかんで』っということで
コクピットに入れてもらいました。

このころの長男、「何かを触ったら止めてしまう」体質でして、
あちこちのショールームや博物館科学館で、その体質を発揮して
おりました。
静電気じゃないです。
彼が何かを操作したら、止まった・・・ ということが頻発。

撮影はOM-2SP。 フィルムカメラの時代でした。

| | コメント (5)

2020年6月 1日 (月)

日産スカイラインGT-R用「ワイパーアンプ」の制御IC「LB8060」

自動車の間欠ワイパー制御回路の修理依頼。
日産スカイラインGT-Rで使っているものだと。
樹脂の小ケースにこんな基板が入っています。
N11
ざっとの手当が、
・リレー接点の接触不良。
   同品番は廃番で代替品に取り替え
・7ピンあるコネクタの1ピンにサビが。
   清掃
・コンデンサ、予防的に取り替え。

でもあきません。
制御しているのがこのIC。
N12
「LB8060」という型番。
これが壊れているようです。

データシートが出てきません。
LB8050というのは出てきて、これが「ワイパーコントローラ」という区分。

基板を回路展開すると、こんな接続。
N22
  (クリックで拡大↑)

車側の回路図を入手してもらいましたが、ワイパーアンプとの接続がよくわかりません。
線名と基板コネクタの接続が不明なんです。
 (電源、GNDはわかりますが)
ピンクのところが想像で記した番号。
N21
   ※○内番号ミスってました ↓に訂正図を

これで合っているのか?
そして、制御の方法がもう一つ不明。
・モータ左のスイッチをどう読んでどう使ったら良いのか?
・ワイパーボリュームの値は?
・INTだけでなくHI/LOでも制御するの?
  (6)がINTだけで0Vならわかるんですが、
  HI/LOでも0Vになるんで。
・ウォッシャーモータとの関係は?
 WASH 0Vでウォッシャーモータ回転。
 ワイパーオフでもリレーがB接なんで
 WIPERオフだとモータLO側が勝手に回る。
 この時の制御、どうすれば。

マイコンに置き換えればと考えているんですが・・・


※追記 2020-06-02
車の回路図、別のを見つけてもらいまして、コネクタの接続が判明しました。
アンプとは下図のようにつながります。
  ピンクのところ、きっちりミスってた
B52
(クリックで拡大↑)

これで、およその動作が動きが分かります。

どうしたものかは、INT、LO、HI、の区別。
いずれも1pinがGNDに落ちてしまいます。
LO、HIはリレーに関係なく勝手にモータが回転。
その時の7pinのH/Lを見てINTのタイミングを作るという
ことになるかな。
つまり、INTでもHI、LOでもリレーはアンプ内のリレーを
駆動するということで。

ボリュームの抵抗値を調べてもらっています。
(1kΩという話も)


| | コメント (12)

2020年2月26日 (水)

JIS C8708:2019充放電試験 「又は」の解釈は

昨日より新しい「ReVOLTES単3」を使っての充放電実験を始めています。

こんなチャートが出てきてます。
C11_20200226093801

そして、ログ用のシリアル出力データはこんな具合。
~~~~~~~~~~~~~~~~~~~
#Start
#D 0.2C 0cyc 0/8 0h00m 1.293V
#D 0.2C 0cyc 0/8 4h03m 1.000V
#D-Wait 0cyc 0/8 1h00m 1.167V
#Next
#C 0.5C 1cyc 1/8 2h12m 1.549V #1
#C-Wait 1cyc 1/8 0h20m 1.440V
#D 0.5C 1cyc 1/8 1h59m 1.000V @1
#D-Wait 1cyc 1/8 0h10m 1.177V
#C 0.5C 2cyc 1/8 2h12m 1.557V #2
#C-Wait 2cyc 1/8 0h20m 1.449V
#D 0.5C 2cyc 1/8 2h01m 1.000V @2
#D-Wait 2cyc 1/8 0h10m 1.176V
#C 0.5C 3cyc 1/8 2h12m 1.562V #3
#C-Wait 3cyc 1/8 0h20m 1.454V
#D 0.5C 3cyc 1/8 2h01m 1.000V
~~~~~~~~~~~~~~~~~~~

#1~#3@1、@2がチャートと対応しています。
「#C」が充電、「#D」が放電制御です。
その充電完了の時間を見ますと、
-ΔV検出で止まったのじゃなく132分経過で充電停止
しています。

充放電の時間比率は、
   放電 / 充電
1cyc 119分/132分 90.2%
2cyc 121分/132分 91.7%
3cyc 121分/132分 91.7%

と、およそ9割。 こうなると、
「0.5C充電(2時間)の1割増しの時間にしておく」という
132分の充電時間、合ってそうな気がします。

ニッ水電池のJIS規格 C8708:2019 で定められた充電制御方法の
又は」の解釈に悩みが出てきました。

・1~49サイクル:
  充電:0.5Cで-ΔV又はタイマー制御(a)で充電。
  静置:20~30分間静置。
  放電:0.5Cで1.0Vまで放電。
  静置:10~90分間静置。

(a)-ΔV=5~10mV又は132分間。
  132分ということは、0.5C容量の1割増しの時間。

この充電制御方法の「又は」の解釈。「OR」条件で、
 ・「-ΔV」あるいは「132分」どっちでもOKよ。
こう考えられます。

今回の制御プログラムではこんな処理を行ってます。
 ・充電開始とともにタイマースタート。
 ・-ΔV検出処理を遅らせるタイマー値を設定していて、
  充電開始直後の何分間は-ΔV処理をしない。
 ・「-ΔV検出」あるいは 「132分」経過で充電停止。
  -ΔVが見つからなくても充電は132分で停止。

(a)の「又は」解釈なんですが、
 (1)132分で充電する時は-ΔVは無視してもokよ。
 (2)-ΔVで充電制御する時は132分を越えて充電してもokよ。

(1)の解釈は「又は = OR条件」というふうに考えると正しいかと。
しかし、(2)はいかがでしょう。
「-ΔV」を選んだ時は「132分」を無視して良いのかどうか・・・。
今は132分をリミットにして充電しています。

今回のように新品電池での充電では、-ΔV検出より先に132分が経過
しちゃいました。
132分を越えても「-ΔV」を待つべきだったか・・・
  ※市販の充電器は電池容量が不明なので「-ΔV」でしか
   充電完了を知るすべがないわけでして。。。

方法としては、
 ・-ΔV充電か132分充電かどちらかを選ぶ。
    (又はの解釈→「どちらでも」ではなく「どちらかを」)

 ・132分充電を選んだのなら-ΔV制御はなし。
 ・-ΔV充電を選んだのなら132分での充電停止は無し。
  (安全のため、別の停止用タイマーを設けておく)
こんな制御方法も考えられます。
どんなもんなんでしょうね。

| | コメント (0)

2019年11月20日 (水)

この部品の名称は? メーカーは?

同僚からのHELP。
  「この部品、なんという名前?」
  「メーカーは?」
  「売ってるのかな?」
  「ググっても出てけぇへん」

古い装置で使われている可変抵抗の軸ホルダーなんですが、はてさて。
「RV30」が付いています。

21_20191120122701

22_20191120122701


| | コメント (3)

2019年9月 5日 (木)

ノギス談義:固定ネジはなぜ抜け落ちない?

ミツトヨ・デジタルノギス CD-20PSX に絡んで、昨日はちょいとノギス談義。

※参考
  ・ノギスの構造

Q:ノギスのスライダー部に付いている固定ネジ、
  左回しでどんどん緩めていってもなぜ抜け落ちないの?

A2_20190905094901

この質問に対し、
ノギスをしょっちゅう使っているフライス屋:佐藤テック君は・・・
 「このネジ、取れてしもたん、何本かあるで」っと。
まぁ、プロは使用頻度が違うのでしょう。

想像なんですがこんなことになっているのではと。

A1_20190905094901

ネジの先端が潰してあって、雌ネジに入っていかないから止まるっと。

そこで、さらなる疑問が。

・これ、どんな具合になっているの? 見たことある?

・雄ネジ先端中央をプラスドライバ(のような工具)で
 たたき込んで、外側に広がらせてる?


いかがでしょう?
ノギスをバラせば見えるんでしょうが、調子良く使えているのは
そっとしておきたいわけでして・・・

※追記
柴田さんからコメントを頂戴した後、メールで「その部分」の画像が送られてきましたので紹介しておきます。
   ※ありがとうございました!

B1_20190906081301
(矢印はこちらで記入)
※拡大
C2

この止めねじ(ローレットネジ)の先端加工、向こう側からねじ込んだ後でしか作業できませんよね。
どうやって、どんなツールで作業してるんだろか。

※あらたな疑問・・・
ミツトヨに聞いてみよか。


| | コメント (2)

2019年7月10日 (水)

このデバイス名は?

高周波絡みの修理。
FM放送周波数帯の増幅回路がアウトに。
ところが、デバイスの詳細が不明で部品手配できません。
こんなの。

H11

マーキングは「H475」「EW38」。

こんな回路です。
H10

右から入って左へ。
三端子で増幅。

はて?

 

| | コメント (5)

2019年5月17日 (金)

レーザーモジュール、何かいいのは?

メカの位置合わせに使ってられたレーザー。 ・・・30年前の。
故障原因は高圧モジュール。
手が出せません。

11_15

右側へレーザーが出ていく。
レーザー管の先端。
12_12

発光している様子は不明。
シールには「1mW」。
『5mくらい先でスポットがあれば』というリクエスト。

この箱の中に「レーザーポインタ」を仕込めば良いわけなんですが
電源はAC100Vなんで電池は×。

市販のレーザーモジュールに電源を付けてと考えています。
何か、良いの、ありませんかね?
  ・寿命
  ・スポットの集束度(調整可能なの?)

やはり気になるのは寿命。
LEDの劣化 のようにどんどん暗くなる・・・は避けたいんで。
実力は買ってみなくちゃ分かりませんかな。


※追記
レーザーモジュール、やってきました。
   結局、電源とともにDigikeyに注文。
L12

点光源のと線光源の、2種類買ってみました。
もう一つのレーザーポインタはCPU.BACHさんが送ってくれたもの。
参照用に。
L11

3m離れた所からだとこんn具合。
L13

これから箱に組み入れます。


※箱入れ完了
10_2

文鎮:ハンダ付け補助ツール の佐藤テック君にこんな保持金具を作ってもらいました。
11_17

12_14

13_8


※追記
比較に使ったレーザーポインタの中身
・http://igarage.cocolog-nifty.com/blog/2019/06/post-f44955.html



| | コメント (2)

2019年5月 2日 (木)

マイコン型導通チェッカー、今後のあれこれ

満足できる完成形となって頒布を続けているマイコン型導通チェッカー、その製作メモを綴じるファイルを見ていてこんなことが気になり出しました。

※現状、満足している内容
(1)電源スイッチを操作しなくても電源オンを実現。
   とうぜんオートパワーオフ。
(2)通電している回路に触れても壊れない。
   24Vは平気。100Vでも短時間は大丈夫。
(3)検出抵抗1Ωを目指すを実現。
   ゼロドリフトアンプの性能のおかげ。
(4)前バージョンより音を大きく
   マグネチックサウンダを使用。


この中で、もうちょっとどうにか出来ればなぁというのが(2)。
「短時間なら100Vは大丈夫」は実現しているのですが、これを
  「ず~っと大丈夫」「200Vでも大丈夫」
にできないかというものなのです。
実際に100Vを加えた様子はここ→導通チェッカーに100Vを加えると
  ※ZAQのゴタゴタで動画は喪失してます

これ、こんなふうに考えてみました。
現在の保護抵抗R1とR2(1/2W10KΩ)の直近(過電圧だとこれが発熱)、この抵抗に直列にPTCサーミスタ(温度上昇で抵抗値増大)を入れ、過大電圧による抵抗の温度上昇で抵抗が焼けるのを防止できるのじゃないかと・・・

ざっと回路に示すとこんな具合。
  (クリックで拡大↓)
D1_1

ところが使えるPTCサーミスタが見つからないんですよね。
例えばムラタの発熱検出用の素子。
Murata1
80℃を越えると抵抗値が20K→100Kと上昇し、これだとうまく保護できそうです。
でもこれの耐圧が「32V」。
サーミスタの抵抗値が回路のR1と同じ10KΩになると、例えば100Vが加わっているすると、R1とサーミスタにはそれぞれ50Vの電圧が加わることになりサーミスタの耐圧を越えてしまいます。
  ※最大定格ということで、素子の破損が起きるかもしれない。
   電圧がゼロに戻ると回復するのなら使える可能性はあるかも。


TDKのを探すと過電流防止用のが見つかります。
Tdk1

これ、耐圧はOK。
ところが、発熱による抵抗値上昇点温度が高くって、これだと電流制限がかかるまえに(10KΩだと100Vで10mA)抵抗が焼けてしまいそうです。
あれこれPTCサーミスタのカタログを探してみましたが、エエのが見つかりません。
これとういうのがあればすぐにでも実験してみたいところです。


それともう一つ。
ファイルにこんな回路案が綴じられてました。
現状の回路は8ピンのATTINY25Vマイコンを使っています。
それを14ピンのATTINY44にして、内蔵の差動アンプ(20倍増幅できる)を使って「1Ω検出」を目指すというプランです。
ゼロドリフトアンプを減らせるかも、ということです。
今ならATTINY841でしょうか。(Vバージョンを選ばなくても同型番のチップで低電圧動作できる)

Bzx2

さらに・・・このメモには忘れていた機能が追加されていました。
下の方に記したフォトカプラ。
AC入力タイプのフォトカプラで入力端子を見ておけば、端子間に電圧が加わったことを検出できるぞ(通電中の回路を導通チェックしようとしている)というアラーム機能の追加です。
実現すればちょいとうれしい機能かもしれません。

これを使って、電圧印加を検出して、入力保護抵抗R1とR2を遮断すれば良いわけですが、その素子をどうすればという問題を解決しなくちゃなりません。
はてさて。
フォトMOSリレーは高価だし。
何か良い回路は?


| | コメント (2)

より以前の記事一覧