Forum: Mikrocontroller und Digitale Elektronik Warteschleife, delays


von HasanSivan (Gast)


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ß

von g457 (Gast)


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?

von Ottmar K. (wil1)


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

von Hasan S. (hasansivan)


Lesenswert?

Danke für die schnelle Antwort

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.