このドキュメントは http://edu.net.c.dendai.ac.jp/ 上で公開されています。
ここでは AVR のPORTB に LED を接続し、 PORTD の 4番端子にはスイッチを 繋ぎ、 In-System Programmer を接続できる回路を作ります。 これを使用して組み込み系のソフトウェア開発の基礎を学びます。
トレーニング用の回路はブレッドボードで作ります (写真参照 クリックすると拡大します)。 これは多数の穴のあいたボードで、 IC などをそのままさすことができます。 また専用の導線を使うことで半田付け無しで回路を構成することができます。
PORT B 全てに LED を接続します。 そのために、 まず、マイコンの出力電力で 8 本の LED を点灯できるか確認します。 通常の赤色 LED は電圧降下が最大で 2V程度で、電流は 10から20mA 流せば明 るく点灯します。 データシート p.177 Electorical Characteristics によると、全電流の合計は 200mA です が、電流を取り出したときの出力電圧は VOHに書かれているよう に電源電圧や出力電流に依存するようです。 さらに、p.192 Figure 105 をご覧下さい。このグラフは電源電圧 5V のもの ですが、I/Oピンから取り出す電流により、出力電圧が落ちていくことが分か ります。 電源電圧 5V では 10mA で 0.3V、20mA で 0.5V の電圧降下が起きるようなので、 電源電圧 4.5V でも、 10mA では 4.2V、20mA では 4V 程度の電圧が得られる と予想できます。
使用する LED ですが、 ここでは秋月電子で販売している C-551SR ( データシート) カソードコモン1文字タイプを接続します。 これには 8 個の LED が内蔵されています。 ATtiny2313 から取り出せる電流は 200mA なので、一つあたり 25mA 程度が限度です。 一方、 C-551SR の一個の LED の電圧降下は 1.8から2.2V です。 乾電池 3 本で動かす場合、電圧の変動を考えて最大 5V とすると落さなけれ ばならない電圧は 5 - 1.8 = 3.2V です。これを抵抗で落すことを考えます。 この時、例えば限界値までではなく、10mA 流すとすると接続すべき抵抗値は 3.2/0.01 ≒ 320 Ωです。 これより大きい(安全側)の抵抗値はE12 系列だと 330Ω となります。 但し、 10mA 流す必要もないのであれば、これより大きい抵抗値でも構いませ ん。 例えば、 1kΩ でも問題無く点灯します。
ブレッドボードの構成は 3 段構成にします。 上段にマイコン、中段に 7 セグメント LED を配置します。 ただし、配線はなるべく直線的かつシンプルになるように工夫します。
電源を配線します。 ブレッドボード上で赤や黒または青で表示されている専用のライン同士に電気 が流れるように電池ボックスやジャンパ線を繋ぎます。
ATtiny2313 の IC ソケットを上段に配置します。一番ピンが下に来るようにします。 20 番ピンを電源に、10 番ピンをグランドに接続します。
リセットをプルアップ抵抗を接続して、VCCに接続します。 プルアップ抵抗はデータシート p.151 にあるように 10kΩ以上の抵抗で プルアップしてください。
電源のパイロットランプ用に抵抗を介して 1つ LED を接続してグランドに落 とします。 明るく光らせるには330Ω などの抵抗を使用しますが、常時点けること になるので、暗くてよいなら 10kΩ 程度の抵抗でも構いません。
ブレッドボードの中段または下段に 7 セグメント LED C-551SR を配置します。 カソードは 3, 8 番ピンなのでどちらか一方をグランドに接続します。 PB0〜PB7 は 12番ピンから 19番ピンなので、そこからそれぞれに 330Ω 程度の抵抗を接続します、そして、接続した抵抗から順に C-551 に接続しま す。 配線を重ならず単純にするために、 PB0からPB7 を、それぞれ順に 1,2,4,5,6,7,9,10 に接続します。 これにより、 7 SEG には PB0 から順に E, D, C, DP, B, A, F, G に接続す ることになります。
PD4 を 10kΩをプルダウン抵抗としてグランドに繋ぎ、また、プッシュ スイッチにつなぎます。スイッチのもう一方は VCC に繋ぎます。 これにより、スイッチを押していないときは 0V になり、スイッチを押すと VCC になります。
In System Programmer との接続は次の通りになります。
ISP | 意味 | ATtiny2343 |
---|---|---|
1 | miso | 18 |
2 | VCC | 20 |
3 | sck | 19(データシートでsclとあるのは誤り) |
4 | mosi | 17 |
5 | rst | 1 |
6 | GND | 10 |
AVRISP mkII のコネクタはそのままではブレッドボードに刺せませんので、変 換基板を作成します。
部品 | 数量 |
---|---|
AVR マイコン ATtiny2313 | 1個 |
ブレッドボード | 60 列が 3〜4 段のもの 1 つ。専用の配線材も含む |
カソードコモン 7 セグメント 1 桁の LED (C-551SR) | 1個 |
単体の LED | 1個 |
タクトスイッチ | IC ピッチの基板用 1 個 |
330Ω 抵抗 | 8 本 |
10kΩ 抵抗 | 3 本 |
電池ボックス | スイッチ付。単3、または単4三本直列用 |
電池 | 電池ボックスに適合した物 3 本 |
変換基板(配布します) | 1枚 |
変換基板用ピンヘッダ1 2×3 | 1つ |
変換基板用ピンヘッダ2 L型 1×6 | 1つ |
以下にサンプルプログラムを 2 例示します。 このプログラムをアセンブルし、作成した回路に ISPで AVR に書き込み、開 発環境が完成したことを確かめて下さい。
このプログラムはスイッチの状態により LED の点灯、消灯を切替えます。
/*
* switch.asm
*
* Created: 2012/10/11 5:40:13
* Author: sakamoto
*/
.device attiny2313
.include <tn2313def.inc>
.cseg
.org 0x0000
rjmp reset
.org INT_VECTORS_SIZE
reset:
ldi r16,low(RAMEND)
out SPL,r16
ldi r16,0xff
out ddrb, r16
ldi r16,0
out ddrd,r16
ldi r16,1<<4
out portd, r16
.def pattern = r16
main:
sbic pind, 4
rjmp swon
swoff:
ldi pattern,0xff
out portb,pattern
rjmp main
swon:
ldi pattern,0x00
out portb,pattern
rjmp main
.exit
/*
* switch.asm
*
* Created: 2012/10/11 5:40:13
* Revised: 2017/9/21
* Author: sakamoto
*/
.device attiny2313
.include <tn2313def.inc>
.cseg
.org 0x0000
rjmp reset
.org INT_VECTORS_SIZE
.equ sw = 4
reset:
ldi r16,low(RAMEND)
out SPL,r16
ldi r16,0xff
out ddrb, r16
ldi r16,0
out ddrd,r16
sbi portd, sw ; pull up
in r16, MCUCR
cbr r16,PUD ; clear pull up disable flag
out MCUCR,r16
.def pattern = r16
main:
sbis pind, 4
rjmp swon
swoff:
ldi pattern,0xff
out portb,pattern
rjmp main
swon:
ldi pattern,0x00
out portb,pattern
rjmp main
.exit
このプログラムは、全ての LED に対して点灯、消灯を定期的に繰り返します。
/*
* flash.asm
*
* Created: 2012/10/11 15:39:43
* Author: sakamoto
*/
.device attiny2313
.include <tn2313def.inc>
.cseg
.org 0x0000
rjmp reset
.org 0x0013
reset:
ldi r16,low(RAMEND)
out SPL,r16
ldi r16,0xff
out ddrb, r16
.def pattern = r16
.equ time = 3
main:
ldi pattern,0x00
out portb,pattern
rcall wait
ldi pattern,0xff
out portb,pattern
rcall wait
rjmp main
.def wreg0 = r20
.def wreg1 = r21
.def wreg2 = r22
wait:
ldi wreg0,time
wait0:
ldi wreg1,0
wait1:
ldi wreg2,0
wait2:
nop
dec wreg2
brne wait2
dec wreg1
brne wait1
dec wreg0
brne wait0
ret
.exit
Macintosh 上の OS MacOSX でも、この演習を行うことができます。 但し、 Atmel Studio が用意されているというわけでは無いので、同等ではあ りません。