AVR Delay-Makro 0...770 CPU-Takte

Gast #186206
Lesenswert?

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
Angehängte Dateien:
Gast #186207
Lesenswert?

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
Angehängte Dateien:
Gast #1437411
Lesenswert?

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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren