Zeitschleife ;-) AVR

Gast #338302
Lesenswert?
• ▲
▼
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
Gast #338304
Lesenswert?
• ▲
▼
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.
Gast #338306
Lesenswert?
• ▲
▼
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
Gast #338307
Lesenswert?
• ▲
▼
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...
Gast #338309
Lesenswert?
• ▲
▼
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?
Gast #338310
Lesenswert?
• ▲
▼
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
Gast #338312
Lesenswert?
• ▲
▼
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.
Gast #338315
Lesenswert?
• ▲
▼
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.
Gast #338318
Lesenswert?
• ▲
▼
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 ;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren