I write routine (label) that is making precision delay of 1us:
.equ wus=((16000000/1000000 - 4) / 4); used crystal 1us delay rjmp WaitUs sleep WaitUs: ldi zh, HIGH(wus) ; used crystal 1us delay (high Byte) 1cy ldi zl, Low(wus) ; used crystal 1us delay (Low Byte) 1cy WAITUZ: sbiw zl, 1 ; count down, 2 Clock cycles brne WAITUZ ; Not zero: 2 Clock cycles, zero: 1 Clock cycle ret ; back: 4 Clock cycles
This above code works perfectly for delay of 1us...simulated using AVR-Simulator and i get 1.0us.
I want to write delay routine that is accepting delay time so that i don't need multiple routine delay for each delay (eg: 1us, 2us...100us etc)...so i write this code that does not work as expected:
.equ wus=((16000000/1000000 - 4) / 4); used crystal 1us delay ldi r16, 0x02 ; make 2us delay rjmp WaitUs sleep WaitUs: ldi zh, HIGH(wus) ; used crystal 1us delay (high Byte) 1cy ldi zl, Low(wus) ; used crystal 1us delay (Low Byte) 1cy WAITUZ: sbiw zl, 1 ; count down, 2 Clock cycles brne WAITUZ ; Not zero: 2 Clock cycles, zero: 1 Clock cycle dec r16 ; count down, 1 Clock cycle brne WAITUS ; Not zero: 2 Clock cycles, zero: 1 Clock cycle ret ; back: 4 Clock cycles
But i get this delay (insted of 2us):
Could i get any help how to fix code to have parameter for us delay? I make this .equ wus constant that calculate using used crystal (16MHz in my case) the desired clocks for 1us and then loop as many times as r16 (user defined variable in register) to archieve 2us delay.
so using ldi r16, 0x02 i need to get 2us delay, using ldi r16, 0x08 i need to get 8us delay...etc.
Thanks