2017/05/09

AVR 分刻みのタイマ検討と結果

事前検討
これまで Slip21 から設定された時間間隔で AVR にコマンドを送り充電器の充電流値を得ていたから,タイマ機能は Slip21 が担っていた。タイマのないマイコンはないだろうなくらいよく使われるものらしい。私の使用している AVR ATmega8 には3個のタイマがある。これらタイマが分刻みのタイマとして使えるかどうか検討してみた。

クロックは内蔵の 8MHz としている。確かシリアル通信のため,この周波数にした記憶がある。タイマは基本クロックを最高 1024 分周まで可能だから,タイマクロックの最低周波数は 7.8125 kHz になる。周期だと 0.128 ms となる。16 bit タイマだとカウンタは unsigned short を宣言して 0 ~ 65535 までの範囲で使えるのだろうか。そうだと最大でも 84 s 弱のタイマにしかならず,現状の5分には程遠い。

ディレイ(遅延)関数を利用したソフトウェア簡易タイマはどうだろうか。この関数の変数は unsigned int と宣言されているから,65 s までの遅延が可能だ。60 s に設定して,これを5回繰り返せば,ラフな5分が得られるのではなかろうか。この種のプログラム動作中,他のジョブができないけど,さして支障がないような気がする。中断するには,給電している USB コネクタを抜くかリセット SW を設ければいいだろうと思う。

データシートによれば,外付けの低周波クロックを導入すれば,正確な時間タイマが得られそうだが,そこまでの精度はいらないだろう。目的は充電池の充電流値のトレンドを得る事なのだから。

float 演算は double より遅い?
AVR でのプログラミングに単精度の実数を使用している。整数型でプログラムするのが面倒だからだ。ネット情報だとPCのコプロセッサが外付けだった 386 の時代だと浮動小数演算は単精度で 486 からは倍精度になったので,単精度を倍精度に変換,そして結果を単精度に戻すため遅くなるのだと言う。大学のサイトにも,
現在のコンピュータでは, float 型よりも double 型を使うことが多い.その理由は
 1. 精度が良い.
 2. 計算速度が速い.
ということがある.速度が速い理由は,現在のほとんどのコンピュータには double 型のデータを専門に扱う回路が付いているからである. float 型の計算を行うときには,一度 double 型に変換した後,この回路で計算し, その後再び float 型に変換される.したがって, float 型の方が計算時間が多くかかることになる. float 型にはメモリサイズが double 型の半分という利点があるが, 現在のコンピュータは十分なメモリを持っているので,その利点が有効であることはあまりない.

にわかに信じ難く,実際に検証した人がいた。コンパイラは実際のハードを想定して設計するし,演算プロセッサもソフトを無視して設計する事はないから当たり前かな。さらに検索したら今でも FORTRAN の方が C より速いとあり,なるほどと思う。

今時,K&R 準拠の C コンパイラを動かしている趣味人がいるとも思えない。30年以上前に購入した K&R 翻訳本でも ANSI 準拠となっていた。昔,リアルな社会世界から隔絶している東大総長を吉田茂首相は曲学阿世の輩と呼んだ。西欧の天文学にしても,古代のアリストテレス,プトレマイオスの世界観から何世紀も抜け出せなかった。地動説が日の目をみるようになったのは観測と実証主義の考え方が西欧社会に広まったからだ。

マイコンに触っていたら,倍精度演算が単精度演算より速いと言われたら,そんなバカなと思うのが普通だと思う。私は高校時代,生物を除いて実験の授業を受けた事がなかった。サイエンスを何と座学だけで履修したのだ。それを異常と思わない教育界。

座学だけで革新(イノベーション)ができるのなら,日本の失われた30年は説明がつかない。明治以来の教育がおそらく日本のイノベーションを阻害しているのだろう。しかし,これは変えようがない。今では文科省都道府県教育委員会がなくなっても,この現状は変わらないと思うようになっている。先生自体が変わらないと,ダメなのだろう。理科とサイエンスは交わる事はないのかとも思う。

