電子回路工作

2017年6月20日 (火)

ARMマイコン、タイマーのインプット・キャプチャ機能で

初めて使う「機能」、使ってみて「なるほどなぁ~」
「こうするんや」というパターンにしばしば出会います。
その原因、
   「マニュアルに書いてあるやろ」
   「ちゃんと、隅から隅まで読みや」っという
場合が多いようです。
先日はこんなことに遭遇しています。

チップはARMマイコンSTM32F407。

11

タイマーのインプット・キャプチャ機能で、パルス周期を
測定しようとしたところ、タイマーカウンタのプリスケーラが
いうことをきかないという現象に出会いました。

クロック源は84MHz。
これが、16ビットのプリスケーラを通って32ビットのカウンタ
(アップカウント)に入ります。
測定値が32ビットで出てくるので、プリスケーラを使わなくて
もかまわないんですが、できればクロックを1MHz(1μS)にして
おきたいので、プリスケーラを「1/84」に初期化しました。
ところが、これがダメ。
出てくるパルス間隔値は1MHzで計測したものじゃなく、元クロック
の84MHzで計った値になるのです。 (想定の84倍大きな値)
う~む・・・。

しかし、何かのひょうしに1MHzでの値になって、ちゃんと思惑通り
の数値が出だします。
一度ちゃんと動き出すと以後は大丈夫。
うまくいかないのは起動直後の最初だけ。
「なんやこれ~?」でっす。

このうまくいくタイミングを調べてみると、カウンタのオーバー
フローが絡んでいました。
32ビットカウンタが一周すると、プリスケーラが設定した値で働く
ようになるのです。
クロック周波数が高くても32ビットあるんで、オーバーフロー
するまでの経過時間はざっと50秒。
起動後50秒ほどすると、考え通りの値が出てくるという現象が
読み取れました。

こうなると、「どこかにかいてあるやろ」っと、マニュアルを
探索。
この現象に関係する解説、こんなのでした。

・プリスケーラの説明
  新しいプリスケーラ比は、次の更新イベントで有効になります。

・TIMxEGRレジスタの説明
  UGフラグ:更新生成フラグ
  1にするとカウンタを再初期化。アップカウントではゼロクリア。
  プリスケーラは設定値で再スタート。

つまり、カウンタがフリーラン(オーバーフロー前に比較してリセット
するような機能を使わない場合)している時、プリスケーラが正しく
働くのは最初の更新イベント。
放置状態では、オーバーフローがこのタイミングだったのです。
だもんで、タイマーの初期処理では、ソフトで「UGフラグをオン」
しとかなくちゃいけないよ、ということでした。
とりあえず、この問題はこの方法で解決しました。

※現在は、インプット・キャプチャのタイミングでカウンタを
 ゼロクリアしたいんだが(ハード的に)の設定に悩んでます。

このハードウェア、インプット・キャプチャはタイマー2のch3を入力に
使ってます。 
ch1だとキャプチャのタイミングでカウンタをクリアできるんですが、
ch3だとうまいこといきません。   (私の回路設計じゃな~い)
だもんで、クリアはせずに、キャプチャの前回タイミング読んだ
カウント値と今回値の差から周期を求めることにしました。

| | コメント (0) | トラックバック (0)

2017年6月13日 (火)

並列接続した抵抗

並列接続した抵抗値の計算式

   R = 1 / (1/R1 + 1/R2 + 1/R3)

抵抗値の逆数(コンダクタンス)を総加算して、
その値を逆数にすると並列抵抗値が出てきます。

で、この計算に関し、ちょいとプログラミング
絡みでの失敗体験を。

抵抗の並列接続のある回路で、抵抗値を変化さ
せた時、入出力がどんな挙動をするのかを調べ
るためにテストプログラムを書きました。
  (こんな単純な並列じゃなくって
   けっこう複雑なんですが、簡略化
   して説明)

しかし・・・結果が出ないポイントが発生。

R1~R3のうちのどれかがゼロになると「0割エラー」
が発生して処理が停止。
そりゃそうだ。

R1~R3のどれか一つでもゼロなら、並列抵抗値計算が
ゼロを返すような条件判断を追加して対処しました。

そのときの判断方法、「ゼロ判定、これで良い
のかな?」っと悩んだりしておりました。

・まずまっとうに、それぞれをゼロ判定してOR条件で
 R=ゼロに
  if((R1==0) || (R1==0))  R=0;
  else           R=並列計算処理();

・値が浮動小数点のとき「AND」で判定はまずい?
   if((R1 & R2) == 0)  R=0;

