ATMELのAT-Tiny26,ATmega,R8Cなどのワンチップマイコン,C言語,JAVAなどのプログラミング言語の入門のためのページです.サンプルプログラムを中心に紹介します.他にもLinixや数学ソフトなどの紹介も行います.

このブログを検索

あなたは 番目のお客様です.

2008年9月15日月曜日

AVR入門

AVRDRAGONを使う
AVRマイコンの書き込みは,AVRISPmkIIが入門用として使いやすいです.
AVRDRAGONを使ってみました.AVRDRAGONはボードのみです.AVRISPmkIIのようにUSBケーブルや8ピンケーブル,ソフトのCDが付いていません.ただAVRISPmkIIを使ったことがある人ならば,特に問題なく使えると思います.
AVRstudioをインストールしていれば,新しくインストールするものはありません.
AVRDRAGONを接続すれば,ドライバのインストールが始まります.
mkIIと同様に6ピンのISPとターゲットのマイコンを接続すれば,ISPプログラミングが可能です.
AVRDRAGONはUSB電源(5V)のピンを持っています.このVCCをマイコンに供給すれば,マイコン側で電源は不要です.
一方で過去に作ったマイコンのプログラマターゲットを使いたい場合,両者の電源がバッティングします.私は3V電源のマイコンのプログラマターゲットを使っていました.
そこでAVRDRAGONのVCCとISP6ピンのVTGを100Ωの抵抗で結びました.こうすれば,電源無しのターゲットでも3V電源のターゲットでも同じように使えます.
写真の左が,AVRDRAGONの裏側,右上がtiny2313のターゲット,右下がmega88のターゲットです.










AVRのアセンブラの比較
よく使うAT90S1200,AT90S2313,ATTINY2313,ATTINY26で3個のLEDを点滅させるアセンブラプログラムの比較を行いました.
定義ファイルはそれぞれ,"1200def.inc","2313def.inc","tn2313def.inc","tn26def.inc"です.それぞれ割り込みベクタの数が違うのでRETIの数が異なります.
AT90S1200にはスタックポインタの記述がありません.AT90S2313とATTINY2313のスタックポインタ名はSPLで,ATTINY26のスタックポインタ名はSPです.
またATTINY2313にはクロックの分周機能が着いていて,これがセットさたままだと速度が8分の1になるので気をつけましょう.
以下AT90S1200,AT90S2313,ATTINY2313,ATTINY26のソースプログラムです.

;90S1200
.include "1200def.inc"
.def CNT1 =R17
.def CNT2 =R18
.def CNT3 =R19
RJMP RESET
RETI
RETI
RETI
RESET: LDI R16,0B11111111
OUT DDRD,R16
MAIN:
LDI R16,0B00001000
OUT PORTD,R16
RCALL TIME
LDI R16,0B00010000
OUT PORTD,R16
RCALL TIME
LDI R16,0B00100000
OUT PORTD,R16
RCALL TIME
RJMP MAIN
TIME:
LDI CNT1,10
LOOP1:
LDI CNT2,255
LOOP2:
LDI CNT3,255
LOOP3:
NOP
NOP
DEC CNT3
BRNE LOOP3
DEC CNT2
BRNE LOOP2
DEC CNT1
BRNE LOOP1
RET


;90S2313 led2313.asm
.include "2313def.inc"
.def CNT1 =R17
.def CNT2 =R18
.def CNT3 =R19
RJMP RESET
RETI ;1
RETI
RETI
RETI
RETI
RETI
RETI
RETI
RETI ;$9
RETI ;$A
RESET: LDI R16,LOW(RAMEND)
OUT SPL,R16
LDI R16,0B11111111
OUT DDRD,R16
MAIN:
LDI R16,0B00001000
OUT PORTD,R16
RCALL TIME
LDI R16,0B00010000
OUT PORTD,R16
RCALL TIME
LDI R16,0B00100000
OUT PORTD,R16
RCALL TIME
RJMP MAIN
TIME:
LDI CNT1,10
LOOP1:
LDI CNT2,255
LOOP2:
LDI CNT3,255
LOOP3:
NOP
NOP
DEC CNT3
BRNE LOOP3
DEC CNT2
BRNE LOOP2
DEC CNT1
BRNE LOOP1
RET


;Tiny2313 ledtn2313.asm
;システム クロック前置分周器に注意
.include "tn2313def.inc"
.def CNT1 =R17
.def CNT2 =R18
.def CNT3 =R19
RJMP RESET
RETI ;1
RETI
RETI
RETI
RETI
RETI
RETI
RETI
RETI ;$9
RETI ;$A
RETI
RETI
RETI
RETI
RETI
RETI ;$10
RETI ;$11
RETI ;$12
RESET: LDI R16,LOW(RAMEND)
OUT SPL,R16
LDI R16,0B11111111
OUT DDRD,R16
MAIN:
LDI R16,0B00001000
OUT PORTD,R16
RCALL TIME
LDI R16,0B00010000
OUT PORTD,R16
RCALL TIME
LDI R16,0B00100000
OUT PORTD,R16
RCALL TIME
RJMP MAIN
TIME:
LDI CNT1,10
LOOP1:
LDI CNT2,255
LOOP2:
LDI CNT3,255
LOOP3:
NOP
NOP
DEC CNT3
BRNE LOOP3
DEC CNT2
BRNE LOOP2
DEC CNT1
BRNE LOOP1
RET


;Tiny26 ledtn26.asm
;スタックポインタ名はSPLではなくSP
;PB0,1,2にLEDを接続した
;PIN7(RESET)PIN15(AVCC)PIN16(GND)を開放しても動く
.include "tn26def.inc"
.def CNT1 =R17
.def CNT2 =R18
.def CNT3 =R19
RJMP RESET
RETI ;1
RETI
RETI
RETI
RETI
RETI
RETI
RETI
RETI ;$9
RETI ;$A
RETI ;$B
RESET: LDI R16,LOW(RAMEND)
OUT SP,R16
LDI R16,0B00000111
OUT DDRB,R16
MAIN:
LDI R16,0B00000001
OUT PORTB,R16
RCALL TIME
LDI R16,0B00000010
OUT PORTB,R16
RCALL TIME
LDI R16,0B00000100
OUT PORTB,R16
RCALL TIME
RJMP MAIN
TIME:
LDI CNT1,10
LOOP1:
LDI CNT2,255
LOOP2:
LDI CNT3,255
LOOP3:
NOP
NOP
DEC CNT3
BRNE LOOP3
DEC CNT2
BRNE LOOP2
DEC CNT1
BRNE LOOP1
RET