www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zeitverzögerungen


Autor: Tjabo Kloppenburg (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:
Angehängte Dateien:

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

Autor: Tjabo Kloppenburg (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Andre Adrian (Gast)
Datum:

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

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.