Forum: Projekte & Code AVR Delay-Makro 0...770 CPU-Takte


von Joachim Schäfer (Gast)


Angehängte Dateien:

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

von Joachim Schäfer (Gast)


Angehängte Dateien:

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

von Alex M. (Gast)


Angehängte Dateien:

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

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
Noch kein Account? Hier anmelden.