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