SlideShare uma empresa Scribd logo
1 de 17
CURSO BÁSICO 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
prácticamente 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
deberán 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 instrucción nueva decfsz, esta instrucción es
equivalente a decir:
Decrementa el registro f y salta si ha llegado a 0.
Es una instrucción 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: ¿Cómo calculo el
tiempo que durará un retardo? Muy bien, observemos esta parte del código
ensamblador:




Nótese que esta parte es la que se ejecuta n veces hasta que CONTA_1 llega
a 0, así que solo debemos saber cuánto tardan en ejecutarse estas dos
instrucciones, luego lo multiplicamos por n y el resultado es el tiempo que
dura el retardo. La instrucción decfsz dura 1us y la instrucción 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 código:




EJEMPLO 2:
Deseamos hacer un retardo de 100uS, para esto ahora hacemos un pequeño
cambio al código en ensamblador del retardo:
Observe que ahora tenemos una instrucción nueva: nop, esta instrucción
dura 1uS y la operación que realiza es nula, es decir, no hace nada, entonces
¿para que la usamos? Observe esta parte del código:




Note que esta parte del código 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 fórmula
para nuestro retardo cambio:
                                    Retardo = 4uS x n
Despejamos n y tenemos:



Vemos como usando la instrucción nop el numero que cargamos a CONTA_1
es más exacto y menor. Se puede ver la utilidad de esta instrucción que
aparentemente era ociosa.

PREGUNTAS:
  1) Realice un retardo que dure 1mS2)
  2) ¿Cuanto es el Tiempo máximo que se genera sin la instrucción nop y
     cuanto con la instrucción 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 más grandes de esa manera paro hay
  métodos más efectivos para hacer retardos prolongados.

Bucles anidados
Como hemos visto el retardo máximo 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 fórmula para el retardo simple de un solo bucle usando la
instrucción nop era:
                       Retardo = n x 4uS
Utilizando dos bucles anidados la fórmula del retardo sería 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
usábamos un retardo simple de un bucle y la variable CONTA_1 le
asignábamos 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 código para hacer un retardo de 1 segundo.
Solución: 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 máximo 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 fácilmente 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 código en ensamblador seria así:
Las subrutinas son segmentos de código que se pueden ejecutar cada vez que
el programa principal las llame y cuando terminen de ejecutarse regresan a la
siguiente posición de donde fueron llamadas. La instrucción que las manda a
llamar es CALL y la instrucción que regresa ala siguiente posición 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
programación.

Retardos como supresores de rebote
Sabemos que los elementos mecánicos como los pulsadores producen un
efecto llamado rebote. Cuando se presiona un botón 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
botón 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 botón se llama a un retardo de aproximadamente 20ms,
después 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 multiplicación 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 usaríamos seria la siguiente:



Por ejemplo, si se desea un retardo de 10 ms solo se haría 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 escribiríamos lo siguiente:




PRACTICAS DE EJEMPLO PARA COMPILAR Y PROBAR:

LED PARPADEANTE: Enciende y apaga un led conectado a RB0 con una
duración 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
multiplicación de retardo base.
CONTADOR: Incrementa un contador binario que se visualiza en PORTB
presionando un botón conectado a RA0.
Pic retardos por software

Mais conteúdo relacionado

Mais procurados

Ejercicios Sincronos
Ejercicios SincronosEjercicios Sincronos
Ejercicios Sincronosguest1e528d
 
Respuesta Transitoria (Ejercicios resueltos)
Respuesta Transitoria (Ejercicios resueltos)Respuesta Transitoria (Ejercicios resueltos)
Respuesta Transitoria (Ejercicios resueltos)johnkiki
 
30672573 reporte-de-practica-pwm-555
30672573 reporte-de-practica-pwm-55530672573 reporte-de-practica-pwm-555
30672573 reporte-de-practica-pwm-555AdRix MarTz
 
Multisim, como medir paso a paso
Multisim, como medir paso a pasoMultisim, como medir paso a paso
Multisim, como medir paso a pasoedgarfrans
 
Ejercicios de-programacic3b3n-resueltos-con-step-7
Ejercicios de-programacic3b3n-resueltos-con-step-7Ejercicios de-programacic3b3n-resueltos-con-step-7
Ejercicios de-programacic3b3n-resueltos-con-step-7Guido Carmona Girón
 
Diferentes tipos de flip flops (jk, sr, d, t) sus tablas de verdad,
Diferentes tipos de flip flops (jk, sr, d, t) sus tablas de verdad,Diferentes tipos de flip flops (jk, sr, d, t) sus tablas de verdad,
Diferentes tipos de flip flops (jk, sr, d, t) sus tablas de verdad,Miguel Brunings
 
