PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Warteschleife - Ich steh kurz vorm Wahnsinn



BlackDevil
09.11.2008, 10:39
Servus

Wiedermal ich mit einer eigentlich einfachen Frage. Ich möchte hier klare Antworten sodass man das ganze dann in das Wiki stellen kann. Grund: Weder bei µC.net noch hier findet sich ein solcher Artikel und ich denke für den ein oder anderen könnte das Interessant sein.

Nehmen wir mal eine verschachtelte Schleife aus 3 Zählern. Dann ist die Gesamtzeit am Ende, wenn ich mich nich Täusche, die dritte Wurzel aus den Zylklen mal der Taktzeit des Systems (1/Systemfreq.). Richtig/Falsch?

Bei dieser Schleife


delay: ; Warte Schleife, Verschachteltes
ldi zaehl3,0x8 ; Incrementieren von 3 Zaehlern
del2:
ldi zaehl1,0xFF
del:
ldi zaehl2,0xFF
del1:
dec zaehl2
brne del1
dec zaehl1
brne del
dec zaehl3
brne del2
ret

aus dem Musterprogramm kommme ich auf


0x08 = 8
FF = 255
FF = 255
=> Cycles = 8*255*255 = 520200
_______
=> t=³-\520200 * 1/4MHz = 20,1µs


Problem: Ich sitz hier vorm PC wie ein Ochse und es tut sich, genua, nix. Er zählt die schleife und zählt und zählt und ... ja wie der Duracell-Hase ...

Also, stimmt die Berechnung und die Simulation schlägt mir ein schnippchen oder steh ich auf der Leitung?

BTW: Ich möchte das Tool aus dem Internet nicht nutzen! Diese Warteschleifen sind fürn Po, wofür gibts Timer, es geht mir nur um die Berechnung.

Grüße

Besserwessi
09.11.2008, 13:50
Die zahl dier Durchläufe ist das Produkt aus der Zahl der 3 Schleifen durchläufe. Um die Zeit zu berechenen muß man berücksichtigen, das die innere Schalife etwas schneller ist als die äußeren. Wenn mans genau wissen will am einfachsten erst innere Schleife berechen, dann nach außen weiter.
Man muß noch die Zahl der Zykeln je schleifendurchlauf berücksichtingen. Hie also 3 für die innere Schleife. Also 3 mal so viel Zyklen, plus etwas für die äußeren Schleifen.

Wie man auf die dritte Wurzel kommen soll wiess ich nicht, ich würde besser mit Pi * 113/355 mulitpizieren.

BlackDevil
09.11.2008, 13:57
Das heist im Klartext (Formeln)?

(255*255*8)+3 = Zeit oder Cycles?

BlackDevil
09.11.2008, 14:10
Jau ich weis zwar jetz nich wieso aber okay. Komm ich auf ne Zahl. Der Proz macht 1/f = 1/4MHz Zyklen/s damit brauch ich für die gesamte schleife ~3s?

Naja verwirrt war ich schon dank google, jetz blick ich goor nüscht mehr durch. Drecks Schleifen, Timer olé

Edit: Jetz is der spaß weg ^^

PicNick
09.11.2008, 14:21
Irrtum vorbehalten

8 * (3 + (255 * ( 3 + (255 * 3 - 1 ) - 1 ) - 1) -1) -1 = zyklen

BlackDevil
09.11.2008, 14:24
8*(die hyperbolische hypotenuse der raumzeitkonstanten+(3*255*5²³))?

Tschuldige ich bin sau genervt heute und kann mir einen gewissen sarkasmus nich verkneifen :D

Ich sachte KLARE Antworten, keine wirren formeln. Unter klar versteh ich auch eine gewisse begründung...

JanB
09.11.2008, 14:36
Hallo,
die Formel für die Laufzeit dieser 3-fach Schleife bei 4MHz ist:
Z1*Z2*Z2*3/4000000
(ohne den RET und unter der Voraussetzung das alle Z > 0 sind)

Die Schleife braucht 8x255x255x3 Zyklen.
Bei 4MHz dauert ein Zyklus 1/4000000s.
Die Schleife dauert also insgesamt:
8x255x255x3x(1/4000000) = 0,39015s.

Woher kommt die 3 ?
Hat mit der 3-fach Schleife nix zu tun, sondern:
Der LDI und der DEC Befehl dauert je 1 Zyklus.
der BRNE dauert 2 Zyklen, wenn die Bedingung erfüllt ist,
sonst 1 Zyklus.
Jetzt ein wenig Nachdenken und Kombinieren und wenn
du erkennst warum der Wert exakt 3 ist, dann hast du
eine Menge Assembler gelernt.
Noch ein Tip: 1+(n-1)*(1+2)+1+1 = 3 + (n-1)*3 = n*3

Gruß Jan

BlackDevil
09.11.2008, 16:49
Aaaah danke. Das hilft!

Die 3 hatte ich so oder so im Sinn. Grund hast du genannt. Den BRNE Befehl hab ihc zwar noch nicht 100% Verstanden aber er "macht" ja das die Schleife vorwärts läuft wenn der eine Zähler abgelaufen ist.

Beispiel: 50ms

Z1*Z2*Z3*3/4000000 = t

Ich setze Z1 und Z2 einfach mal auf 255
=> Z3=(t*4000000)/(Z1Z2*3) ~ 1
Macht insgesamt 65025 Zyklen

Passt?

Besserwessi
09.11.2008, 17:41
Sollte ungefähr passen.

BlackDevil
09.11.2008, 17:44
ja top danke :) Kann man das in die Wiki packen? Gibt vll noch andere die das quält, über google findet man nichts vernünftiges

Besserwessi
10.11.2008, 16:36
Üblicherweise werden die Warteschleifen innen 256 mal durchlaufen. Sonst ist das ganze noch nicht besonders tiefsinnig.
Unter Warteschleife gibt es da schon einen relativ ausführlichen Artikel, auch mit ASM Beispiel, zwar nur als Compiler Ausgabe aber das macht ja eigentlichnichts.
Könnte man ja eventuell da dranhängen, und auch gleich das Inhaltsverzeichniss nach oben.

BlackDevil
10.11.2008, 18:43
Das ist mir noch nicht aufgefalllen :D Ich melde mich später noch ma mit zwei anderen Fragen wenn ichs schaff. Danke bis dahin

BlackDevil
12.11.2008, 12:33
Ich nochmal.



delay: ; Warte Schleife, Verschachteltes
ldi MyCounter1,0xFF
del: ldi MyCounter2,0xFF
del2: dec MyCounter2
brne del2
dec MyCounter1
brne del
ret


Verschachtelte Schleife aus 2 Zählern. 50ms. Passt oder?

Andere frage: Der Timer null: Wie stelle ich da einen 10Bit vorteiler ein? Der normale Prescaler über das Register ist ja klar... aber 10Bit Vorteiler extra? Hab im Datenblatt nichts gefunden...


Grüße

Besserwessi
12.11.2008, 17:53
Timer 0 ist normalerweise ein 8 Bit Zähler. Außer dem Vorteiler im Register TCCR0 hat man da nicht viel einzustellen. Einen extra 10 Bit Vorteiler kenne ich von den AVR Typen gar nicht, außer vielleicht bei der Baudrate Erzeugung der UART.

BlackDevil
12.11.2008, 19:56
Dachte ich mir schon, wie will ich auch 8bit in 10bit Teilen ^^

Okay der Vorteiler soll 1024 sein also 10Bit Prescaler, falsch verstanden ... dann passt das :D

Dankeschön!