Forum: Mikrocontroller und Digitale Elektronik Zeitverzögerungen


von Tjabo Kloppenburg (Gast)


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.

von Peter D. (peda)


Angehängte Dateien:

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

von Tjabo Kloppenburg (Gast)


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

von Peter D. (peda)


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

von Peter D. (peda)


Lesenswert?

Hi Tjabo,

ich muß mich korrigieren. Man kann auch mit dem AVR Assembler genaue 
Delayschleifen automatisch berechnen lassen. Ein extra C++ Program ist 
also unnötig.

Ich habs mit in die Codesammlung gestellt:

http://www.mikrocontroller.net/forum/read-4-15758.html


Peter

P.S.:
Was ist "PHP" bzw. "Python" ?

von Andre Adrian (Gast)


Lesenswert?

Hi,

PHP und Python sind genauso wie auch Perl oder ASP (wem fallen noch mehr 
ein?) Skriptsprachen, hauptsächlich zur dynamischen Erstellung von 
Webseiten genutzt.

Gruss

Andre

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.