Gast
#186206
Hier ein besonders kurzes (0-4 Opcodes) Assembler-Delay-Makro für exakte
0..770 CPU-Takte, falls das noch irgend jemand ausser mir gebrauchen
können sollte. Benötigt AVRASM v1.74 oder höher.
Anwendungsbeispiel:
delay_clock_cycles 13, R16
verbrät exakt 13 CPU-Takte, und benutzt zum Herunterzählen das Register
R16.
; --------------------------------------------
; Macro: Delay an exact number of clock cycles
; --------------------------------------------
; @0: The number of clock cycles to delay (must be <= 0x302)
; @1: Which register (from R16...R31) to use for counting (is 0
afterwards)
.MACRO delay_clock_cycles
.IF @0 > 0x302 ; Check that given number of delay clock cycles is
valid
.ERROR "Cannot delay more than 0x302 clock cycles"
.ENDIF
.IF (@0 - ((@0 / 3) * 3)) == 1 ; if (@0 MODULO 3) == 1...
nop ; ...then insert one delay cycle
.ELIF (@0 - ((@0 / 3) * 3)) == 2 ; otherwise, if (@0 MODULO 3) == 2...
rjmp delay_clock_cycles2 ; ...then insert two delay cycles
delay_clock_cycles2:
.ENDIF
.IF @0 >= 3 ; Include this part if the number of delay clock cycles is
>= 3
ldi @1, LOW(@0 / 3) ; Load register @1 with (delay clock cycles /
3)
delay_clock_cycles3:
dec @1 ; Count down register @1...
brne delay_clock_cycles3 ; ...and do so until register @1 == 0
.ENDIF
.ENDMACRO