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
Hier noch eine leicht verbesserte Version. Der erzeugte Code ist zwar gleich, es gibt jedoch zwei Unterschiede im Makro: - in der ersten Version konnte es vorkommen, dass das Makro offenbar falsch verzögert - und zwar genau dann, wenn die Anzahl zu verzögernder CPU-Takte als Formel übergeben wird, die nicht komplett geklammert ist. Wenn man zum Verzögern von 40 µs - 5 CPU Takte z.B. delay_clock_cycles ((40 * CLOCK) / 1000000) - 5, R16 schreibt, so ist die Verzögerung vollkommen falsch, während delay_clock_cycles (((40 * CLOCK) / 1000000) - 5), R16 korrekt verzögert. Durch Klammern von @0 im Makro kann nun jedoch auch die erste Variante geschrieben werden - es wird auch dann eine Fehlermeldung ausgegeben, wenn die Anzahl zu verzögernder Takte < 0 ist
Moin Moin, wollte keinen extra Thread eröffnen, hier mal eine Excel Tabelle zur Berechnung von Delays bis zu 196000(Takt cyk) und paar zerquetschte. Als Parameter kann die µC-Frequenz und die Verzögerungsdauer in ms oder µs eingegeben werden. Die Reale Verzögerungsdauer wird im Register „Verzögerung Real“ angezeigt. Die Berechnung ist nicht zu 100% genau. Doch für mich hat's bis jetzt ausgereicht Viel spaß damit, GTF
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.