・乗算してゼロの判定でもOKか?
   if((R1 * R2) == 0)   R=0;

おそまつ。

| | コメント (3) | トラックバック (0)

文鎮:ハンダ付け補助ツール 今回も「男の黒」で

「ハンダ付け補助ツール:文鎮」 今回は「男の黒」で(2017年4月6日)
続いて、『鉄に黒』で出来上がってきました。
   (SUSじゃありません)
現時点、4名の方からリクエストいただいています。

11

今回のは塗装じゃなく、鉄の「黒染め」
完璧に防錆されるわけじゃないので、油分が無いと錆びます。

お申し込みは、メールアドレスを記入の上、まずはこの記事に
書き込みしてください。
   (お届け先などはメールでやりとりします)
今ロットの文鎮、外注の黒染め処理が発生したので代金は
『1080円』です。

   ※クリップは付いていません。
     65mm幅のを買ってください。

お届けはレターパックで行います。
   ※ライトかプラスをご指定ください。
     郵便受けに入らないときは、対面受け渡しのプラスを
     選んでください。

口座を記入した紙を同梱しますので、代金+送料を振り込ん
でください。

ブツが届きましたら、感想など、よろしくです。

※関連記事
文鎮? いや、ハンダ付け補助ツールです(2015年11月21日)
ハンダ付け補助ツール(文鎮)、残数4です(2016年11月19日)
文鎮:端面切削中の様子
文鎮:タップ切り 

| | コメント (8) | トラックバック (0)

2017年6月 5日 (月)

マイコンにH/Lを知らせるジャンパー

マイコン基板上の機能設定ジャンパー、こんな回路を使っている
のに出会いました。
1ビットのH/Lでジャンパ設定を知らせます。

B1

普通は (A) かと思うのですが、 3ピンのジャンパピンを
用いて(B) のような接続が使われているのです。

考えられるのは、マイコンの入出力ポートが「誤って」出力に
なってしまった時、ポート出力が電源あるいはGNDの短絡
するのを防ぐため・・・

ここまで考えなければならないでしょうか?

| | コメント (3) | トラックバック (0)

2017年5月12日 (金)

「else」抜け

仕事で使うマイコンたいてい「C言語」でプログラム
しています。
昔はアセンブラばっかしだったんで、良い世の中にな
りました。(遠い目)

しかしバグ取りの方法はあまり変わりません。
実機でプログラムを動かし、いろんな条件を変えて、
スカタンな動作をしないかどうか、あれこれ検証して
悪いところを見つけます。
これの積み重ねで、まともに動く装置が出来上がって
いくわけです。
  プログラムの変更、アセンブラの時代はROMの書き
  換えでした。
  今は、便利なツールがいっぱい。

おかしいところを見つけた時・・・
  組んだプログラムにはおかしいところが見つから
  ないぞ。
こんなとき、
  新しいハードだと、回路がおかしいかも?
  おかしなところを、装置を動かしながら
  「見える」ようにしてみよう。
などと、テストプログラムを書いたりします。
しっかり動きを確認しながら、プログラムをまとめて
いくわけです。
ややこしい装置だと、テストプログラムの方が大きく
なったりします。
  ※量産時の検査用ルーチンのほうが、実際の動作
   をするプログラムより場所をとっているなんて
   こともあります。

さて、そのおかしなところへの対策でした追加が、
また新たな虫を産むなんてことが生じます。
本人は対策したつもりになっているので「あれれ?」
でっす。

先日はこんな失敗を・・・
単純にして示します。

 if(x)      // 条件x
     a1();
 else       // それ以外
     b1();

条件「x」の時は、処理「a1」を実行。
それ以外は処理「b1」をというルーチンです。
a1あるいはb1、どちらかが実行されます。

プログラムを進めていて、このルーチンの前処理
としてちょいとプログラムを追加したのです。
こんな具合。
 if(y)       // 条件yなら
     c1();    // c1を実行を追加
 if(x)         // ↓元の処理
     a1();
 else
     b1();

条件「y」での処理を前処理として、追加したわけ
です。

しかし、落とし穴。
処理「c1」は「y」の条件で実行されるかされないか。
その後、「a1」か「b1」どちらかが実行されます。

しかし、処理「c1」で出た結果が、処理「a1」の中で
変えられることがあったのです。
これが失敗。
おかしな状態になるのは「xとy」の条件が重なった
時だけ。
だもんで、「あれれ?」だったのです。

