Forum: Mikrocontroller und Digitale Elektronik Zeitschleife ;-) AVR


von Ralf A (Gast)


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

von Ralf A (Gast)


Lesenswert?

es soll nicht ldi r19, 0xFF heißen sondern ldi r19, 0x2B

von johnny.m (Gast)


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.

von johnny.m (Gast)


Lesenswert?

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.

von Ralf A (Gast)


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

von johnny.m (Gast)


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

von Ralf A (Gast)


Lesenswert?

ok so weit hab ich es verstanden, jetzt mach ich mich an die ganze
Schleife ;-)

von Ralf A (Gast)


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?

von Ralf A (Gast)


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

von Ralf A (Gast)


Lesenswert?

da war noch ein kleiner tippfehler in der ersten Zeile:

255 x 128 Zyklen

macht 33659 Zyklen -> 4207375ns

von Profi (Gast)


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.

von Ralf A (Gast)


Lesenswert?

könnte mir jemand sagen ob des mal soweit hinhaut?

von Ralf A (Gast)


Lesenswert?

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.

von Ralf A (Gast)


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.

von Ralf A (Gast)


Lesenswert?

so hab das studio jetzt auf nem anderen rechner installiert, wo finde
ich den Cycle-Counter?

von Tal U. (talumb)


Lesenswert?

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.

von Ralf A (Gast)


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

von Tal U. (talumb)


Angehängte Dateien:

Lesenswert?

Hier noch ein "AVR-Studio-Projekt".

von Tal U. (talumb)


Lesenswert?

Da war ich wohl zu langsam...

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
Noch kein Account? Hier anmelden.