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 memoria 00h.
  • bsf status,5: Activa el bit 5 del registro STATUS para acceder al Banco 1, donde se configura TRISA.
  • movlw 00h: Carga el valor 00h 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úmero 2 en el registro de trabajo W.
  • call tablavalue: Llama a la subrutina tablavalue, 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úmero 2 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 alcanza 9, se reinicia a 0, y el ciclo se repite.

Subrutina de Retardo (RETARDO)

  • Utiliza dos registros (TEMP1 y TEMP2) 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 de COUNT.

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 y TIEMPO2: 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 memoria 00h.
  • 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 valor 10 (decimal) en el registro WREG, que sirve como base para los bucles de retardo.
  • decfsz TIEMPO: Decrementa el valor en la variable TIEMPO. Si TIEMPO 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 con TIEMPO2 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