01 Ago
Fundamentos de Programación PIC16F84: Ejemplos Prácticos
Este documento detalla diversas configuraciones y programaciones básicas para el microcontrolador PIC16F84, abarcando desde la configuración de puertos hasta el control de LEDs y displays de 7 segmentos. Cada sección describe una tarea específica con sus comandos y explicaciones.
Tarea 3: Configuración del Puerto A y Control de LED
Esta sección describe la configuración inicial del microcontrolador y el control básico de un LED a través del Puerto A.
Definición de Constantes y Configuración Inicial
list p=16F84
: Especifica el uso del microcontrolador PIC16F84.radix hex
: Indica que los valores numéricos se interpretarán en formato hexadecimal.- Se definen constantes (
equ
) para los registros clave:status (03h)
: Registro de estado.portA (05h)
: Puerto A.trisA (85h)
: Registro TRISA, que configura los pines del Puerto A como entrada (1) o salida (0).
Configuración del Puerto A como Salida
org 00h
: Indica que el programa comienza en la dirección de memoria00h
.bsf status,5
: Activa el bit 5 del registro STATUS para acceder al Banco 1, donde se configura TRISA.movlw 00h
: Carga el valor00h
en el registro de trabajo W, configurando todos los pines del Puerto A como salidas.movwf trisA
: Copia el valor de W a TRISA, estableciendo el Puerto A como salida.bcf status,5
: Borra el bit 5 del registro STATUS, regresando al Banco 0 para acceder a PORTA.
Encendido de un LED en PORTA
bsf portA,0
: Activa el bit 0 del Puerto A, lo que enciende un LED conectado a ese pin.
Tarea 3.2: Control de LEDs con Botones (Entrada/Salida)
Esta tarea ilustra cómo configurar y utilizar los puertos A y B para interactuar con botones (entrada) y LEDs (salida).
Configuración de Pines
- PORTA (entrada): Se conectan los botones.
- PORTB (salida): Se conectan los LEDs.
Configuración Inicial de Puertos
- Se activa el Banco 1 para configurar los registros TRISA y TRISB.
TRISA = 1Fh
: Los primeros 5 pines de PORTA se configuran como entradas (para los botones).TRISB = 00h
: Todos los pines de PORTB se configuran como salidas (para los LEDs).- Se regresa al Banco 0 para operar directamente con los puertos.
Bucle Principal de Operación
- El programa lee continuamente el estado de los botones conectados a PORTA.
- El estado leído se copia directamente a PORTB, encendiendo los LEDs correspondientes según los botones presionados.
Tarea 4: Parpadeo de LED con Retardo
Esta sección detalla la implementación de un LED parpadeante utilizando una subrutina de retardo.
Configuración Inicial
- Se configura PORTB como salida, donde se conecta el LED.
Bucle Principal (FIME
)
bsf PORTB,0
: Enciende el LED conectado al bit 0 de PORTB.call ret
: Llama a la subrutina de retardo, manteniendo el LED encendido por un tiempo determinado.bcf PORTB,0
: Apaga el LED.call ret
: Llama nuevamente a la subrutina de retardo, manteniendo el LED apagado por el mismo tiempo.goto FIME
: Repite el ciclo infinitamente, creando el efecto de parpadeo.
Subrutina de Retardo (ret
)
- Carga un valor en un registro (ej.
reg1
) para iniciar un bucle de espera. - Decrementa
reg1
repetidamente hasta que llega a cero, generando un retraso antes de devolver el control al programa principal.
Tarea 5: Visualización de un Número en Display de 7 Segmentos
Esta tarea explica cómo mostrar un número específico en un display de 7 segmentos utilizando una tabla de búsqueda.
Configuración Inicial
clrf TrisB
: Se configura PORTB como salida, ya que a este puerto se conecta el display de 7 segmentos.
Carga y Visualización de un Número
movlw 02
: Carga el número2
en el registro de trabajo W.call tablavalue
: Llama a la subrutinatablavalue
, que es una tabla de búsqueda para encontrar el patrón de segmentos correspondiente al número cargado.
Tabla de Valores (tablavalue
)
- Utiliza la instrucción
addwf PCL,F
para seleccionar el valor correcto de la tabla basándose en el contenido de W. - La tabla contiene los patrones de bits (códigos BCD) para los números del 0 al 9, diseñados para un display de 7 segmentos de cátodo común.
retlw
: Devuelve el valor del patrón de segmentos al programa principal.
Muestra del Número en PORTB
movwf portB
: Envía el patrón de segmentos obtenido de la tabla al PORTB, lo que enciende los segmentos adecuados para mostrar el número2
en el display.- Nota: Cambiando el valor en
movlw
(por ejemplo,movlw 05
), se puede mostrar cualquier número del 0 al 9 en el display.
Tarea 6: Contador Ascendente en Display de 7 Segmentos
Esta sección describe la implementación de un contador que muestra números del 0 al 9 de forma ascendente en un display de 7 segmentos.
Configuración Inicial (INICIO
)
CLRF TRISB
: Se configura PORTB como salida.- Se limpia PORTB para asegurar que el display comience apagado.
- Se inicializa un contador (
COUNT
) en 0.
Bucle Principal (LOOP
)
- El valor de
COUNT
se utiliza como índice para obtener el patrón de segmentos correspondiente de la tabla de números (TABLAVALUE
). - El patrón obtenido se envía a PORTB para que el display de 7 segmentos muestre el número actual.
- Se llama a una subrutina de retardo (
RETARDO
) para que cada número sea visible durante un tiempo determinado. COUNT
se incrementa. Si alcanza9
, se reinicia a0
, y el ciclo se repite.
Subrutina de Retardo (RETARDO
)
- Utiliza dos registros (
TEMP1
yTEMP2
) para generar un retardo visible entre la visualización de cada número.
Tabla de Valores (TABLAVALUE
)
- Contiene los códigos BCD de los números 0-9, optimizados para un display de 7 segmentos de cátodo común.
- La instrucción
ADDWF PCL,F
selecciona el valor correcto de la tabla según el valor deCOUNT
.
Tarea 7: Contador Descendente en Display de 7 Segmentos
Esta tarea implementa un contador que muestra números del 9 al 0 de forma descendente en un display de 7 segmentos, con retardos entre cada cambio.
Variables y Configuración Inicial
portB
: Los valores se envían a los pines del Puerto B para controlar los segmentos del display de 7 segmentos.trisB
: Configura el Puerto B como salida, esencial para el control del display.TIEMPO
yTIEMPO2
: Variables utilizadas para generar retardos entre cada cambio de número en el display.org 00h
: El programa comienza su ejecución en la dirección de memoria00h
.clrf trisB
: Configura todos los pines del Puerto B como salida.
Secuencia de Conteo Descendente
El programa carga secuencialmente valores hexadecimales en portB
para mostrar los números del 9 al 0. Cada valor representa un patrón de segmentos específico para el display:
67h
: Representa el número 9.7Fh
: Representa el número 8.07h
: Representa el número 7.- …y así sucesivamente hasta el 0.
Después de cargar cada valor en portB
, se llama a la subrutina RETARDO
. Esto asegura que cada número permanezca visible por un tiempo antes de que el siguiente sea mostrado, haciendo el conteo perceptible.
Subrutina de Retardo (RETARDO
)
- Esta subrutina es crucial para generar el tiempo de espera entre cada cambio de número.
movlw 0Ah
: Carga el valor10
(decimal) en el registro WREG, que sirve como base para los bucles de retardo.decfsz TIEMPO
: Decrementa el valor en la variableTIEMPO
. SiTIEMPO
llega a cero, el programa salta a la siguiente instrucción; de lo contrario, repite el bucle.decfsz TIEMPO2
: Se utiliza un segundo bucle anidado conTIEMPO2
para asegurar que el retardo total sea lo suficientemente largo y visible.
Reiniciar el Conteo
Una vez que todos los números del 9 al 0 han sido mostrados, la instrucción goto INICIO
(asumiendo que INICIO
es la etiqueta al principio del ciclo de conteo) reinicia el proceso, haciendo que el ciclo de conteo descendente se repita indefinidamente.
Deja un comentario