practica nº 8

Anuncio
Pedro Guerrero Amado.Marzo 2002
PRACTICA 8
SECUENCIA DE ENCENDIDO DE DIODOS LEDS
USANDO DOS TABLAS
DESCRIPCIÓN.
En esta práctica usaremos el encendido alternativo de diodos leds usando dos
tablas y un interruptor.
El interruptor seleccionará la secuencia que queremos poner según esté
activado o desactivado, es decir, trabajaremos con una tabla o con otra.
PROGRAMA FUENTE.
Las primeras instrucciones ya son conocidas.
LIST P=PIC16F84
LIST C=132
#DEFINE banco1 bsf 0x03,5
#DEFINE banco0 bcf 0x03,5
;DECLARACION REGISTROS Y VARIABLES
include <registr.h>
cont1
cont2
uno
indice
EQU 0xc
EQU 0dh
EQU 0xe
EQU 0x0f
ORG 0
GOTO inicio ; salvamos el vector de interrupción
ORG 5
inicio banco1
; seleccionamos banco 1 de registros
CLRF trisb ; ponemos trisb a 0, puerta B como salidas
MOVLW 0x1f
MOVWF trisa
;ponemos a como entradas
banco0
; seleccionamos banco 0
En estas instrucciones, ponemos a cero las salidas, llamados a la rutina de retardo, y
le movemos 0 a la variable índice, que será el índice de la tabla.
principal
CLRF portb ; ponemos todas las salidas a 0
CALL retardos
MOVLW 0X0
MOVWF indice
Pedro Guerrero Amado.Marzo 2002
En primer lugar comprobamos el valor del bit 0 de la puerta A. Si el es 0, no salta y
ejecuta GOTO unos y llamamos a la tabla_1, si es 1 entonces salta y llamamos a tabla. A
continuación sacamos a la puerta B el valor devuelto que lo tendremos en W. Después de
un retardo cargamos el registro W con el valor 8. Una vez echo esto comparamos el valor
de W con el índice con la instrucción XORWF (que activa el flag Z). Si el resultado de la
operación es cero (índice es igual a 8) entonces el flag Z se pone a 1, que es lo que
preguntamos nosotros a continuación, si el bit 2 del registro de ESTADO es 1 (flag Z). Si
es así (índice=8, Z=1) entonces inicializamos el índice con las instrucciones que vienen a
continuación, si no saltamos a incrementa y le sumamos 1 a índice y lo movemos a W que
es el que usamos en la rutina de carga del dato de la tabla.
buc_tab
unos
dos
incrementa
BTFSS porta, 0
GOTO unos
CALL tabla
GOTO dos
CALL tabla_1
MOVWF portb
CALL retardos
MOVLW 0x8 ;
XORWF indice,w
BTFSS status, 2
GOTO incrementa
MOVLW 0x00
MOVWF indice
GOTO buc_tab
INCf indice,f
MOVF indice,w
GOTO buc_tab
;comprobamos el bit 0 de la puerta a
;según el valor que tenga cogemos una tabla u otra
; llamada a la subrutina
; sacamos a B el valor devuelto
; por la tabla
;comparamos el índice con 8
;vemos si es 0 el bit 2 de status
;si no es cero vamos a incrementar
;si es cero, inicializamos índice
;repetimos
;incrementamos el índice
;lo pasamos a W
; volvemos a tabla
Las tablas que viene a continuación son las que vimos en la práctica 6 y ya vimos
como funcionaban.
; tabla que enciende en binario los leds de 1 al 9
tabla
ADDWF pc ,f ; le sumamos al PC el contenido de
RETLW 1
; indice y retormamos segun el valor
RETLW 2
RETLW 3
RETLW 4
RETLW 5
RETLW 6
RETLW 7
RETLW 8
RETLW 9
Pedro Guerrero Amado.Marzo 2002
;tabla que enciende el display del 1 al 9
tabla_1
ADDWF pc ,f
RETLW 0x06
RETLW 0x5b
RETLW 0x4f
RETLW 0x66
RETLW 0x6d
RETLW 0x7d
RETLW 0x07
RETLW 0x7f
RETLW 0x67
;
RUTINA DE RETARDO DE APROXIMADAMENTE 0.2sg * valor de uno
retardos
bucle
MOVLW 0xff
MOVWF cont1
MOVWF cont2
MOVLW 0x5 ;
MOVWF uno
DECFSZ cont1,f
GOTO bucle
DECFSZ cont2,f
GOTO bucle ;
DECFSZ uno,f
GOTO bucle
RETURN
END
;MOVEMOS FF A W Y cargamos
;cont1 y cont2 con ff
;
;igual
;decrementamos cont1, si es 0 saltamos
;sino volvemos a bucles
;igual pero con cont2
Descargar