Forum: Projekte & Code Zeitschleifen


von Florian (Gast)


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

von The Daz (Gast)


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

von Florian (Gast)


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

von The Daz (Gast)


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

von Jens D. (Gast)


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

von Florian (Gast)


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

von Marcel (Gast)


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

von Andreas K. (andi_k)


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

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.