.include "m168def.inc"
.org 0x00 jmp reset ;orgコマンドはプログラム0x000番地に配置させる。resetラベルへジャンプする。
;各種リセット。
reset:
;スタックポインタに初期値を設定している。
ldi r16,low(ramend)
out spl,r16
ldi r16,high(ramend)
out sph,r16
ldi r16,0b11111111 ;2進数111111111 を、レジスタr16に書き込み。
out ddrb,r16 ;レジスタr16の内容を、ポートddrbにsetする。
;ビットが立っている番号のポートが出力モードになる。
;ldi r16,0b11110000 ;r16に2進数を入力
;out portb,r16 ;ビットが立っているLEDを表示させる。
;inc r16 ;レジスタr16をインクリメント
;out portb,r16 ;r16は10101011になっているはず...
;LED "PC"の点灯
ldi r16,0b11111111
out ddrc,r16
ldi r16,0b11110111
out portc,r16
;LED "PD"の点灯
ldi r17,0b11111111
out ddrd,r17
ldi r17,0b11110000
out portd,r17
main:
ldi r25,0b00000000 ;r25を初期化 1ずつ足していくレジスタ
ldi r24,0b00000001 ;r24を初期化
looping:
inc r25 ;r25をインクリメント
lsl r24 ;r24を左へ1ビットシフト
;cpi r24,0x10000000 ;10000000と比較
;breq br1 ;一致すればbr1へジャンプ
mov r20,r25 ;コピー
com r20 ;r25 bit反転
out portb,r20 ;(LED)PBを点灯させる
call delay1ms ;1msウェイトさせる
rjmp looping ;loopingへ相対ジャンプ
;rjmp main ;mainへ相対ジャンプ
br1:
; 10MHzで1msのディレイ
;-----------------------------------------------
;rcall delay1msで呼ばれたとして
;100000回命令を実行すると
;100000×0.1 us
;
; 命令に必要なクロック数?
; rcall ;3
delay1ms: push r16 ;2
in r16,sreg ;1
push r16 ;2
push r17 ;2
; 100000-10=99990
ldi r17,198 ;1
delay2: ldi r16,100 ;1
delay1: dec r16 ;1
nop ;何もしない
cpi r16,0 ;1
brne delay1 ;1/2
dec r17 ;1
cpi r17,0 ;1
brne delay2 ;1/2
; 999990-(100*5+4)*198=198
ldi r16,46 ;2
delay3: dec r16 ;1
cpi r16,0 ;1
brne delay3 ;1/2
; 198-46*4 = 14
nop
nop
nop
pop r17 ;2
pop r16 ;2
out sreg,r16 ;1
pop r16 ;2
ret ;4 ;呼び出し元へreturnする
; 11-11 = 0
; プログラム(1)
|