práctica nº 13

Anuncio
Pedro Guerrero Amado.Marzo 2002
PRACTICA 13
TEMPORIZADOR CON EL TIMER 0
DESCRIPCIÓN.
Esta práctica es la misma que la del ejercicio 6 lo único que cambia es la rutina de
temporización que usamos el TIMER 0 para la realización de la misma.
PROGAMA FUENTE
LIST P=PIC16F84
LIST C=132
#define banco1 bsf 0x03,5
#define banco0 bcf 0x03,5
;DECLARACION REGISTROS Y VARIABLES
include <registr.h>
cont1 EQU 0xc
cont2 EQU 0xd
cuenta EQU 0xe
indice EQU 0xf
ORG 0
GOTO reset ;salvamos el vector de interrupción
ORG 5
reset
banco1
CLRF trisb
MOVLW 0x1f
MOVWF trisa
; seleccionamos banco 1 de registros
; ponemos trisb a 0, puerta B como salidas
;ponemos a como entradas
En las dos instrucciones que siguen, le asignamos al registro OPTION el valor d7h
que hace que le asignemos al TIMER 0 los impulsos procedentes del reloj interno, con un
valor del divisor de frecuencia 1:256.
MOVLW 0xd7
MOVWF opcion
banco0
CLRF portb
;asignamos el valor al temporizador interno
;y el divisor de frecuencia 1:256 cargando el
; registro OPTION
;seleccionamos banco 0
Pedro Guerrero Amado.Marzo 2002
Las instrucciones que viene a continuación son las mismas que las de la práctica 6
lo único que cambia es la rutina de retardo que veremos a continuación
principal
CLRF portb
CALL retardo
MOVLW 0X0
MOVWF indice
; ponemos todas las salidas a 0
buc_tab
CALL tabla_1
MOVWF portb
CALL retardo
MOVLW 0x9 ;
XORWF indice,w
BTFSS status, 2
GOTO incrementa
MOVLW 0x00
MOVWF indice
GOTO buc_tab
; llamada a la subrutina
; sacamos a B el valor devuelto
; por la tabla
incrementa
INCf indice,f
MOVF indice,w
GOTO buc_tab
;comparamos el indice con 9
;vemos si es 0 el bit 2 de status
;si no es cero vamos a incrementar
;si es cero, inicializamos indice
;repetimos
;incrementamos el indice
;lo pasamos a W
;volvemos a tabla
Para realizar un retardo de 1 sg que es lo que hace esta rutina procedemos de la
siguiente manera:
En primer lugar ya le hemos asignado previamente al divisor de frecuencia el valor
1:256 (bits PSA0:PSA3).
Para tener un retardo de 50ms debemos cargar en el TIMER 0 el valor en
complemento a 2 de 196 (3ch).
Luego repetimos este bucle 20 veces(14h) y obtenemos un segundo de retardo.
Todo esto es lo que hacemos en las instrucciones que siguen que están comentadas.
retardo
MOVLW 0x14
;Movemos 14h(20d) al registro W y
MOVWF cont1
;se lo cargamos al contador
t_5
MOVLW 0x3c
;Movemos 3ch al timer0.Esto es el complemento a 2
; de 196.
MOVWF tm0
;ya que el timer0 es un contador ascendente.
t_05
MOVF tm0, w
;Movemos el valor del timer0 a W
BTFSS status,2
;Vemos si el timer a llegado a 0
GOTO t_05
;si no ha llegado a 0 repetimos
DECFSZ cont1,f
;Decrementamos el cont1 y repetimos la rutina
GOTO t_5
;si no hemos alcanzado el valor 0
RETURN
Pedro Guerrero Amado.Marzo 2002
;tabla que enciende el display del 1 al 9
tabla_1
ADDWF pc ,f
RETLW 0x3f
RETLW 0x06
RETLW 0x5b
RETLW 0x4f
RETLW 0x66
RETLW 0x6d
RETLW 0x7d
RETLW 0x07
RETLW 0x7f
RETLW 0x67
END
Descargar