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