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
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
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
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
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
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