Vous êtes sur la page 1sur 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) [3N+1] Si queremos un retardo de 100uS entonces tenemos que 3N+1=100 porque: 100uS / 1uS que demora cada instruccin: 100 , o lo que es lo mismo

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 +1 + [[3N+1]*M + 3M + 1]*P [[3N+1]*M + 3M + 1]*P + + + (1)*(P-1)+2 + P-1+2 3P + 1 + (2)*(P-1) 2P-2 , , y reduciendo trminos la expresin seria:

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 + 3M + 1]*P +3P+1=1.000.000 Sustituyendo N y M tenemos 9995P+1=1000000, entonces tenemos que P=(999999)/9995 y P entonces es aproximadamente igual a 100.

Al final nuestro retardo quedara asi:


RETARDO CICLO3 CICLO2 CICLO MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF DECFSZ GOTO DECFSZ GOTO DECFSZ GOTO RETURN .100 CONT3 .97 CONT2 .33 CONT CONT,F CICLO CONT2,F CICLO2 CONT3,F CICLO3 ;1 ;1 ;1 ;1 ;1 ;1 ;1*(N-1)+2 ;2*(N-1) ;1*(M-1)+2 ;2*(M-1) ;1*(P-1)+2 ;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/

Vous aimerez peut-être aussi