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

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

参考
関連記事

コメント

非公開コメント