Sei sulla pagina 1di 13

Diapositivas 4

 Subrutinas de retardo
de tiempo
Subrutina para retardos de tiempo.
Un ciclo máquina es la unidad de medida de tiempo cuando se
trabaja con microcontroladores.

Para el PIC 16F84A, un ciclo máquina es equivalente a cuatro ciclos


de reloj del oscilador.

Usando un cristal de cuarzo con frecuencia de 4 MHz, entonces


cada ciclo máquina tendrá una duración de:
4 4
1 ciclo máquina  4Tosc    1  seg
f osc 4MHz

Casi todas las instrucciones del PIC 16F84A se ejecutan en 1 ciclo


máquina ( 1  seg ), a excepción de las instrucciones de salto que
requieren de hasta 2 ciclos máquina ( 2  seg ).
Analice el siguiente código:
.
.
.

CALL RETARDO 2 cm
.
(cm: ciclo máquina)
.
.

RETARDO MOVLW D’K’ 1 cm


MOVWF CONTADOR 1 cm
REGRESA NOP (1 cm) x K
DECFSZ CONTADOR, F (1 cm) x (K-1) + 2 cm

No salta Salta
GOTO REGRESA (2 cm) x (K-1)
RETURN (2 cm)

Tiempo = 2+1+1+K+(K-1)+2+2(K-1)+2=(5+4K) cm = (5+4K) µseg


Tiempo  5 1000  5
Para un tiempo de 1 mseg: K   248.75
4 4

Observe los siguientes dos casos:

CASO 1.

Si K=249, entonces Tiempo=5+4(249)=1001 µseg=1.001 mseg

Esta subrutina de tiempo es casi exacta, pero excede en un tiempo


de 1 µseg.

CASO 2.

Si K=248, entonces Tiempo=5+4(248)=997 µseg=0.997 mseg

Esta subrutina de tiempo es menor que el esperado y faltan 3 µseg.


Si no se requieren tiempos “exactos”, entonces podremos usar el
código mostrado con anterioridad, a pesar de excederse en un 1
µseg.

Si se requieren tiempos “exactos”, entonces se modificará la


subrutina de retardo de tiempo, añadiendo el número necesario
de instrucciones NOP para realizar este ajuste, de tal forma que el
código tendrá la siguiente forma:

CALL RETARDO
.
Programa
. Principal
.

RETARDO MOVLW D’K’


MOVWF CONTADOR
NOP
NOP Subrutina
NOP retardo de
REGRESA NOP tiempo
DECFSZ CONTADOR, F
GOTO REGRESA
RETURN
Subrutina de retardo de tiempo desde 100 mseg
hasta 25 seg:
RETARDO MOVLW D’K’
MOVWF CONT3
BUCLE3 MOVLW D’100’
MOVWF CONT2
BUCLE2 MOVLW D’249’
MOVWF CONT1
BUCLE1 NOP
DECFSZ CONT1, F
GOTO BUCLE1
DECFSZ CONT2, F
GOTO BUCLE2
DECFSZ CONT3, F
GOTO BUCLE3
RETURN

NOTAS:
(1) El tiempo de retardo se calcula como: Tiempo  K  100 mseg 
(2) Sustituir “K” por un valor válido entre 1 y 255.
(3) Deberán definirse las variables CONT1, CONT2 y CONT3 en el
programa principal.
EJEMPLO. Programa que realiza el parpadeo entre los nibbles bajo
y alto del puerto B, cada 500 ms en bucle infinito.

Nibble bajo encendido durante 500 ms.

Nibble alto encendido durante 500 ms.

Código: Continuación:
CONT1 EQU 0x0C RETARDO MOVLW D’5’
CONT2 EQU 0x0D MOVWF CONT3
CONT3 EQU 0x0E BUCLE3 MOVLW D’100’
MOVWF CONT2
ORG H’00’ BUCLE2 MOVLW D’249’
BSF STATUS, RP0 MOVWF CONT1
CLRF TRISB BUCLE1 NOP
BCF STATUS, RP0 DECFSZ CONT1, F
GOTO BUCLE1
INICIO MOVLW B’00001111’ DECFSZ CONT2, F
MOVWF PORTB GOTO BUCLE2
CALL RETARDO DECFSZ CONT3, F
MOVLW B’11110000’ GOTO BUCLE3
MOVWF PORTB RETURN
CALL RETARDO
GOTO INICIO END
El código anterior puede reescribirse de la forma siguiente:
CBLOCK: Directiva que se usa para definir
CBLOCK 0x0C
una lista de constantes y asignarles una
CONT1
dirección de memoria.
CONT2
CONT3 Al terminar la lista de constantes, se
ENDC escribe la directiva ENDC.

