しつこくAVRマイコンを研究しています。
なかなかうまく行かないので・・・もうこの歳で新しい技術の習得は無理か?とあきらめかけましたが・・・やっと割り込みのプログラムが動きました。
問題点
・10ms毎に割り込みを発生させ、グローバル変数 cnt をインクリメントする。
・メインプログラムで cnt を0にクリアしてから、100になるまで待つ。
という簡単な処理です。 100になれば1秒になるハズです。
でも、何度やってもうまくいきませんでした。
ところが、これもBuildした過程で生成させるlssファイルの中のアセンブラを見たら(もちろんアセンブラなんか分かりませんが)、変数のアクセスなのにメモリを参照していないことに気がつきました。 プログラムがあまりに簡単なので、変数がすべてレジスタに乗ってしまったようです。そうすると、割り込みで変化する変数を読めない場合が出てきそうです。
ということで、それに気がついて、さらにネットでいろいろ調べて見ると・・・ volatile という記述が必要なことがわかりました。
先ほどの cnt という変数の宣言に volatile を付けてBuildしてみると・・・ちゃんと動作しました。
解決策
割り込みで使用するグルーバル変数の宣言に volatile を付加する。
volatile long cnt;
ふっ~! この単純なプログラムを動作させるのに2日が無駄になりました。
きっと、こんなことはマイコン使いの方達にとっては常識なのでしょうね。
やっぱり、誰か私にAVRの基本的な使い方を教えてくださ~い。
現在、AVRマイコンはATMEGA88というのを使用しています。
秋月電子で買った、ブレッドボードで実験しています。
ここまでに、すでに2個のAVRマイコンが「お亡くなり」になっています。 合唱ではなく合掌!
私が、ずっと参考にしている「AVRマイコン活用ブック」のプログラムには volatile という記述がありませんでした。 これは、コンパイラのバージョンによっては、最適化の度合いがちがうのでしょうかねぇ。
どちらにしても、コンパイラの頭が良すぎてはまっていたようです。