#freeze
[[FrontPage]]

2008/10/09 からのアクセス回数 &counter;

#contents

SunSPOTのeDemoには、ATMELのATmega88が使われていて、拡張ボードもATmega88だと都合がよいので
AVRを勉強することにしました。

ちょうど、「エレキジャックNo. 8」にTiny2313が付録についてきたので、これを使ってみることにします。
また、「インターネット・ガジェット設計」という本が結構おもしろいので、これもさらってみます。

ソフトの開発でも同じですが、
- 頭で理解するのではなく、自分の手を使って実際に最初から自分でなぞってみること
- 常に複数の対応を準備しておき、場合に応じて対処すること

が大切です。

** ライターを用意する [#ied0ea6a]
ちょうど、EZ-USBが手元にあり、チップ抵抗の半田付けを練習するために、オプティマイズの
[[EZ-USBを使用した AVR ISP ライター>http://optimize.ath.cx/avr/index.html]]を使うことにしました。

送られてきた部品は、
#ref(1.jpg);
です。


たった4個のチップ抵抗の半田付けに半日かかりました。
#ref(2.jpg);

** 開発環境の整備 [#x132a66c]
*** Windowsの環境 [#lb9792c6]
ライターがWindowsでしか動作しないので、最初はWindows 2000に開発環境を整備しました。

「エレキジャックNo. 8の第5章AVRマイコンを使おう」に沿って
- [[AVR Stduio>http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2725]] ダウンロードには登録が必要です
- [[WinAVR>http://sourceforge.net/projects/winavr/]]

をダウンロードしました。このほかCygwinもインストールしてあります。

ライターのソフトは、オプティマイズのページからダウンロードし、WinAVRをインストールしたディレクトリのbinと同じ場所に入れます。

エレキジャックNo. 8の図5-6
((初心者を対象とした入門書なのに、実体配線図のLEDのKとAの記述が逆になっているので注意してください。))
を参考に、LEDの点灯例題を

#ref(6.jpg);

のようにブレッドボードで回路を組んで、ライターでSignatureを読み込むと、

#pre{{
$ avrezusb.exe -rf
Detected device is ATtiny2313.

Low: 01100100
     ||||++++-- CKSEL[3:0] NbNI
     ||++-- SUT[1:0] - N
     |+-- CKOUT (0:PD2VXeNbNo)
     +-- CKDIV8 NbNlw

High:11-11111
     |||||||+-- RSTDISBL (RESETs 1:L, 0:(PA2))
     ||||+++-- BODLEVEL[2:0] f[^V[gQ
     |||+-- WDTON (WDT 0:ON, 1:)
     ||+-- SPIEN (1:ISP~, 0:ISP) Parallel
     |+-- EESAVE (EEPROM 1:, 0:)
     +-- DWEN (On-ChipfobO 1:, 0:L)

Ext: -------1
            +-- SPMEN (SPM 1:, 0:L)

Cal: 92
}}

のように正しくTiny2313が認識されました。

avrezusbの使い方は、helpを参照してください。

#pre{{
$ avrezusb.exe -help
AVREZUSB - AVR Serial Programming tool R0.30 (C)ChaN,2004  http://elm-chan.org/
           Modified by OPTIMIZE for EZ-USB V4.3

Write code and/or data  : <hex file> [<hex file>] ...
Verify code and/or data : -v <hex file> [<hex file>] ...
Read code, data or fuse : -r{p|e|f}
Write fuse byte         : -f{l|h|x}<bin>
Lock device             : -l[<bin>]
Erase device            : -e
Copy calibration bytes  : -c
SPI control delay [-d3] : -d<n>

SUPPORTED DEVICE:
AT90S 1200,2313,2323,2333,2343,4414,4433,4434,8515,8535
ATtiny 12,13,15,22,25,26,45,85,2313
ATmega 8,16,32,48,64,88,103,128,161,162,163,165,168,169,323,603,8515,8535
AT90CAN 128

SUPPORTED ADAPTER:
EZ-USB only.
}}

*** 純正ライターの購入 [#mcfb0d99]
Macでの開発のために、純正のAVR ISP mkIIを購入しました。

#ref(4.jpg);

WindowsのAVR Stduioで動作を確認しようとしたところ、いきなり
+ ソケットのピン配置を勘違い
+ Tiny2313を認識しない
+ プログラムが書き込めない
+ 書込後に正常に動作しない

という事態に陥りました。

原因を調べたところ、
+ AVR ISP mkII のユーザガイドには、
#ref(pin_assign.jpg);
のように書かれているので、ついケーブルの赤いラインのピンが1番だと勘違いした。
この図は、ライターにソケットを付けた時にボードの上からみた図で、赤いラインに一番近いピンは2番
ピンです。どうようのメッセージがhttp://metrocrusader.blog41.fc2.com/blog-date-200711.htmlにもありました。
+ EZ-USBのISPライターではライターから電源を供給していたが、mkIIは外部電源を必要とする
+ 回路に組み込んだままでは、プログラムが書き込めなくて、クリスタルを付けた別ブレッドボードを用意した。
[[永山さん>http://cap.dcnblog.jp/]]から回路に組み込んでISPが可能な条件が[[ChanNさんのページ>http://elm-chan.org/works/avrx/report.html]]のISP対応設計に説明されていると教えていただきました。
+ これも当たり前なのですが、うっかりライターのケーブルを接続したまま、動作チェックをした

ことが原因と分かりました。

*** USBマルチ電源 [#sa13f6b3]
ターゲットボードの電圧が、3.3Vなので、トランジスタ技術1月号の付録基板、「USBマルチ電源」を使って電源を供給することにしました。

#ref(usbPower.jpg);

更に、クリスタルをセットした書き込み用のブレッドボードを用意し、プログラムの書き込みをしました。

#ref(writting.jpg);

*** Mac OSXの環境 [#a4db9613]
最初は、MacPortを使ってインストールしようとしたのですが、途中でエラーとなったので、今回は
- WinAVRのマック版である[[AVR MacPack>http://www.obdev.at/products/avrmacpack/download-de.html]]のAVRMacPack-20080721.dmgをダウンロードしました。

インストールはマック用のパッケージ形式になっているので、マウント後のAVRMacPack.pkgをダブルクリックするだけです。

libusbが正しく動作するように念のため、インストール後に再起動をした方がいいです。

** 動作確認 [#u9784a51]
テストプログラムには、エレキジャックNo. 8のLEDの点灯プログラムを使いました。

今回は、ブザーを必要としないので、以下のようになります。

#pre{{
#include <avr/io.h>

#define F_CPU 1000000UL
#include <util/delay.h>

typedef unsigned char BYTE;
typedef unsigned int WORD;

#define bitLED1	3
#define bitLED2	4

#define LED_RED_ON		PORTB |= (1<<bitLED1)
#define LED_RED_OFF		PORTB &= ~(1<<bitLED1)
#define LED_BLUE_ON		PORTB |= (1<<bitLED2)
#define LED_BLUE_OFF	PORTB &= ~(1<<bitLED2)

#define DELAY	_delay_ms(1000)

main(void) {
	DDRB = (1<<bitLED1 | 1<<bitLED2);

	while(1) {
		LED_RED_ON;
		LED_BLUE_OFF;
		DELAY;
		LED_RED_OFF;
		LED_BLUE_ON;
		DELAY;
	}
}
}}

ここで、
- DDRxでxポートへのI/Oポートへの入出力を切り替えます、bitに1をセットすると出力、0をセットすると入力となります。
- PORTxでxポートへの値の設定と状態のチェックを行います。
- PINxはxポートから入力値を読み取ります。


** コメント [#ua8e5faa]
この記事は、

#vote(おもしろかった[20],そうでもない[1],わかりずらい[4])

皆様のご意見、ご希望をお待ちしております。
- 永山さんのご指摘により、ChanNさのISP対応設計のリンクを追加 -- [[竹本]] &new{2008-10-14 (火) 18:55:42};
- ターミナルを使用したとか、なぜ書かないんでしょうか? それぐらい分かっていて当たり前だから?あなたは、最初の一歩からそんな事がわかっていたの? わざと情報を出し惜しみして初心者を困らせる典型的な嫌な人 --  &new{2012-06-12 (火) 13:26:34};
- 失礼しました。これは私の最初一歩を記録したもので、誤解を与えたことをお詫びします。自分の苦労したところを他の人と共有したいという思いでこの記事を書きました、どうぞご理解ください。 -- [[竹本 浩]] &new{2012-06-12 (火) 15:09:24};

#comment_kcaptcha

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc