Zeitverzögerungen

Gast #18996
Lesenswert?

Ich könnte mal ein kleines Tutorial schreiben, wie man relativ einfach 
Delay Loops designen kann.

Habs gestern mal in C++ ausprobiert -- im Gegensatz zu PHP oder Python 
wird das echt schnell, und man kann mit Brute-Force auch
Loops dritter Ordnung (3 Register) in Sekundenbruchteilen berechnen.

Mit einer einfachen 3-Register Schleife mit nur 9 Befehlen kann man bis 
zu 50.529.024 Cyles verbraten. Das sind bei 4MHz Takt immerhin 12.6 
Sekunden...

Wenn Interesse besteht: Anworten! :-)

tk.
#18997
Lesenswert?

Hallo Tjabo,

wie geht das denn: Delay Loops "echt schnell" ?
Die sollen doch gerade langsam sein.

In C++ glaube ich auch nicht, daß Du da reproduzierbare Zeiten 
hinkriegst. Die Delay Loops müssen schon in Assembler sein.

Anbei mal mein Macro mit dem ich Delay Loops mache.
Jedes Delay von 0 ... 65535 Zyklen wird genau ausgeführt.

Mit dem neuen Keil-Assembler kann man auch die Begrenzung von 65535 
Zyklen bis auf max 4294967295 Zyklen ausdehnen.

Es macht aber keinen Sinn so extrem lange Zeiten zu warten, da ist ein 
Timerinterrupt viel günstiger. Schließlich soll der µC ja nicht 
sekundenlang toter Mann spielen, sondern z.B. weiterhin auf 
Tastatureingaben reagieren usw.
Deshalb habe ich es bei den 65535 Zyklen belassen.


Peter
Angehängte Dateien:
Gast #18998
Lesenswert?

Moment mal, ich habe in C++ ein Programm geschrieben, um "echt schnell" 
Assembler-Codes zu berechnen, dann dann im AVR für eine lange 
Warteschleife sorgen.

Prinzipiell könnte man das modular anlegen, um auch andere 
Prozesser-Typen zu unterstützen. Ist eigentlich eine gute Idee...

Beispiel-Output für AVR (schnell berechnet :) ):

; delay cycles = 400000
; pc width: 16 bit
; assuming jump with rcall to this place.
L0:                      ; RCALL L0   (3 cycles)
          ldi Rxx, $0b   ; delaying 399993 cycles:
L1:       ldi Ryy, $3c
L2:       ldi Rzz, $c9
L3:       dec Ryy
          brne L3
          dec Ryy
          brne L1
          dec Rxx
          brne L2
;
          ret            ; (4 cycles)
Uebrig sind: 0
#18999
Lesenswert?

Ich glaube, jetzt verstehe ich, was Du meinst.

Beim 8051 laß ich sowas den Assembler in meinem Macro machen. Der 
Vorteil ist, wenn sich der Quarz ändert oder die Delayzeit, dann trage 
ich nur den neuen Wert in den Macroaufruf und assembliere neu, das ist 
alles.


Beim AVR scheinen solche Macros leider nicht möglich zu sein.
Deshalb muß man wohl den äußerst umständlichen Weg gehen und die 
Delaywerte selber berechnen. Und deshalb hast Du dazu ein extra C++ 
Programm geschrieben.

Wenn ich das aber richtig verstehe, muß man trotzdem den Code und die 
entsprechenden Werte von Hand eintippen.

Du könntest doch Dein Programm so erweitern, daß es automatisch den 
Quelltext nach z.B. "DELAY xxx" durchsucht und dann den entsprechenden 
Code selber einfügt.


Peter

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