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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.