Aplicación de grafcet de nivel 2 y Programación de PLC
Aplicación de grafcet de nivel 2 y Programación de PLCAplicación de grafcet de nivel 2 y Programación de PLC
Aplicación de grafcet de nivel 2 y Programación de PLCCarlos Muñiz Cueto
 
Circuitos Logicos Combinacionales
Circuitos Logicos CombinacionalesCircuitos Logicos Combinacionales
Circuitos Logicos Combinacionalesguest1e528d
 
Control Pid
Control PidControl Pid
Control PidCIMAT
 
Examen micros t1_06_solucion
Examen micros t1_06_solucionExamen micros t1_06_solucion
Examen micros t1_06_solucionJair BG
 
Rutinas de retardo
Rutinas de retardoRutinas de retardo
Rutinas de retardoBertha Vega
 
Contadores a y s síncronos
Contadores a y s síncronosContadores a y s síncronos
Contadores a y s síncronosDiego Ayala
 
compuertas logicas
compuertas logicascompuertas logicas
compuertas logicasbamz19
 
Programacion en WinCupl
Programacion en WinCuplProgramacion en WinCupl
Programacion en WinCuplGilbert_28
 
05 respuesta en el tiempo de un sistema de control
05   respuesta en el tiempo de un sistema de control05   respuesta en el tiempo de un sistema de control
05 respuesta en el tiempo de un sistema de controlreneej748999
 
Capacitores inductores
Capacitores inductoresCapacitores inductores
Capacitores inductoresdavid159936
 

Mais procurados (20)

Ejercicios Sincronos
Ejercicios SincronosEjercicios Sincronos
Ejercicios Sincronos
 
Respuesta Transitoria (Ejercicios resueltos)
Respuesta Transitoria (Ejercicios resueltos)Respuesta Transitoria (Ejercicios resueltos)
Respuesta Transitoria (Ejercicios resueltos)
 
30672573 reporte-de-practica-pwm-555
30672573 reporte-de-practica-pwm-55530672573 reporte-de-practica-pwm-555
30672573 reporte-de-practica-pwm-555
 
Grafcet
GrafcetGrafcet
Grafcet
 
Timer0 PIC16F84A
Timer0 PIC16F84ATimer0 PIC16F84A
Timer0 PIC16F84A
 
Multisim, como medir paso a paso
Multisim, como medir paso a pasoMultisim, como medir paso a paso
Multisim, como medir paso a paso
 
Ejercicios de-programacic3b3n-resueltos-con-step-7
Ejercicios de-programacic3b3n-resueltos-con-step-7Ejercicios de-programacic3b3n-resueltos-con-step-7
Ejercicios de-programacic3b3n-resueltos-con-step-7
 
Diferentes tipos de flip flops (jk, sr, d, t) sus tablas de verdad,
Diferentes tipos de flip flops (jk, sr, d, t) sus tablas de verdad,Diferentes tipos de flip flops (jk, sr, d, t) sus tablas de verdad,
Diferentes tipos de flip flops (jk, sr, d, t) sus tablas de verdad,
 
Aplicación de grafcet de nivel 2 y Programación de PLC
Aplicación de grafcet de nivel 2 y Programación de PLCAplicación de grafcet de nivel 2 y Programación de PLC
Aplicación de grafcet de nivel 2 y Programación de PLC
 
Circuitos Logicos Combinacionales
Circuitos Logicos CombinacionalesCircuitos Logicos Combinacionales
Circuitos Logicos Combinacionales
 
Configuraciones del 555
Configuraciones del 555Configuraciones del 555
Configuraciones del 555
 
Control Pid
Control PidControl Pid
Control Pid
 
Pid
PidPid
Pid
 
Examen micros t1_06_solucion
Examen micros t1_06_solucionExamen micros t1_06_solucion
Examen micros t1_06_solucion
 
Rutinas de retardo
Rutinas de retardoRutinas de retardo
Rutinas de retardo
 
Contadores a y s síncronos
Contadores a y s síncronosContadores a y s síncronos
Contadores a y s síncronos
 
compuertas logicas
compuertas logicascompuertas logicas
compuertas logicas
 
Programacion en WinCupl
Programacion en WinCuplProgramacion en WinCupl
Programacion en WinCupl
 
05 respuesta en el tiempo de un sistema de control
05   respuesta en el tiempo de un sistema de control05   respuesta en el tiempo de un sistema de control
05 respuesta en el tiempo de un sistema de control
 
Capacitores inductores
Capacitores inductoresCapacitores inductores
Capacitores inductores
 

Semelhante a Pic retardos por software

