www.mikrocontroller.net

Forum: Projekte & Code Zeitschleifen


Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich bin ganz neu in der Mikrocontroller-Technik wir programieren
in der Schule gerade den AT89C51ed2. In der nächsten Arbeit kommt
Zeitschleifenberechnung dran,hat da vielleicht jemand ein
"KochRezept" oder irgend einen Trick wie man Zeitschleifen schnell
berechnen kann??

Danke für eure Antworten

Gruß Florian

Autor: The Daz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Florian,
die Dauer einer "Zeitschleife" haengt immer ab von der Taktfrequenz
deines Prozessors und dem benutzen Algorithmus. Steht der Algo dann
kannst du mit Hilfe des Datenblatts die Anzahl der benoetigten Takte
fuer einen Schleifendurchlauf berechnen und multiplizierst dass mit der
Anzahl der Durchlaeufe. Wie du siehst gibts es viele Variablen und damit
kein allgemein gueltiges Kochrezept.

  Daz

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erst einmal vielen dank für deine superschnelle antwort,
wir machen die schleifen aber noch nicht so kompliziert,ich verstehe
dich aber für zb eine wie unten genannte zeitschleife müsste es doch
eine allgemeine formel geben.ich weiss es kommt darauf an wie schnell
ein befehl von dem mc ausgeführt wird.
hier mal eine beispielschleife,das ist bestimmt die kinderlösung
aber wir lernen es so ,ist ja was ganz neues für uns.

hier das bsp:   mov r2,#10
                mov r1,#20
                mov r0,#20
                djnz r0,loop3
                djnz r1,loop2
                djnz r2,loop1
                ret

Das ist ein Beispiel für eine zeitschleife,wie wir sie lernen ,ist
bestimmt ein bisschen "kindisch" aber es reicht denke ich zum
verstehen ,für so eine zeitschleife müsste es doch einen trick zum
verstehen geben.
weil genau so eine müssen wir in der arbeit erstellen .

vielen dank gruß florian

Autor: The Daz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Florian,
weisst du wie lang jeder einzelne Befehl fuer die Ausfuehrung braucht ?
Wenn ja, dann kannst du ausrechnen, wie lang deine Schleife braucht,
oder ? Es gibt keine universelle Regel dafuer, wie Zeitaufwendig
einzelne Assembler-Kommandos sind. Das haengt zum einen vom hardware
design des Prozessors ab (sprich wieviele Takte fuer den einen oder
anderen Befehl) und von der Taktfrequenz des Prozessors. Ersteres
entnimmt man dem Datenblatt, zweiteres wird von der konkreten externen
Beschaltung des Prozessors festgelegt. Die einzige Formel, die man hier
erstellen kann, ist eine mit mindestens zwei Unbekannten. Ist es das was
du suchst ?

  Daz

Autor: Jens D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo

also im grunde ist das ganz simpel..

mal ien beispiel: (befehle stimmen icht ganz, registernamen auch
nicht)
            ldi reg_1, 10;
            ldi reg_2, 0;

.schleife   inc reg_1;          // 2 takte
            brie reg_1, reg_2;  // 4 takte
            jump .schleife;     // 2 takte
            ret;                // 2 takte

inc braucht hier 2 takte, brie (wenn gleich ueberspring den nägsten
befehl) 4 takte und der jump noch mal 2 takte macht also
2 takte + 4 takte + 2 takte = 8 takte pro durchlauf

das ganze passiert nun 10 mal
8 takte * 10 = 80 takte + 2 takte (ret)

das heisst nun, du brauchst 82 takte, bis das programm weiterläuft (+ 2
takte, wenn du in die schleife mit jump springst //jump .schleife\\)
gehen wir also mal von 84 takten aus:

bei einer Frequenz von 1 000 000 Takte pro Sekunde zB.
1 000 000 takte = 84 takte
1s                 t

t = 1s
    1 000 000 * 84

t = 11,904762ns

Gruss Jens

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank Euch 2 es hat mir sehr weiter geholfen,jetzt gibt es in der
arbeit bestimmt ne 1 ;D

vielen dank gruß florian

Autor: Marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus Flobo


Ein Mascinenzyklus = 1us
mov Befehl         = 1 Maschinenzyklus
djnz Befehl        = 2 Maschinenzyklen
also:

                mov r2,#10          1us x 1=     1us
                mov r1,#20          1us x 1=     1us
                mov r0,#20          1us x 1=     1us
                djnz r0,loop3       2us x 20=   40us
                djnz r1,loop2       2us x 20=   40us
                djnz r2,loop1       2us x 10=   20us
                ret                 1us x 1=     1us


                                            =  104us


Marcel

Autor: Andreas Kassner (andi_k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na ja, da könnte man ja gleich

                mov r0,#50          1us x 1=     1us
loop1:          djnz r0,loop1       2us x 50=  100us
                ret                 1us x 1=     1us

machen.

Normalerweise bestehen längere Warteschleifen aus mehreren,
verschachtelten Schleifen:

                mov r2,#10
loop1:          mov r1,#20
loop2:          mov r0,#20
loop3:          djnz r0,loop3
                djnz r1,loop2
                djnz r2,loop1
                ret

Die innerste Schleife wird 20*20*10 mal ausgeführt, die 2. 20*10 mal
und die äußerste 10 mal.
Da wird das ausrechnen der Dauer schon etwas schwieriger ;-)
Am besten von innen nach außen berechnen.

MfG
Andi

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.