Está en la página 1de 5

Existen diferentes formas de realizar un retardo, lo importante es entender que un retardo se logra por medio

de un lazo que se repite varias veces, dentro de otro lazo que se repite otro numero de veces y as
sucesivamente hasta alcanzar el tiempo que necesitamos en nuestra aplicacin, las formas sencillas
normalmente son inexactas y pueden ser usadas cuando las aplicaciones que estamos construyendo no
requieren estrictamente el tiempo que nos piden.
Por ejemplo en nuestra primera actividad tenemos una sirena de 1seg, realmente nadie notara la diferencia
si la sirena suena 0.8seg o 1seg. Pero en otros casos la exactitud es crtica, como en nuestra segunda
prctica donde se quiere controlar tiempo para activar una campana, o en aplicaciones de comunicaciones
por ejemplo los retardos deben tener exactitud intachable.
En stos casos utilizamos algunas tcnicas que nos toman mas tiempo pero garantizan mayor precisin en
nuestros proyectos.
Finalmente, luego de la creacin del cdigo se pueden usar herramientas como MPLAB para medir el tiempo
exacto que estn registrando nuestros retardos.
Bueno, antes que se me duerman con sta lectura entremos en materia:
Si utilizamos un cristal externo para el PIC de 4MHz tenemos que todas las instrucciones se ejecutan en 1uS
porque cada instruccin se toma 4 ciclos de reloj:
Ciclo de reloj: 1/4MHz: 0,00000025 segundos
4 Ciclos de reloj: 4 x 0,00000025= 0,000001 = 1uS
Cada lnea que contenga instruccin (ejemplo: ptob equ 06) tarda 1 micro segundo en ejecutarse.
Exceptuando las instrucciones que tiene saltos que tardan 2 ciclos (decfsz por ejemplo), es decir 2uS.
Tomando en cuenta eso vamos a generar nuestros retardos, pero siempre partiendo de la suposicin de que
se esta trabajando a una frecuencia de 4MHz, si es as, crear rutinas de retardo para nuestro pic es muy
sencillo.

Supongamos que tenemos la siguiente rutina:

Tranquilos estas ecuaciones no muerden no salgan corriendo, necesitamos hallar N para que nuestro retardo
sea de 100us.
A la derecha de cada instruccin aparece el nmero de ciclos que tomar cada una. Las primeras dos toman
solamente 1 ciclo.
La tercera decfsz toma 1*(N-1)+2, porque decrementar N-1 veces
la variable N y en el ltimo decremento har un salto, es por eso el
+2.
La instruccin goto se ejecuta en 2 ciclos y se ejecutar N-1 veces,
es por eso que se toma como 2*(N-1).
De esta forma tenemos que el nmero de ciclos, y por lo tanto el
tiempo que tendremos de retardo est dado por la siguiente
expresin:
1 + 1 + (1)*(N-1)+2 + (2)*(N-1)
4 +
(N-1)
+ (2N-2)

, o lo que es lo mismo
[3N+1]
Si queremos un retardo de 100uS entonces tenemos que 3N+1=100 porque:

100uS / 1uS que demora cada instruccin: 100


Despejando tenemos N=(100-1)/3=33, as que para tener un retardo de 100uS el valor de la variable N debe
ser 33.
Ahora veamos esta rutina:
Podemos darnos cuenta que ahora nuestra rutina
original (desde CICLO2 hasta goto CICLO) est
afectada por la variable M, as que es como si M
multiplicara a nuestro retardo. Para saber el
nuevo valor del retardo de nuevo sumamos todos
los ciclos, tomando en cuenta que M multiplica al
retardo original de modo que la expresin ahora
queda de la siguiente manera:
1 +1 + [3N+1]*M + (1)*(M-1)+2 + (2)*(M-1),
o lo que es lo mismo:
1 +1 + [3N+1]*M +
M -1 +2
+ 2M 2 ,
[3N+1]*M + 3M + 1
De manera que tenemos dos retardos anidados. Para saber cuanto sera el retardo total primero calculamos el
retardo bsico, si queremos que ese retardo sea de 100uS entonces N=33, si ahora queremos que el retardo
total sea de 10mS entonces ocupamos completar 10000 ciclos(10mS) porque:
10mS/ 1uS que demora cada instruccin: 10000
As que igualamos nuestra expresin a ese nmero:
[(3*33)+1]*M+3M+1=10000, despejando tenemos M=(9999)/103, esto es aproximadamente igual a 97, as
que para un retardo de 10mS nuestra variable N debe valer 33 y la variable M debe tener un valor de 97

Cansados?
Yo tambin, pero
nimo si entendemos esta parte
no tendremos mas dudas acerca
de los retardos, sigamos
As podemos seguir anidando
retardos. Para obtener un retardo
de 1 segundo utilizaremos la
siguiente rutina.
Aqu vemos que la variable P
afecta a los dos retardos que ya
habamos definido de modo que la expresin para calcular el nuevo retardo total seria:
1 +1 + [[3N+1]*M + 3M + 1]*P
+
(1)*(P-1)+2 +
(2)*(P-1)
,
1 +1 + [[3N+1]*M + 3M + 1]*P
expresin seria:

[[3N+1]*M + 3M + 1]*P

P-1+2

2P-2

, y reduciendo trminos la

3P + 1

Queremos un retardo de 1 segundo, esto son 1.000.000 ciclos porque:


1/ 1uS que demora cada instruccin: 1.000.000
Por lo que nuestra expresin del retardo debe ser igual a un milln: [[3N+1]*M +
+3P+1=1.000.000 Sustituyendo N y M tenemos 9995P+1=1000000, entonces
P=(999999)/9995 y P entonces es aproximadamente igual a 100.

3M +
tenemos

1]*P
que

Al final nuestro retardo quedara asi:


RETARDO
CICLO3
CICLO2
CICLO

MOVLW
MOVWF
MOVLW
MOVWF
MOVLW
MOVWF
DECFSZ
GOTO
DECFSZ
GOTO
DECFSZ
GOTO
RETURN

.100
;1
CONT3
;1
.97
;1
CONT2
;1
.33
;1
CONT
;1
CONT,F
;1*(N-1)+2
CICLO
;2*(N-1)
CONT2,F
;1*(M-1)+2
CICLO2
;2*(M-1)
CONT3,F
;1*(P-1)+2
CICLO3
;2*(P-1)

Hoy en da existen infinidad de herramientas para crear el cdigo donde solo tienes que ingresar la frecuencia del
cristal (4MHz en este caso) y el tiempo que necesitas del retardo y ahorrarte todos estos clculos: he aqu
algunos enlaces proporcionados por los dems compaeros del curso:
http://www.piclist.com/cgi-bin/delay.exe
http://www.todopic.com.ar/utiles/calcular_retardos.zip

FIN
Fuente de informacin:
http://micropic.wordpress.com/2007/02/09/retardos-por-software/

También podría gustarte