Ir al contenido

Retardos por software

Si quieres que un LED parpadee cada 1 segundo, que un digito en un display se vea 10 segundos (como pide el parcial con la bomba), o que un boton no rebote al instante, necesitas retardos.

En esta seccion veras como generarlos por software: el PIC repite un bucle en ensamblador (DECFSZ + BRA) hasta que uno o varios contadores en RAM llegan a cero. Es el metodo que pide el Segundo Parcial y el que desarrolla el Tema 4 del curso.

Esta pagina es la puerta de entrada. Al terminarla —y el quiz de abajo— deberias saber que es un retardo por software, cuando conviene usarlo y como encaja con el resto de lecciones.

El PIC18 ejecuta millones de instrucciones por segundo. Sin una demora explicita:

  • Un LED pareceria siempre encendido si enciendes y apagas demasiado rapido.
  • Un display no se leeria el digito (cambia antes de que el ojo lo vea).
  • Un boton rebota electricamente y el programa leeria varias pulsaciones falsas.

El retardo frena el programa de forma controlada durante un tiempo conocido (o aproximado).

MetodoComo funcionaVentajaLimitacion
Por softwareBucles DECFSZ + BRA en ensambladorSimple, sin configurar Timer; es lo del parcialEl CPU queda ocupado en el bucle
Por hardware (Timer)Contador hardware + opcional ISREl programa puede hacer otras cosasMas registros y configuracion (Timer 0)

En el Segundo Parcial el profesor evalua sobre todo el metodo por software y la formula Retardo = CM × Σ CI. Los Timer llegan en temas posteriores.

¿Que hace el micro durante un retardo por software?

Sección titulada «¿Que hace el micro durante un retardo por software?»

Mientras corre el bucle, el PIC no avanza en el resto del programa principal (salvo que uses interrupciones, que es otro nivel). Dices que el micro esta bucleado: repite decrementar y saltar hasta que el contador es cero.

Eso implica:

  • No es multitarea: no puedes, en el mismo hilo de codigo, leer otro sensor mientras esperas 10 s en un bucle largo.
  • Si es valido para parpadear LED, esperar entre digitos, antirrebote corto, etc.
  • Para segundos largos (bomba del parcial) se usan bucles anidados o varias llamadas a subrutinas — lo veras en Bucles y Calculo.
Inicio retardo
|
v
Contador = N (MOVLW + MOVWF)
|
v
+--> DECFSZ contador
| |
| ¿Es cero? --- si --> Fin del retardo
| |
| no
| |
| BRA al bucle
+---------+
  1. Cargas N en una variable (CONTADOR en RAM).
  2. DECFSZ resta 1 y pregunta si llego a 0.
  3. Si no es 0, BRA vuelve al bucle.
  4. Si es 0, sales del retardo.

La instruccion clave es DECFSZ (decrementar y saltar si es cero). La estudiaras con detalle en Ciclos de maquina porque no siempre consume el mismo numero de ciclos.

Los contadores son bytes en memoria de datos (GPR), declarados en tu .asm:

CONTADOR RES 1 ; 1 byte: valores 0 a 255

Cada RES 1 reserva un byte, no 1 bit ni 32 bytes. Si pones RES 0x20 por error reservas 32 bytes — error comun que ya corregimos en Registros.

En el curso los retardos casi siempre son subrutinas que invocas desde el programa principal:

PROGRAMA
CALL RETARDO_CORTO
BSF LATB,0 ; enciende LED despues de esperar
; ...
RETARDO_CORTO
MOVLW .200
MOVWF CONTADOR
BUCLE
DECFSZ CONTADOR,F
BRA BUCLE
RETURN

Detalle para el calculo: cada CALL suma 2 ciclos (Tabla 4.1). Si en el parcial cuentas el tiempo total, no olvides el CALL si la rutina se invoca asi.

Sin calcular aun los milisegundos exactos, la forma del programa es:

BUCLE_PRINCIPAL
BSF LATB,0 ; LED on
CALL RETARDO_500MS ; espera ~medio segundo
BCF LATB,0 ; LED off
CALL RETARDO_500MS
BRA BUCLE_PRINCIPAL

Periodo total ~1 s si cada RETARDO_500MS dura medio segundo. Los valores N, M, P de los bucles salen de CM × Σ CI — proximas paginas.

AplicacionTiempo tipicoDonde profundizar
Parpadear LED 1 Hz~500 ms on / 500 ms offCalculo
Señal cuadrada 10 Hz50 ms por mitadCalculo
Display bomba 9→010 s por digitoBucles (3 bucles @ 20 MHz)
Antirrebote botonpocos msGPIO botones + retardo corto
Retardo 3 ms (examen)3 ms exactos @ 20 MHzCalculo

En proyectos reales no recalculas en cada linea. Creas un catalogo de subrutinas:

  • RETARDO_1MS, RETARDO_10MS, RETARDO_50MS, RETARDO_1S
  • Valores N, M, P precalculados para tu cristal (20 MHz en el curso)

Llamas CALL RETARDO_10MS diez veces si necesitas 100 ms, en lugar de duplicar codigo.

OrdenPaginaObjetivo
1Esta paginaConcepto, software vs Timer, subrutinas
2Ciclos de maquinaCM, Tabla 4.1, pipeline
3Bucles de retardo1, 2 y 3 bucles, formulas
4Calculo y aplicaciones3 ms, 10 Hz, NOP, BRA — quiz largo

Ejercicio · Parcial

Reflexion

¿Por que un retardo por software no sirve si necesitas medir un sensor cada 1 ms y mostrar un LCD al mismo tiempo sin interrupciones? Piensa en “CPU bucleado”.

Responde el quiz de abajo para comprobar que entendiste los conceptos base antes de entrar en formulas y ciclos de maquina.

Examen interactivo

Introduccion — Retardos por software

Basado en: Clase Tema 4 y 5.pdf

0 de 0 respondidas

Un retardo por software en el PIC se implementa tipicamente con...
Las dos formas principales de generar un retardo en el curso son...
Mientras dura un retardo por software, el CPU del PIC...
La formula general del retardo por software del curso es...
Si llamas una subrutina de retardo con CALL, debes sumar al calculo...

Continua con Ciclos de maquina e instruccion. Sin CM y la Tabla 4.1 no podras resolver el retardo de 3 ms del parcial.