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.
Ach ja, hab noch das eine brne vergessen, bei dem die Bedingung dann falsch ist. Macht also genau 16 µs für die innere Schleife.
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...
ok so weit hab ich es verstanden, jetzt mach ich mich an die ganze Schleife ;-)
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
da war noch ein kleiner tippfehler in der ersten Zeile: 255 x 128 Zyklen macht 33659 Zyklen -> 4207375ns
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.
so hab das studio jetzt auf nem anderen rechner installiert, wo finde ich den Cycle-Counter?
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 ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.