TEMA Nº 7: SENTENCIAS DE CONTROL DE FLUJO EN JAVA II
TEMA Nº 7: SENTENCIAS DE CONTROL DE FLUJO EN JAVA IITEMA Nº 7: SENTENCIAS DE CONTROL DE FLUJO EN JAVA II
TEMA Nº 7: SENTENCIAS DE CONTROL DE FLUJO EN JAVA IIAnyeni Garay
 
Manual de Prácticas en Arduino Uno
Manual de Prácticas en Arduino UnoManual de Prácticas en Arduino Uno
Manual de Prácticas en Arduino Unoecom93
 
3 contar, mientras
3  contar, mientras3  contar, mientras
3 contar, mientrasVisemi VI
 
Cómo y para qúe usar un ciclo do while en c++
Cómo y para qúe usar un ciclo do while en c++Cómo y para qúe usar un ciclo do while en c++
Cómo y para qúe usar un ciclo do while en c++Tensor
 
Microcontroladores AVR y Arduino: Programación del microatmega328p en ensambl...
Microcontroladores AVR y Arduino: Programación del microatmega328p en ensambl...Microcontroladores AVR y Arduino: Programación del microatmega328p en ensambl...
Microcontroladores AVR y Arduino: Programación del microatmega328p en ensambl...SANTIAGO PABLO ALBERTO
 
While para presentación
While para presentaciónWhile para presentación
While para presentaciónIDIECECY
 
Instrucciones de control de salto
Instrucciones de control de saltoInstrucciones de control de salto
Instrucciones de control de saltoAbrirllave
 
Estructuras de control C++
Estructuras de control C++Estructuras de control C++
Estructuras de control C++LOANNELMARIN
 
Instrucciones de control repetitivas
Instrucciones de control repetitivasInstrucciones de control repetitivas
Instrucciones de control repetitivasAbrirllave
 
Ciclos 100212081819-phpapp01
Ciclos 100212081819-phpapp01Ciclos 100212081819-phpapp01
Ciclos 100212081819-phpapp01Andres Fernadez
 
Practica de Microcontroladores PIC: tren de pulsos
Practica de Microcontroladores PIC: tren de pulsosPractica de Microcontroladores PIC: tren de pulsos
Practica de Microcontroladores PIC: tren de pulsosSANTIAGO PABLO ALBERTO
 
Tutorial proton part 4
Tutorial proton part 4Tutorial proton part 4
Tutorial proton part 4dar851112
 

Semelhante a Pic retardos por software (20)

7.intermitencia
7.intermitencia7.intermitencia
7.intermitencia
 
TEMA Nº 7: SENTENCIAS DE CONTROL DE FLUJO EN JAVA II
TEMA Nº 7: SENTENCIAS DE CONTROL DE FLUJO EN JAVA IITEMA Nº 7: SENTENCIAS DE CONTROL DE FLUJO EN JAVA II
TEMA Nº 7: SENTENCIAS DE CONTROL DE FLUJO EN JAVA II
 
Manual de Prácticas en Arduino Uno
Manual de Prácticas en Arduino UnoManual de Prácticas en Arduino Uno
Manual de Prácticas en Arduino Uno
 
3 contar, mientras
3  contar, mientras3  contar, mientras
3 contar, mientras
 
Cómo y para qúe usar un ciclo do while en c++
Cómo y para qúe usar un ciclo do while en c++Cómo y para qúe usar un ciclo do while en c++
Cómo y para qúe usar un ciclo do while en c++
 
Microcontroladores AVR y Arduino: Programación del microatmega328p en ensambl...
Microcontroladores AVR y Arduino: Programación del microatmega328p en ensambl...Microcontroladores AVR y Arduino: Programación del microatmega328p en ensambl...
Microcontroladores AVR y Arduino: Programación del microatmega328p en ensambl...
 
While para presentación
While para presentaciónWhile para presentación
While para presentación
 
Instrucciones de control de salto
Instrucciones de control de saltoInstrucciones de control de salto
Instrucciones de control de salto
 
Sentencias
SentenciasSentencias
Sentencias
 
Sentencias
SentenciasSentencias
Sentencias
 
Proyecto1
Proyecto1Proyecto1
Proyecto1
 
MEMOIZACIÓN
MEMOIZACIÓNMEMOIZACIÓN
MEMOIZACIÓN
 
Estructuras de control C++
Estructuras de control C++Estructuras de control C++
Estructuras de control C++
 
Estructura repetitiva
Estructura repetitivaEstructura repetitiva
Estructura repetitiva
 
Instrucciones de control repetitivas
Instrucciones de control repetitivasInstrucciones de control repetitivas
Instrucciones de control repetitivas
 
Ciclos
CiclosCiclos
Ciclos
 
