AVRをいじってみた(購入からLED点灯まで)

ライタ持ってないのに、とりあえず石を買ってみてから書き込み方法を考えるという順番でやりましたが、結果としては上手くいきました。

まずは書き込み

パラレルポート経由で線をちょろちょろ引っ張り出せば簡単に書き込めるとのこと。さっそくサブPCの裏側を見ると…パラレルポート発見!これで勝つる!と思ったのも束の間、ケーブルが既に手持ちにありませんでした。少なくとも、すぐ見つかる場所には無し。実家だな…
わざわざそのためにケーブル買うのも悔しいし、シリアル(RS-232C)はやけに電圧が高くて手持ちのパーツですぐ組めそうにないし、仕方ないので他のマイコンを使って書き込みを試みました。手元のデータシート見たりぐぐったりしているうちに、よさげなものを発見。

http://homepage2.nifty.com/denshiken/AVW020.html

少し前のトラ技についていた、USB基板が大活躍。リンク先のソフト書き込んで、資料どおりにブレッドボードで適当に配線したら、あっさりAVRに書き込みできしました。ソフト作者様には頭が上がりませんね。ついでに、同じプログラムでPICも書けるようなことが書いてあります。
この基板が付録についていたトラ技は、調べてみると1090円だったようです。基本的な構造や使い方を解説した記事も載っているし、ついでに同じ回に昇圧/降圧回路の特集もあります。お買い得すぎ…。


石は8ピンのATtiny85です。何も考えずに千石の閉店間際に急いで買ったこの石、8ピンの製品のなかではかなり中身がでかいほうの石みたいです。

まずはLED

初歩の初歩として、点滅すらしない「ただ点くだけ」を製作。ほうほう、DDRレジスタでin/outを決めて、あとはPORTレジスタやPINレジスタ使えばいいんだな。まああっさり成功。
ここまで分かれば、後は使いたい機能のリファレンスを必要に応じて見るくらいでいいだろ。

と思ったら、予想外のところに落とし穴がありました。設定用のレジスタに値を入れても、うまくタイマー&PWMが動かない…。原因は、用意されている定数の解釈違いでした。一例として、TCCR0Aに、COM0A1とCOM0B1のビットを立てたかったのに上手くいかず…

TCCR0A = COM0A1 | COM0B1 ;

ここでヘッダファイルを見ると

#define TCCR0A  _SFR_IO8(0x2A)
#define COM0A1  7
#define COM0A0  6
#define COM0B1  5
#define COM0B0  4
#define WGM01   1
#define WGM00   0

ぐは。そりゃーOR取ってうまくいくわけない。Web上のあちこちに転がっているソースを見ると、どうやら_BV(値)ってマクロでいちいち左シフトして使わないといけないようです。

    \note The bit shift is performed by the compiler which then inserts the
    result into the code. Thus, there is no run-time overhead when using
    _BV(). */
    
#define _BV(bit) (1 << (bit))
TCCR0A = _BV(COM0A1) | _BV(COM0B1);

こうか!きもい!
まだ試していないけど多分これでOK。直接、16進数で書いたら狙ったとおり動くところまでは確認済みです。定数を直接書いていくと後でソースが読めなくなってしまうので、テストプログラム以外ではBVを使うようにします。