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ß
> 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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.