追加した条件判断「y」では、c1だけを実行して後の
処理をスキップするのが正解でした。
こんな具合に修正して、思惑通りの処理になりました。
 if(y)
     c1();
 else if(x)    // ←このelseが重要
     a1();
 else
     b1();

これで、「c1」「a1」「b1」はどれか一つしか実行
されません。

最初から、「こうだ」と考えに至っていれば、こんな
ミスはしないんです。

  「バグを見つけてそのバグ殺しに追加した処理が
   新たなバグを産む」

この手の、ちょいミス、痛いんですよね~。
(新たな虫探しに余計な時間を食ってしまう)

| | コメント (0) | トラックバック (0)

2017年4月26日 (水)

ARMマイコンをごそごそ

お仕事です。
既存の基板の空きポートにちょいとハードを追加。

A1

0.26mmのポリウレタン線を空きピンにハンダして信号をやりとり。
0.5mmピッチの足なんでたいへん。

息を止めて… うまく付くように祈りながら…
そ~っとハンダ付け。
隣とくっつくとやり直し。

| | コメント (1) | トラックバック (0)

2017年4月 6日 (木)

「ハンダ付け補助ツール:文鎮」 今回は「男の黒」で

ハンダ付け補助ツール(文鎮) の新ロットが
やってきました。

2件のリクエストを頂戴しているので、
今回のでお分けできるのは「2つ」。

今ロットの材質は、SUSじゃなく「鉄」の塗装。
厚みが16mmになっています。 (前のは12mm)

11

左端の黄色クリップは、初回ロットの「鉄」。
手入れしてないと、うっすら錆が・・・・
その奥、青色クリップが「SUS」。
安定のステンレス。サビません。
厚みの違い、わかりますでしょうか?

お申し込みは、メールアドレスを記入の上、まずは
この記事に書き込みしてください。
  (お届け先などはメールでやりとりします)

今ロットの文鎮、代金は「1000円」。
   ※クリップは付いていません。
     65mm幅のを買ってください。
お届けはレターパックで。
   ※ライトかプラスをご指定ください。
     郵便受けに入らないときは対面受け渡しのプラスを。
口座をお知らせしますので、代金+送料を振り込んでください。


※2017-04-07
今回のロット、完売しました。
リクエストいただければ、次回の製作に向けて動きますので。
また、使用感やご意見など歓迎します。

| | コメント (14) | トラックバック (0)

2017年3月22日 (水)

「6809」で制御していました

「ザイコー X2212」 が乗った回路、日立の「6809」 で制御
されていました。 

11

頂戴した回路図の日付が「1984」年。
30年以上前の設計です。

| | コメント (0) | トラックバック (0)

2017年3月17日 (金)

動いたの?

ひさしぶりに引っ張り出してきた実験用電源。
+5V、±15V出力の3出力スイッチング電源を
ベースに、0~±12Vの可変電圧トラッキング
電源(シリーズレギュレータ)を仕込んだもの。
アナログ回路の実験用です。

机の上に置いたら、なぜかガタガタ。
ひっくり返してみたら、「貼り付けゴム足」が
移動!

11

本来、四隅に貼り付けてあったのが・・・
なぜ?

移動の痕跡↓
12

| | コメント (1) | トラックバック (0)

2017年3月 8日 (水)

「8749」を書くなんてひさしぶり・・・

29年前に作ったツール:スケーリング機能付アップダウン・カウンタ
制御プログラムをちょいと変えたいということで、ひさしぶりにPC-9821を
起動。
MS-DOSですな~。
使うのは自作の8748、49ライター。

11

しかし、・・・・ すんなりとはいきませんでした。
PC98のバックアップ電池がアウトに。
カレンダーが狂っています。
   ※リチウム・バナジウム充電池
    VL2330 が使われていました。
    とりあえず、3セルのNiCdを仮つなぎ。

ひさしぶりの「VZエディター 」、WIn環境でばかし仕事してると、
感覚が戻りません。

アセンブラはCP/Mの「MAC」を改造した8048用MAC。
これをMS-DOS環境で動くようにしたもの。

   ※ソースを逆アセンブル。
    8080コードから8086コードにニーモニック変換して
    MS-DOS上でアセンブルしたもの。
    ファイルハンドルじゃなく、CP/MのFCBでアクセス
    しているから、実行中の「ctrl-C中断」は厳禁。

12

懐かしの黒バックに白文字に癒されます。

NECとインテルのチップが残っていました。
13

※チップの拡大 見えるかな?
・NEC製
・インテル製

| | コメント (0) | トラックバック (0)