www.mikrocontroller.net

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


Autor: Joachim Schäfer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Joachim Schäfer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Nop M. (gtf)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.