Delay rutiner
Ofte så må man bruke delay rutiner eller vente rutiner fordi prosessoren jobber for raskt i visse situasjoner.
Den enkleste forsinkelsen man kan lage er en eller flere NOP kommandoer etter hverandre i programmet,
en NOP bruker en instruksjon cycle uten å gjøre noen ting, dette er den korteste forsinkelsen man kan ha.
Hvis oscillatoren til prosessoren har en frekvens på 4 Mhz, så er instruksjon frekvensen 1 Mhz dvs. 1uS,
det tar da 1 uS å utføre en instruksjon som er en instruksjon cycle.
Denne forsinkelsen er ofte altfor liten.
Enkel delay rutine
Forsinkelsen på denne rutinen kan regnes ut etter følgende formel : Ncycle = 3*A+5
Med en 4 Mhz klokkefrekvens så er den maksimale forsinkelsen 770 uS.
N cycle er antall instruksjon cycler rutinen bruker, A er tallet man skal sette inn i vente rutinen ( 0 til 255 desimalt ).
cnt0 er et register man må definere i begynnelsen av programmet.
wait |
movlw |
A |
;legger tallet i w register |
movwf |
cnt0 |
;flytter tallet over i cnt0 registeret |
|
loop0 |
decfsz |
cnt0 |
;minker cnt0 register hopper over neste instruksjon hvis cnt0 er 0 |
goto |
loop0 |
;går til loop0 hvis cnt0 ikke er 0 |
|
return |
;returnerer hvis cnt0 er 0 |
Dobbel delay rutine
Trenger man en lengre forsinkelse så kan man utvide den enkle rutinen.
Denne rutinen virker på samme måte som den enkle, de er bare satt utenpå hverandre.
Med en 4 Mhz klokkefrekvens så er den maksimale forsinkelsen 196,1 mS.
Denne kan regnes ut etter følgende formel : Ncycle = 3*A*B+4*A+5
Delay |
movlw |
B |
|
movwf |
cnt1 |
||
loop1 |
movlw |
A |
|
movwf |
cnt0 |
||
loop0 |
decfsz |
cnt0 |
|
goto |
loop0 |
||
decfsz |
cnt1 |
||
goto |
loop0 |
||
return |
Trippel delay rutine
Med en 4 Mhz klokkefrekvens så er den maksimale forsinkelsen 50 S.
Denne kan regnes ut etter følgende formel : Ncycle = 3*A*B*C+4*A*B+4*A+5
delay |
movlw |
C |
|
movwf |
cnt2 |
||
loop2 |
movlw |
B |
|
movwf |
cnt1 |
||
loop1 |
movlw |
A |
|
movwf |
cnt0 |
||
loop0 |
decfsz |
cnt0 |
|
goto |
loop0 |
||
dekfsz |
cnt1 |
||
goto |
loop1 |
||
decfsz |
cnt0 |
||
goto |
loop0 |
||
return |
Skal man øke disse rutinene så kan man sette inn en eller flere NOP kommandoer i den innerste rutinen,
cnt0 er alltid den innerste for eks.
loop0 |
decfsz |
cnt0 |
|
nop |
|||
nop |
|||
goto |
loop0 |
Formelen kan da forandres med å bytte ut 3 tallet med 3 + antall NOP for eks. Ncycle = 5*A*B osv.
Det er ingen ting i veien for å sette enda flere slike rutiner utenpå hverandre, man kan da få så lang forsinkelse man ønsker.