デッバガが使えない環境
ICE を持っていないので,AVR Studio7 の高機能デバッギングが使えない。Slip21 に使用したプログラム を AVR に一部移植して Teraterm に出力しようとしたら,どうも途中で停止してしまう。プログラムを小分けにして,ひたすら出力させたらポインタ宣言が原因だった。Avr-gcc の関数宣言を真似たのがよくなかった。私の場合,Teraterm をデバッガ代わりに使えたけど AVR 単体のスタンドアロンのデバッギングはどうするのだろう。何らかの表示器がないと大変そうだ。このデバッグに丸一日費やした。。。

Debug と Release 版による違い
Debug 情報を含まない Release 版を Build したら,float 表示せず,リンカに Debug 版同様のライブラリを追加しても効果がない。Atmel の説明にあるように -vprintf のリンカオプションチェックを施すとOKになったが,コードサイズが大きくなった。浮動小数演算の実行コード最適化に処理が複雑な vprintf が何故必要になるのだろう。

                                                Debug                              Release
Program Memory Usage : 3358 bytes   41.0 % Full    4840 bytes   59.1 % Full
Data Memory Usage : 88 bytes   8.6 % Full          88 bytes   8.6 % Full

遅延タイマの実測結果
ATmega8 にシリアル通信によるコマンド入力により,無限タイマを起動し所定の遅延終了後にカウンタと ADC を出力させる。その時間間隔をTeraterm 画面をみて,カシオ時計 F-84W のストップウオッチ機能により測定した。2017-04-25 17:23

Nominal time      Measurement
1min                  59"35
2min                  1'58"44
3min                  2'57"08
4min                  3'55"88
5min                  4'55"91

本タイマの目的は充電流変化のトレンド測定なので,チューニングせずともこの精度で十分だろう。

参考
2017/05/05

AVR Studio7 浮動小数表示のためのリンカ設定

充電器の充電流値の記録をこれまでの Slip21 から Teraterm へ変更したプログラミングしたけど,
表示が ? を出力し上手くいかない。デジタル高精度温湿度センサ HDC1000 の表示も同様だ。Studio7 の最新版をインストールしたせいだろうか。最初,ビットシフトのマクロである _BV が悪影響を及ぼしているのではないかと3日,悩んだ。単純なテストプログラムの結果,リンカ設定が必要な事を思い出した。再インストールしたら,前回の設定は無視されるのだろうと思う。

Atmel マニュアルによれば,
-Wl,-u,vfprintf -lprintf_flt -lm

の設定をすべきだそうだ。AVR Studio7 の場合だと,メニュの Project > Properties をクリックし,ToolChain をクリックすると Linker の設定ができる。私は,libm.a と libprint_flt.a を追加した。
AVRlinker.png 

1年前の浮動小数表示トラブルを忘れていたのは驚きだ。加齢のせいかな。一度設定するとリンカもコンパイラも変える必要もないせいもあるかもしれない。

いかに浮動小数演算がリソースと CPU を浪費するか。仕事で使っていた機械系 CAD の CADAM は浮動小数演算で AutoCAD は整数型だった。CADAM は結局,大手だけで中小は AutoCAD が大勢を占めた。実数型データは取扱が直観的だけど,整数型はデータ処理が高速にできるのだろうと思う。



参考

2017/05/03

LAN 接続XP機に AVRWRT インストール

AVR ライタ問題はどうにもならなくなり,元の AVRWRT を XP から起動する事にした。常用機と LAN 接続されているサーバ機はXPだからだ。しかしXPですら,AVRWRT のドライバインストールはすんなりいかなかった。

インストールできるもののデバイスマネジャをみると,感嘆符が付いている。説明をみるとデジタル署名の不適合だそうだ。署名無視に変えても状態は変わらず,当該ドライバを削除した。XP のデバイスドライバのデジタル署名を無視する設定に変え,AVRWRT 添付のバッチファイルを使用して再インストールようとしてもうまくいかない。諦めかけて6回目くらいのトライで,OSに選択をまかせインストールしたら上手くいった。AVRWRT を起動させターゲットをチェックすると,BitBang ではできなかったターゲットの認識もOKだ。実際に,書き込みロードすると新プログラムが作動した。

XPから Windows 10 ファイルが見えない
しかし,ロードファイルを共有化してXPから Windows 10 アクセスしようとしてもできない。XPから Windows 7 のフォルダは見えるものの Windows 10 はダメだ。世の趨勢に合わせ,常用機を Windows 10 にバージョンアップしたものの私の場合,何のメリットもない。仕方なく先の書き換えは XP に転送した。Atmel Studio7 の作業フォルダをXPに変えた方が手間が省けていいだろう。

