Está en la página 1de 19

CURSO BSICO DE PICRETARDOS POR SOFTWARE

A menudo es necesario que nuestros programas usen


demoras o retardos, por ejemplo, si deseamos hacer
parpadear un led cada segundo evidentemente necesitaremos
usar un retardo de 1s. Los retardos son prcticamente
omnipresentes en nuestros programas. Y hay dos formas de
hacerlos:
-Por software
-Por TMR0

Retardo por Software


Los retardos por Software consisten en que el pic se quede
enciclado durante un tiempo. Es decir, es necesario usar
uno o varios contadores que debern ser decrementados,
cuando dichos contadores lleguen a 0 habr concluido el
retardo. Ejemplo con flujo-grama:

Observe en el diagrama anterior como a una variable


CONTA_1 se le asigna un numero n, posteriormente esta
variable se decrementa y se pregunta si ha llegado a 0, si no
ha llegado a0 entonces se vuelve a decrementar, y as
sucesivamente hasta que llegue a 0 en cuyo caso es el FIN del
retardo. El programa se quedo perdiendo el tiempo
enciclado dando vueltas n veces

Observe que tenemos una instruccin nueva decfsz, esta


instruccin es equivalente a decir:
Decrementa el registro f y salta si ha llegado a 0.
Es una instruccin muy til y sumamente utilizada
principalmente en procesos que se repiten n numero de
veces, tales como lo son los retardos.
Muy bien, en este punto entendemos el concepto de un
retardo por software, sin embargo surge una duda obvia e
importante: Cmo calculo el tiempo que durar un retardo?
Muy bien, observemos esta parte del cdigo ensamblador:

Ntese que esta parte es la que se ejecuta n veces hasta que


CONTA_1 llega a 0, as que solo debemos saber cunto tardan
en ejecutarse estas dos instrucciones, luego lo multiplicamos
por n y el resultado es el tiempo que dura el retardo. La

instruccin decfsz dura 1us y la instruccin goto dura 2us, as


que entre ambas duran 3uS, as pues el retardo durar:

EJEMPLO:
Deseamos hacer un retardo de 100uS, entonces usamos el
mismo cdigo:

EJEMPLO 2:
Deseamos hacer un retardo de 100uS, para esto ahora
hacemos un pequeo cambio al cdigo en ensamblador del
retardo:

Observe que ahora tenemos una instruccin nueva: nop, esta


instruccin dura 1uS y la operacin que realiza es nula, es
decir, no hace nada, entonces para que la usamos? Observe
esta parte del cdigo:

Note que esta parte del cdigo es la que se repite n veces


hasta que CONTA_1 llegue a 0(bucle). El bucle ahora tiene 3
instrucciones: nop (1uS), decfsz (1uS) y goto (2uS), que entre
lastres suman 4uS, entonces la frmula para nuestro retardo
cambio:

Retardo =
4uS x n
Despejamos n y tenemos:

Vemos como usando la instruccin nop el numero que


cargamos a CONTA_1 es ms exacto y menor. Se puede ver la
utilidad de esta instruccin que aparentemente era ociosa.
PREGUNTAS:
1) Realice un retardo que dure 1mS2)

2) Cuanto es el Tiempo mximo que se genera sin la


instruccin nop y cuanto con la instruccin nop de los
ejemplos anteriores?
3) Es posible generar un retardo mayor agregando mas
instrucciones nop?

2) Sin el nop = 765uS, con el nop = 1025uS.


3) Si es posible generar retardos ms grandes de esa manera
paro hay
mtodos ms efectivos para hacer retardos prolongados.

Bucles anidados
Como hemos visto el retardo mximo que se puede generar
de las formas enunciadas anteriormente son apenas mayores
a 1mS. Para generar retardos mucho mayores necesitamos
usar BUCLES ANIDADOS. Estos bucles anidados consisten
generar un Retardo base que se repetir n veces, el retardo

base se hace de la manera anteriormente mencionada usando


un bucle que llamamos bucle interno, y al repetir este retardo
base n veces estamos formando un bucle mayor o bucle
externo. Veamos el ejemplo en flujo-grama:

Observe como primero se carga a la variable CONTA_2 con m,


luego CONTA_1 se carga con n, luego se decrementa CONTA_1
hasta que llegue a 0 en cuyo caso decrementa CONTA_2,
siCONTA_2 no es 0 entonces vuelve a cargar CONTA_1 con n y
se vuelve a repetir el ciclo de decrementar CONTA_1 hasta 0,
el ciclo se repite m veces hasta que CONTA_2 llegue a 0 en
cuyo caso ser el fin del retardo.