Ciclos 100212081819-phpapp01
Ciclos 100212081819-phpapp01Ciclos 100212081819-phpapp01
Ciclos 100212081819-phpapp01
 
Practica de Microcontroladores PIC: tren de pulsos
Practica de Microcontroladores PIC: tren de pulsosPractica de Microcontroladores PIC: tren de pulsos
Practica de Microcontroladores PIC: tren de pulsos
 
Tutorial proton part 4
Tutorial proton part 4Tutorial proton part 4
Tutorial proton part 4
 
manual-batch-desde-0
manual-batch-desde-0manual-batch-desde-0
manual-batch-desde-0
 

Pic retardos por software

  • 1. CURSO BÁSICO 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 prácticamente 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 deberán ser decrementados, cuando dichos contadores lleguen a 0 habrá concluido el retardo. Ejemplo con flujo-grama:
  • 2. 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 instrucción nueva decfsz, esta instrucción es equivalente a decir: Decrementa el registro f y salta si ha llegado a 0. Es una instrucción 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: ¿Cómo calculo el tiempo que durará un retardo? Muy bien, observemos esta parte del código ensamblador: Nótese que esta parte es la que se ejecuta n veces hasta que CONTA_1 llega a 0, así que solo debemos saber cuánto tardan en ejecutarse estas dos instrucciones, luego lo multiplicamos por n y el resultado es el tiempo que dura el retardo. La instrucción decfsz dura 1us y la instrucción goto dura 2us, así que entre ambas duran 3uS, así pues el retardo durará:
  • 3. EJEMPLO: Deseamos hacer un retardo de 100uS, entonces usamos el mismo código: EJEMPLO 2: Deseamos hacer un retardo de 100uS, para esto ahora hacemos un pequeño cambio al código en ensamblador del retardo:
  • 4. Observe que ahora tenemos una instrucción nueva: nop, esta instrucción dura 1uS y la operación que realiza es nula, es decir, no hace nada, entonces ¿para que la usamos? Observe esta parte del código: Note que esta parte del código 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 fórmula para nuestro retardo cambio: Retardo = 4uS x n Despejamos n y tenemos: Vemos como usando la instrucción nop el numero que cargamos a CONTA_1 es más exacto y menor. Se puede ver la utilidad de esta instrucción que aparentemente era ociosa. PREGUNTAS: 1) Realice un retardo que dure 1mS2) 2) ¿Cuanto es el Tiempo máximo que se genera sin la instrucción nop y cuanto con la instrucción nop de los ejemplos anteriores? 3) ¿Es posible generar un retardo mayor agregando mas instrucciones nop?
  • 5. 2) Sin el nop = 765uS, con el nop = 1025uS. 3) Si es posible generar retardos más grandes de esa manera paro hay métodos más efectivos para hacer retardos prolongados. Bucles anidados Como hemos visto el retardo máximo 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:
  • 6. 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.
  • 7. Recuerde que la fórmula para el retardo simple de un solo bucle usando la instrucción nop era: Retardo = n x 4uS Utilizando dos bucles anidados la fórmula del retardo sería 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 usábamos un retardo simple de un bucle y la variable CONTA_1 le asignábamos 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
  • 8. EJERCICIO: Genere el código para hacer un retardo de 1 segundo. Solución: 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 máximo de 255. Así que nuestra formula con un tercer bucle seria así:
  • 9. 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 fácilmente 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 código en ensamblador seria así:
  • 10. Las subrutinas son segmentos de código que se pueden ejecutar cada vez que el programa principal las llame y cuando terminen de ejecutarse regresan a la siguiente posición de donde fueron llamadas. La instrucción que las manda a llamar es CALL y la instrucción que regresa ala siguiente posición 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 programación. Retardos como supresores de rebote Sabemos que los elementos mecánicos como los pulsadores producen un efecto llamado rebote. Cuando se presiona un botón 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
  • 11. ser un problema si se desea hacer un contador, ya que cuando se pulsa el botón 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 botón se llama a un retardo de aproximadamente 20ms, después del retardo de 20ms continua el programa, de esta manera los pulsos de rebote no desaparecen pero son completamente omitidos. EJEMPLO:
  • 12. TRUCOS Existe un truco muy útil llamado multiplicación 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 usaríamos seria la siguiente: Por ejemplo, si se desea un retardo de 10 ms solo se haría lo siguiente:
  • 13. 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 escribiríamos lo siguiente: PRACTICAS DE EJEMPLO PARA COMPILAR Y PROBAR: LED PARPADEANTE: Enciende y apaga un led conectado a RB0 con una duración de 1segundo.
  • 14. 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 multiplicación de retardo base.
  • 15.
  • 16. CONTADOR: Incrementa un contador binario que se visualiza en PORTB presionando un botón conectado a RA0.