純正 AVR ライタ
今回の発端は Studio7 が Windows 10 Home Anniversary に変えたところ起動しなくなった事だ。AVRWRT のデジタル署名回避も Anniversary ではできなくなった結果,新ライタのトライとターゲットの配線変更を繰り返した。AVR プログラミングをする機会が多いなら,Atmel 純正ライタがいいだろうと思うが,生産中止らしい可能性もある。業務用のPCなら今時,xpだと仕事にならないだろうが,ゴミ扱いになっても全ての廃却は止めた方がいい。私のように保管庫サーバにしてみてはいかが。

Windows 10 Home Anniversary 未対応デバイスドライバに振り回された1箇月だった。ネット情報を頼りに自作ライタを漁ってみたものの,OS とターゲットは限られた動作実証のみのせいか,私の ATmega8 と OS の Anniversary が上手くいかない要因の一つかもしれない。個人でマイコン開発をやるなら,やはり開発環境とターゲットをデファクトスタンダードにしないとと結局,時間の浪費になるのか。
 
2017/04/30

FTDI BitBang AVR-Writer トライしてみた

 FTDI BitBang AVR-Writer と称される配線図をみると,ターゲットの RESET が FT232RL の DI に接続されていて前回よりまともそうだ。

avrdude-GUI をインストールすると,ポートリストに
avrdoper
COM3
COM4
COM5
LPT1
LPT2
usb
USB

が表示され認識されていポートが確認できて好感がもてる。以前インストールした avrdude に設定すると,デバイスリストに ATmega8(m8) がある。Programmer リストには,前々回失敗した USBasp が, 

Any usbasp clone with correct VID/PID(clone)
USBasp, http://www.fishl.de/usbasp/(usbasp)

として,さらに目的のは 
FT232R Synchronous BitBang (ft232r) 

がそうだろうと思う。Windows のデバイスマネジャは USB デバイスとして USBasp を認識してはいるが,ポートリストにはそれらしきものが3種ありそれぞれ個別にテストするとなると,結構大変だ。その前に AVRWRT の Zdiag による変換ドライバを消去した方がいいのかもしれない。コネクタ半田付けを Box コネクタに戻して USBasp をリトライするか,それとも FT232RL モジュールで行くべきか。

Zdiag が Windows 10 Home Anniversary に対応しているかどうかも疑わしい。avrdude-GUI が認識したポートのモジュールでトライした方がいいだろう。avrdude-serjtag に同梱されている conf リストには usbasp clone がないので本家 avrdude の最新版を上書きしてみたが,ダメで説明にあるサイトから conf をダウンロードした。

前回および前々回の失敗にこりて,ハードウェアに先がけてソフトの検討から入った。さて配線変更しトライすると,エラー画面が出る。説明にあるように配線の導通チェックを2回やったけどダメだ。ちなみに AVRDUDE のエラー画面は通電していなくても同じだから,大して意味のある表示ではない。

参考
2017/04/25

Zadig は AVRWRT USBasp の署名なしを解消するも書込み不能

Zadig なるソフトが Windows 10 のデジタル署名回避に使えるとのネット情報によりインストールした。ソフトを起動後,目的のデバイスを挿入すると下図に示すように認識する。

Zaidg.png 


ZaidgUSBasp.png
 
デバイスマネジャをみると AVRWRT は認識され,AVRWRT も起動した。やはりダメか。
AVRWRTfail1.png 

USBasp と延長コードを新たに購入して,AVRDUDE と USBasp の組み合わせによるトライもダメだった。
USBaspTrial.jpg 
avrdude.exe: error: could not find USB device with vid=0x16c0 pid=0x5dc vendor='www.fischl.de' product='USBasp'
avrdude.exe done.  Thank you.

中華製 USBasp クローンの動作を諦め,さらに検索したら,「FT232Rモジュールを使ったAVRマイコンのライターと書き込みソフト」とあり,ヘルプ画面をみたら,ATmega8 にも対応している。トライしてみる価値がありそうだ。

参考