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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.