Recuerde que la frmula para el retardo simple de un solo


bucle usando la instruccin nop era:

Retardo = n x 4uS
Utilizando dos bucles anidados la frmula del retardo sera la
siguiente:

Retardo = m x (n x 4uS)
Muy simple verdad. Veamos como se traduce a ensamblador:

EJEMPLO:
Realizar un retardo de 10mS. Recuerde que para un retardo de
1 mS usbamos un retardo simple de un bucle y la variable
CONTA_1 le asignbamos 250:
Retardo interno= 4uS x 250 = 1000uS = 1mS
Usaremos este retardo como retardo base y lo repetiremos 10
veces para hacer un retardo final de 10ms:
Retardo = m x (4uS * 250) =10x (1mS) = 10mS Es
decir, m = 10 y n = 250, con eso logramos el retardo de 10mS

EJERCICIO:
Genere el cdigo para hacer un retardo de 1 segundo.
Solucin: 1 segundo = 1000 mS, notamos de inmediato que
ser necesario un tercer bucle ya que el numero 1000 no
podr ser cargado al CONTA_2 ya que supera el mximo de
255. As que nuestra formula con un tercer bucle seria as:

Note la facilidad para hacer retardos, Es muy conveniente


usar retardos base redondos con base en 10 es decir, que el
retardo base sea de 1mS o 10mS etc para que solo se repita n
veces para calcular y obtener los retardos que deseemos
fcilmente y no tener que calcular tanto.
Retardos como subrutinas
Supongamos que deseamos hacer un programa para un led
parpadeante, que encienda ya pague cada 1 segundo. El
cdigo en ensamblador seria as:

Las
subrutinas
son

segmentos de cdigo que se pueden ejecutar cada vez que el


programa principal las llame y cuando terminen de ejecutarse
regresan a la siguiente posicin de donde fueron llamadas. La
instruccin que las manda a llamar es CALL y la instruccin
que regresa ala siguiente posicin de donde fueron llamadas
es RETURN.
Las subrutinas deben tener un nombre para poder ser
llamadas. Son una herramienta muy til que ahorra espacio
de memoria y facilita la programacin.

Retardos como supresores de rebote


Sabemos que los elementos mecnicos como los pulsadores
producen un efecto llamado rebote. Cuando se presiona un
botn este no se cierra idealmente, sino que antes de cerrar
se completamente rebota produciendo varios pulsos antes
de cerrarse completamente. El efecto de rebote suele durar
menos de 20 ms. Los pulsos falsos debido al rebote suelen ser
un problema si se desea hacer un contador, ya que cuando se
pulsa el botn para incrementar el contador el contador no se
incrementa en 1, sino en varias unidades, Por qu? Pues
porque cuenta los pulsos falsos producidos por el rebote. Los
retardos son tiles supresores de rebote. Cuando se pulsa un
botn se llama a un retardo de aproximadamente 20ms,
despus del retardo de 20ms continua el programa, de esta
manera los pulsos de rebote no desaparecen pero son
completamente omitidos.
EJEMPLO:

TRUCOS
Existe un truco muy til llamado multiplicacin de retardos
base. Este truco consiste en usar uno o unos pocos retardos
base y solo invocarlos y multiplicarlos por X para tener tantos
retardos como queramos. As se puede hacer un retardo base
de 1ms y generar cuando queramos retardos desde 1ms hasta
255ms sin necesidad de hacer 255 retardos diferentes. La
formula que usaramos seria la siguiente:

Por ejemplo, si se desea un retardo de 10 ms solo se hara lo


siguiente:

Lo que hace lo anterior es primero mover a W el 10, luego


llama al retardo, en donde aCONTA_2 se le asigna lo que tiene
W, como el retardo base es de 1ms entonces el retardo total
es W x 1ms.
Podemos hacer 5 retardos base de 1ms de 10ms de 100ms de
1seg y de 10seg y as hacer combinaciones para poder hacer
todos los retardos posibles desde 1ms hasta 2550 segundos.
Por ejemplo, si deseamos un retardo de 362ms entonces
escribiramos lo siguiente:

PRACTICAS DE EJEMPLO PARA COMPILAR Y PROBAR:


LED

PARPADEANTE: Enciende y apaga un led conectado a RB0 con


una duracin de 1segundo.
LED PARPADEANTE 2: Enciende un led el 20% del tiempo, el
led conectado a RB0. Periodo de1 segundo, frecuencia de 1Hz.
Usando el truco de multiplicacin de retardo base.

CONTADOR: Incrementa un contador binario que se visualiza


en PORTB presionando un botn conectado a RA0.

También podría gustarte