ORG H’00’
BSF STATUS, RP0
CLRF TRISB
BCF STATUS, RP0

INICIO MOVLW B’00001111’


MOVWF PORTB
CALL RETARDO
SWAPF PORTB,F
CALL RETARDO
GOTO INICIO

RETARDO MOVWF D’5’


.
.
.

END
EJEMPLO. Programa de parpadeo de nibbles bajo/alto cada 500
mseg y con bucle finito de 4 veces.

Código: Continuación:

CBLOCK 0x0C INCF CUENTA,F


CUENTA MOVLW D’4’
CONT1 SUBWF CUENTA,W
CONT2 BTFSS STATUS,Z
CONT3 GOTO INICIO
ENDC SLEEP

ORG H’00’ RETARDO MOVWF D’5’


BSF STATUS, RP0 .
CLRF TRISB .
BCF STATUS, RP0 .

CLRF CUENTA END


CLRF PORTB
INICIO MOVLW H’0F’
MOVWF PORTB
CALL RETARDO
SWAPF PORTB,F
CALL RETARDO
EJEMPLO. Programa que realiza un juego de luces denominado
“auto fantástico”.

Se enciende un led (uno a la vez) de derecha a izquierda cada


0.5 seg y luego la misma secuencia de luces de izquierda a derecha,
en bucle infinito.

Código: Continuación:

ORG H’00’ INICIO_2 MOVF REGISTRO,W


BSF STATUS, RP0 MOVWF PORTB
CLRF TRISB CALL RETARDO
BCF STATUS, RP0 RRF REGISTRO,F
BTFSS STATUS,C
BSF STATUS,C GOTO INICIO_2
CLRF REGISTRO GOTO INICIO_1
INICIO_1 MOVF REGISTRO,W
MOVWF PORTB
CALL RETARDO RETARDO MOVLW D’5’
RLF REGISTRO,F .
BTFSS STATUS,C .
GOTO INICIO_1 .

END
EJEMPLO. Programa contador binario de 0 a 30, con intervalos de 1
seg y visualización por el puerto B.

Código: Continuación:

CBLOCK 0x0C MOVLW D’31’


CUENTA SUBWF CONTADOR,W
CONT1 BTFSS STATUS,Z
CONT2 GOTO INICIO
CONT3 SLEEP
ENDC

ORG H’00’
RETARDO MOVLW D’10’
BSF STATUS, RP0
.
CLRF TRISB
.
BCF STATUS, RP0
.
CLRF CONTADOR
END
INICIO MOVF CONTADOR,W
MOVWF PORTB
CALL RETARDO
INCF CONTADOR,F
PROGRAMA 6. Juego de secuencia de luces, visualizadas por el
puerto B:

Secuencia 1: Parpadeo leds pares e impares, en intervalos de 600


mseg. Se repite 5 veces.

Secuencia 2: Efecto del “auto fantástico” en intervalos de 300 mseg.


Se repite 7 veces.

Secuencia 3: Encendido de leds en cada extremo cuyo efecto visual


sea acercándose al centro y luego alejándose de nuevo, en
intervalos de 400 mseg. Se repite 9 veces y finalmente todos los leds
quedarán encendidos.
PROGRAMA 7. Contador ascendente de 0 a F con salida a un display de
7 segmentos, con intervalos de 1 seg.

PROGRAMA 8. Contador ascendente/descendente de 0 a 9 con salida a


un display de 7 segmentos, con intervalos de 1 seg y bucle infinito. Se
tiene una entrada de control en RA0 de tal forma que:

 Si RA0=“0”, entonces se tiene un CONTADOR ASCENDENTE, y


 Si RA0=“1”, entonces se tiene un CONTADOR DESCENDENTE.

Al realizar el cambio de estado en la entrada de control, se realiza el


cambio de cuenta ASCENDENTE/DESCENDENTE, a partir del ultimo valor
desplegado en el display; no debe reiniciarse la cuenta.

Por ejemplo, si RA0 es igual a “0” entonces se visualiza un conteo


ASCENDENTE. Mientras no se modifique, se realizan innumerables conteos
desde 0 hasta 9 y se reinicia cada vez que llega a su cuenta máxima.

En un instante se tiene la cuenta ascendente en 7, en ese momento se


cambia el estado de RA0 a “1”, entonces se cambiará a un conteo
DESCENDENTE, que empezará con el valor 6 y seguirá 5,4,3,… etc. hasta 0
y reinicia 9, 8, etc. hasta que vuelva a modificarse el valor de RA0 y
vuelva de nuevo el contero ASCENDENTE y viceversa.

Potrebbero piacerti anche