www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zeitschleife ;-) AVR


Autor: Ralf A (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf A (Gast)
Datum:

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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ralf A (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Ralf A (Gast)
Datum:

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

Autor: Ralf A (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Ralf A (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf A (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
da war noch ein kleiner tippfehler in der ersten Zeile:

255 x 128 Zyklen

macht 33659 Zyklen -> 4207375ns

Autor: Profi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ralf A (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
könnte mir jemand sagen ob des mal soweit hinhaut?

Autor: Ralf A (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ralf A (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ralf A (Gast)
Datum:

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

Autor: Tal Umb (talumb)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ralf A (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Tal Umb (talumb)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier noch ein "AVR-Studio-Projekt".

Autor: Tal Umb (talumb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da war ich wohl zu langsam...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.