Warteschleife, delays

Gast #3208200
Lesenswert?

Habe Probleme beim Verstehen der Warteschleife ?
Bitte um Hilfe.

Danke im Voraus

DELAY  nop      ;[\ 5 cycles of 4 microsec.
  nop      ;[\ = 20 microsec.
  incfsz  count,f    ;[/ x 256=5120 microsec.
  goto  DELAY    ;[/
  decfsz  del,f    ;delay = 5120 x del.(2 units of
  goto  DELAY    ;del equal ebout 10 millisecondes).
  return

Schönen Gruß
Gast #3208214
Lesenswert?

> Habe Probleme beim Verstehen der Warteschleife ?

Weiss nicht, könnte sein.

> Bitte um Hilfe.
>
> Danke im Voraus

Immer gerne.

>  DELAY  nop      ;[\ 5 cycles of 4 microsec.
>  nop      ;[\ = 20 microsec.
>  incfsz  count,f    ;[/ x 256=5120 microsec.
>  goto  DELAY    ;[/
>  decfsz  del,f    ;delay = 5120 x del.(2 units of
>  goto  DELAY    ;del equal ebout 10 millisecondes).

Eine sehr schöne Warteschleife für einen.. Moment.. 
∗glaskugelstreichel∗.. Pic16. War das die Frage?
#3208281
Lesenswert?

Hallo Hasan

Z.B.  PIC16Fxxx,
Oszillatorfrequenz fosc=4MHz
Arbeitstakt des PIC = fosc/4
Zeitdauer eines Arbeitstaktes bei fosc 4MHz = 1µs

Je nach Befehl wird eine bestimmte Anzahl von Arbeitszyklen zu dessen 
Abarbeitung benötigt. Das kannst Du im Datenblatt eines jeden PIC 
nachlesen. Z.B. PIC16F628: vgl. "TABLE 15-2: PIC16F627A/628A/648A 
INSTRUCTION SET", Spalte "Cycles"
1
z.B: nop   1 Cycle   die meisten Befehle benötigen nur 1 Cycle
2
     GOTO  2 Cycles  manche auch 2 Cyclen
Dann verwendet man noch Zähler mit einem definierten Startwert, welcher 
in einer oder mehreren Schleifen heruntergezählt wird. Aus der 
Abarbeitungszeit des Codes ergibt sich dann die Zeitdauer welche zu 
einem Delay verwedet werden kann. Dies macht man sich bei 
Verzögerungsschleifen (delays) zu nutze:
1
 
2
DELAY_52µs  
3
  movlw  .10      ;Wert 10 über WREG  (+1)
4
  movwf  count    ;in Zähler kopieren (+1)
5
Delay_Loop        ;Schleife Delay_Loop wird 10x durchlaufen  
6
  nop             ; (+1) Befehl ohne Funktion
7
  nop             ; (+1) "
8
  incfsz  count,f ; (+1) count-1, wenn count=0 
9
                  ;      dann nächsten Befehl überspringen
10
  goto  Delay_Loop; (+2) gesamt: 5 Cycles
11
                  ; 10 x 5µs = 50µs
12
                  ; zusätzlich 2µs zum Laden des Zählers
13
                  ; Gesamtverzögerung bis hierher = 52µs
14
  RETURN
Wenn Du jetzt den Zähler auf 100 setzt dann sind es eben 500µs und falls
Du 2 "Loops" hintereinander mit maximalem Zählerstart = 255 verwendest
erhältst Du insgesamt 2x255x5 = 2550µs = 2,25ms = 0,00225s Delay. Werden 
die Schleifen verschachtelt so ergibt das maximal 255 x 255 x 5 = 
325125µs (tatsächlich etwas mehr, da für die weitere Schleife auch noch 
Arbeitstakte erforderlich sind).

mfG Ottmar

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