割込み制御ソフトUART
今度は開発環境が(11/24/07)
冒険物語はこれで終わりではなかった。ソースが大きくなってきたので懸案のファイルの分割化でまた奇妙な現象に悩まされた。定石どおり、ヘッダーファイルを作り、関数のプロトタイプと#ifdefを使ってグローバル変数をそこへ移してコンパイルした。これが通らないのである。やれ関数を多重に定義しているの、知らない変数があるなどと身に覚えのないエラーが頻発し先に進めない。
まあ、今まで何のためにあるのか良く理解できなかった#ifdefだの#ifndefなどのプリプロセッサーの指令をマスターできたのは収穫だったが、要するにヘッダーがうまく機能していない。それではというのでヘッダーをやめて、全部分割したファイルに戻してやってみる。所詮ヘッダーファイルを#includeするというのはそれぞれのソースにコピーしているにすぎない。ところがこれでもエラーが出る。フルートの勉強会から気分よく帰ってきて、その勢いでPCに向かい、ソースファイルを一本に戻してみた。何とこれでも同じエラー。
これは間違いなく開発環境がおかしい。他のプロジェクトを見に行ってみると、何と何と前のプロジェクトからソースファイルが消えてなくなっている!今度のプロジェクトはこのソースのコピーを新しいプロジェクトに持ってきて展開していたのだ。開発環境のAVRstudioのバグである。やれやれ。印刷とバックアップがあるので実害は少ないが、ひどい目にあわされたものである。要するに環境の中にソースファイルが2つ入っていて、画面上にはひとつしか見えなかったのだ。それで多重定義だとコンパイラーが怒っていたのだろう。
この環境は、無料なのであまり文句は言えない。しかもコンパイラーはプラグインのgccコンパイラーで環境それ自体と独立している。makefileのパラメータを切るのが面倒でこの環境を使っているが、エディターも余り使いよいものではないし、そろそろ見直しが必要なのかもしれない。ソースコードデバッグは割り込みやタイミングの必要なソフトでは余り役に立たないし。
平和な気持ち(11/25/07)
研修講師の準備をまだ何もやっていない。明日から1週間はこのマイコン騒ぎを封印しなくてはなるまい。しかし、ちょうどその節目に開発が一段落して気分はとても爽快だ。開発環境の方は、新しいバージョンをダウンロードしてはみたものの、この手の新バージョンは用心しないといけないので、インストールはやめた。特にWeb上での情報はない。
不具合は、新しい環境(プロジェクト)を作り、いちからファイルを用意したら、全く問題なく、ファイル分割は成功した。ただ、レジスター変数の宣言(使わないという)をそれぞれのソースファイルにしなくてはならない。これは面倒だ。とても公開など出来ない。
考えてみれば、時間にクリティカルなのは、送受信のデータをループで待ちをかけながら、処理するときだけで、バッファリングは関係ないことに気づいた。割り込みルーチンをC言語側に持って来れば、面倒なCからASMへのアドレス渡しをしないですむ。これがうまく行ったのである。割り込みルーチンのdis-assmeblerリストには壮大なpush/popがつながり、最初動かないのであれこれ待ちの調整をしていたが駄目。しかし、原因はもっと簡単で、単に入力のHigh/Lowを間違えていただけ。これを直したら、全く問題なく動いた。38.4kbpsでも大丈夫。
ソフトUARTのソースコードはこちらです。lzhファイルを解凍して中のADC_TEST.txtをご覧下さい。「ADC_TEST.lzh」をダウンロード
これで、この研究の成果は、公開しても大丈夫なレベルに到達した。とても平和な気持ちでこの記録を書いている。
開発一段落(12/1/07)
今度のマイコンは当面の目標を温度ロガーにおいている。室内の温度の推移は前から気になっていて、どの程度の温度差が各部屋にあるのか知りたいからである。このTiny26はEEPROMメモリが128バイトしかなく、保存できるデータ量が少なすぎる。シリアル通信のことも考えれば、既に買ってあるMega168は4倍の512バイトあり早くこれにすべきなのだが、生来のへそ曲がりがここにも出て、今のチップで何とか機能をつめこんでやろうと無理をしてきた。ソフトUARTもその典型だ。このあいだTiny26の後継機種861(これはSRAMが8キロ、EEPROMが512バイトある)が日本で売られていることを見つけ、わざわざ入谷まで行って買ってくることもないのだが、まあ、昔ハムで多段スーパーの向こうをはって0V1という最小の受信機でDX(遠距離通信)をやっていたようなものかもしれない。
それでもこの温度ロガーは、タイマー1の一秒クロックで暫定のTODを作り(これは一回で想定どおり動いた。だいぶ慣れてきたようだ)、PCに現在の温度を知らせるところまで来た。PCでのコマンド入力もバックスペースの処理を考えて相当こなれてきた。
まあ、このへんは玄人だからな。ブレッドボードから健気にPCに十秒単位に温度を知らせているチップを見ているといとおしくなる。EEPROMの処理は検討だけでまだ手をつけていない。小さいけれどそれなりにファイルの形で使いたいので色々考えている。このときが何と言っても一番楽しい。Robustnessだったか、オブジェクトとして独立したソフトを作る工夫が面白い。
| 固定リンク
「AVR」カテゴリの記事
- ソフトI2Cはクロックストレッチまで手を出してあえなく沈没(2017.09.02)
- オシロのテストどころかソフト開発で大はまり(2017.07.26)
- 超音波方式の人感センサーI2C化と新しいオシロ(2017.06.29)
- motionの動体検知はRaspi3の電源が安定しない(2017.04.16)
- 赤外線学習リモコンはデータ再現で挫折したまま進まず(2016.07.21)
コメント