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.

 

Tilbake