hi
Also ich hab folgendes Problem:
Ich brauch eine Schleife die so ca. 1 sec läuft und verwende ein 8 MHZ
Quarz, die Schleife muss nicht sehr genau sein, es reicht, wenn nach
einer Minute die Genauigkeit bei +/- 0,5 sec liegt.
ich hab jetzt mal folgendes geschreiben:
zeit: ldi r17, 0xFF
label0: ldi r18, 0xFF
label1: ldi r19, 0xFF
label2: dec r19
brne label2
dec r18
brne label1
dec r17
brne label0
ret
ich vermute, dass es so ca. eine Sekunde ist, jedoch würde ich mich
freuen, wenn mir jemand beibringen kann, wie man die Zeit dieser
Schleife berechnet (wann rechnet man mit 125 ns und wann mit 250 ns
...).
Ich freue mich auf eure Hilfe
Dazu musste Dir eigentlich nur die Laufzeiten der einzelnen Befehle
ansehen. ldi und dec brauchen je einen Taktzyklus, brne einen, wenn die
Bedingung falsch ist und zwei wenn sie wahr ist (also wenn gesprungen
wird). Das musste alles hintereinanderbringen und mit der Zykluszeit
(bei 8 MHz sind das 125 ns) berechnen. Die innere Schleife macht z.B.
0x2B mal ein dec (macht 43 Zyklen) und 42 mal ist die Bedingung von
brne label2 wahr, das gibt noch mal 84 Zyklen. Ein Komplett-Durchlauf
der inneren Schleife dauert also ziemlich genau 15,875 µs. Mit den
anderen Schleifen das ganze nochmal durchexerzieren, dann haste es.
danke für die schnelle Hilfe, jedoch verstehe ich die Berechnung nicht.
ich schau mir jetzt nur die innere schleife an:
43 x dec -> 43 Zyklen
42 x falsche Aussage -> 42 Zyklen
1 x wahre Aussage -> 2 Zyklen
insgesamt 87 Zyklen mal 125ns macht 10,875 µs
Die Abfrage lautet brne (branch if NOT equal). Die Bedingung ist immer
dann wahr, wenn beim dec NICHT 0 rauskommt, und das ist pro Durchlauf
42 mal der Fall. Macht also 84 Zyklen. Am Ende (wenn dec 0 ergibt) ist
die Bedingung nicht mehr wahr und es wird nicht 'gebrancht', macht
also nur einen Zyklus...
so also ich berechne jetzt mal die innerste und die mittlere schleife:
255 x 125 Zyklen (innere Schleife)
255 x 1 Zyklus (dec befehl)
254 x 2 Zyklen (brne wahr)
1 x 1 Zyklus (brne falsch)
also insgesamt 32639 zyklen mal 125 ns -> 4079875 ns???
stimmt das?
label1: ldi r19, 0x2B
label2: dec r19
brne label2
dec r18
brne label1
oh ich glaube ich habs grad falsch berechnet:
255 x 125 Zyklen (innere Schleife)
255 x 1 Zyklus (dec befehl)
254 x 2 Zyklen (brne wahr)
1 x 1 Zyklus (brne falsch)
255 x 1 Zyklus (ldi r19, 0x2B)
32894 Zyklen mal 125ns sind 4111750ns
Du kannst im Studio die Schleife simulieren. Dort findest Du einen
Cycle-Counter, an dem kannst Du die benötigten Cycles ablesen.
Du kannst statt ldi Rxx,0xff auch clr Rxx schreiben, dann zählt er um
eins weiter, also 256 mal.
ich hab das Studio leider nicht und kanns an diesem Rechner auch nicht
installieren ;-( Aber ich würde mich freuen wenn sich jemand meine
Rechnung anschaut.
für alle 3 schleifen ergibt sich dann nach meiner Rechnung:
255 x 33659 Zyklen
1 x 1 ldi r17
255 x 1 ldi r18
255 x 1 dec r17
254 x 2 brne
1 x 1 brne
1 x 4 ret
Insgesamt 8584069 Zyklen und 1,073s
Ich wäre sehr dankbar wenn das jemand im studio nachprüfen könnte, oder
kurz so einen Blick darauf werfen könnte.
Du musst ein Projekt erstellen, den AVR auswählen ,das Programm einfügen
und auf kompilieren. Dann Debug->Start Debugger und das Programm
durchlaufen lassen. Am Ende schaust du dann bei Processor die Zeit bei
Stop Watch an.
OK Danke habs gefunden und getestet ich hab mich so viel ich sehen kann
kaum verrechnet, hab anstelle des ret ein sprung nach oben gemacht und
dann kommen 8584065 Zyklen mit 1,073...s raus ;-)
Da ja der ret 4 Zyklen braucht und der Sprung nur 3 wären es 8584066
also knapp daneben is au vorbei ;-)