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

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

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.