To ze masz rezonator 10 MHz oznacza ze mikrokontroler wykonuje 10 * 10^6 cykli, a to oznacza ze jeden cykl trwa 0,1 us. Na początek załoz ze kazdy rozkaz trwa 1 cykl (to tylko załozenie), a wiec 0,1 us. Teraz musisz tylko wykonac podprogram który wykona T/0,1 rozkazów, gdzie T jest to czas który powinien trwac twój delay (mozna to wykonac przez pętle).
Na koncu pozostają tylko drobne poprawki, typu zmiana ilosci wykonywania petli, albo nop w odpowiednie miejsce.
Załączam juz gotowe 2 delaye dla kwarca 10 MHz:
.INClUDE "1200def.inc"
start:
ldi r16,10
rcall delay_us
ldi r16,10
rcall delay_ms
koniec:
rjmp koniec
;-------------------------------------------
;delay o czasie trwania "r16"us
;delay jest obarczony błędem ~0,5 us do odliczanej wartosci
;np dla 10 w r16 odliczy 10,5 us, dla 100 w r16 odliczy 100,5 us itd.
delay_us:
nop
nop
nop
nop
nop
loop_d_us2:
dec r16
cpi r16,0
breq end_delay_us
rjmp delay_us
end_delay_us:
ret
;-------------------------------------------
;delay o czasie trwania "r16"ms
;ten delay tesz ma drobny błąd, jednak pomijalnie mały w stosunku do
;doliczanych wartosci
delay_ms:
ldi r17,10
loop_d_ms:
ldi r18,166
loop_d_ms2:
nop
nop
dec r18
cpi r18,0 ;porównaj rejestr ze stałą
brne loop_d_ms2 ;skocz jesli nierówne
dec r17
cpi r17,0
brne loop_d_ms
dec r16
cpi r16,0
brne delay_ms
ret ;powrót z podprogramu
Wpisanie 0 do r16 spowoduje odliczenie 256 us lub ms w zależnosci od
podprogramu