jeudi 29 mars 2012

délais

implémentations des délais en assembleur
Dans presque tous les projets on a besoin de créer un délais entre 2 opérations. Par exemple dans hello DEL il fallait attendre 0,5 seconde entre chaque changement d'état du DEL. Dépendant de la tâche à accomplir le délais peut-être aussi bref qu'un Tcy ou encore duré plusieurs secondes ou même minutes.

Ajourd'hui je vais exposer une méthode pour implémenter un délais en assembleur sur PIC.

délais courts
Pour attendre un seul Tcy l'instruction NOP est idéale. Pour 2 Tcy il y a mieux que 2 NOP consécutifs, GOTO $+1 va s'exécuter en 2 Tcy en utilisant qu'une seule instruction. En utilisant une macro on peut grandement facilité la tâche de la façon suivante


delais_us macro usec ; délais en micro-secondes 0<=usec<=3*255+4
local q,r
q=(usec-4) / 3
if q==0
r=usec
else
r=(usec-4) % 3
endif
if q>0
movlw ~q
movwf delay_cntr
incfsz delay_cntr
goto $-1
endif
while r>1
goto $+1
r -= 2
endw
if r==1
nop
endif
endm


Ici on utilise la directive d'assemblage conditionnelle if pour générer du code assembleur qui sera différent dépendant de la constante qu'on passe en argument. Si usec=0 aucun code n'est généré, si 1<usec<7 seule la boucle while et le if qui suit génèreront du code. Ce code varira d'un simple NOP lorsque r=1 à 3 GOTO $+1 lorsque r=6. Si usec est plus grand que 6 la variable delay_cntr sera utilisée et le code pour une boucle incrémentielle sera généré.
cette macro peut générer un délais entre 0 et 769*Tcy soit dans le cas d'un PIC10F2xx 769usec.

délais plus long
pour des délais plus long 2 techniques ont été données en exemple dans la chronique retour sur hello DEL

Aucun commentaire:

Publier un commentaire