;--------------------------------------- ; ledtest.asm ; LED 0.5 秒点灯 0.5 秒消灯の繰り返し ; AT90S1200 + 4MHz レゾネーター ;--------------------------------------- .include "c:\avrtools\appnotes\1200def.inc" .def temp =r16 ;このレジスタからr31まではすべての命令が使える .def cnt1 =r17 ;PICでcnt1 equ 07hのように記述するのと同じ .def cnt2 =r18 ;----- 初期設定 ----- rjmp reset ;パワーオンリセット この命令は2steps reti ;外部割り込みは未使用 reti ;タイマー割り込みは未使用 reti ;アナログコンパレータ割り込みは未使用 ;----- メインルーチン ----- reset: ldi temp,$01 ;temp=0b00000001 out DDRB,temp ;PB0のみ出力に設定 loop: ldi temp,$01 ;temp=0b00000001 out PORTB,temp ;PB0をセット(LED点灯) rcall timer ;timerサブルーチンコール この命令は3steps rcall timer ;今回のプログラムでは厳密に0.5秒点灯となっていない rcall timer rcall timer ldi temp,$00 ;temp=0b00000000 out PORTB,temp ;PB0をリセット(LED消灯) rcall timer ;消灯時間も厳密に0.5秒になっていない rcall timer ;点灯消灯のループステップ数は4004582steps rcall timer ;4004582steps/4=1001145.5usecとなる rcall timer ;つまり 1.0011455 秒周期なのだ rjmp loop ;シミュレータのStopwatchでは1.00sと表示される ;厳密にステップ数を調整すればぴったり1秒周期 ;が作れると思うが、今回は練習なのでここまでとした ;----- タイマーサブルーチン ----- timer: ldi cnt1,255 ;cnt1=255 tlp1: ldi cnt2,196 ;cnt2=196 tlp2: nop ;cnt1,cnt2の値とnopの組み合わせで時間を調整 nop nop nop nop nop nop dec cnt2 ;cnt2=cnt2-1 brne tlp2 ;cnt2がゼロでなければtlp2へ分岐 ゼロの時1stepゼロ以外は2steps dec cnt1 brne tlp1 ret ;この命令は4steps