Programación en Ensamblador para Control de Elevador con PIC16F877A

Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 6,69 KB

Configuración Inicial del Microcontrolador PIC16F877A

Directivas de Configuración del PIC

LIST P=16F877A
#include <P16F877A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_ON & _LVP_OFF

Explicación

  • Define el microcontrolador PIC16F877A en uso.
  • Incluye la librería con las definiciones específicas del PIC.
  • Configura el sistema de la siguiente manera:
    • _CP_OFF: Desactiva la protección de código.
    • _WDT_OFF: Desactiva el Watchdog Timer (WDT).
    • _XT_OSC: Utiliza un oscilador externo tipo cristal.
    • _PWRTE_ON: Habilita el temporizador de encendido (Power-up Timer Enable).
    • _LVP_OFF: Desactiva la programación de bajo voltaje (Low Voltage Programming).

Declaración de Variables en RAM

Bloque de Variables CBLOCK

CBLOCK 0x20
    piso_actual
    piso_deseado
    diferencia
    estado_mov
    temp
    temp1
    temp2
ENDC

Explicación

Declara variables en la memoria RAM a partir de la dirección 0x20. Estas variables se utilizan para controlar el estado del elevador:

  • piso_actual: Indica el piso actual del elevador.
  • piso_deseado: Almacena el piso al que se desea ir.
  • diferencia: Variable no utilizada en este contexto, pero comúnmente empleada para cálculos de diferencia.
  • estado_mov: Indica el estado de movimiento: 0 (en piso), 1 (subiendo), 2 (bajando).
  • temp, temp1, temp2: Variables temporales utilizadas para retardos o cálculos auxiliares.

Punto de Inicio del Programa

Vector de Reset

ORG 0x00
GOTO MAIN

Explicación

Al encenderse el PIC, el programa salta directamente a la rutina principal MAIN.

Rutinas Auxiliares

Rutina de Retardo: DELAY_MS

DELAY_MS
    MOVWF temp1
LOOP_MS1
    MOVLW .250
    MOVWF temp2
LOOP_MS2
    NOP
    NOP
    DECFSZ temp2, f
    GOTO LOOP_MS2
    DECFSZ temp1, f
    GOTO LOOP_MS1
    RETURN

Explicación

Implementa un retardo básico (con precisión limitada) utilizando dos bucles anidados con instrucciones NOP (No Operation) para generar el retardo.

Funciones de Control del LCD

LCD_INIT, LCD_COMMAND, LCD_CHAR, LCD_PULSE

Explicación

  • LCD_INIT: Envía comandos de inicialización al LCD para configurarlo (ej. modo de 8 bits, control de cursor).
  • LCD_COMMAND: Envía una instrucción específica al LCD (ej. mover el cursor, limpiar la pantalla).
  • LCD_CHAR: Envía un carácter (letra o símbolo) para su visualización en el LCD.
  • LCD_PULSE: Genera un pulso de habilitación para que el LCD lea el dato o comando previamente enviado.

Rutina de Visualización por LEDs: MOSTRAR_LED

MOSTRAR_LED
    MOVWF PORTA
    RETURN

Explicación

Muestra el piso actual mediante LEDs conectados al PORTA (por ejemplo: piso 1 se representa con el LED1 encendido).

Rutina de Visualización en LCD: MOSTRAR_LCD

MOSTRAR_LCD

Explicación

Muestra en el LCD el piso actual, con un formato como PISO: 0, PISO: 1, etc., según el valor de piso_actual.

Rutina de Actualización Completa: MOSTRAR_TODO

MOSTRAR_TODO

Explicación

Invoca a las rutinas MOSTRAR_LED y MOSTRAR_LCD. Posteriormente, imprime en la segunda línea del LCD el estado de movimiento:

  • EN PISO
  • SUBIENDO
  • BAJANDO

El estado se determina revisando el valor de la variable estado_mov.

Rutina Principal del Programa: MAIN

Configuración Inicial

Configuración de Puertos I/O

CLRF TRISA, TRISB, TRISD
MOVLW 0x07
MOVWF TRISC   ; RC0-RC2 como entradas (botones)
  • Los puertos PORTA, PORTB y PORTD se configuran como salidas.
  • Los pines RC0 a RC2 del PORTC se configuran como entradas para los botones de selección de piso.

Inicialización de Puertos a Cero

CLRF PORTA, PORTB, PORTC, PORTD

Inicialización de Variables

CLRF piso_actual
CLRF estado_mov

Inicialización del LCD

CALL LCD_INIT

Bucle Principal de Operación: LOOP

  • Lee el estado de los botones conectados a PORTC (RC0, RC1, RC2).
  • Detecta cuál botón ha sido presionado.
  • Almacena el piso deseado en función del botón activado.
  • Compara el valor de piso_actual con piso_deseado:
    • Si son iguales: Salta a EN_PISO.
    • Si el actual es menor: Salta a SUBIR.
    • Si el actual es mayor: Salta a BAJAR.

Rutinas de Control de Movimiento del Elevador

Rutina SUBIR

SUBIR
    MOVLW 1
    MOVWF estado_mov
    CALL MOSTRAR_TODO
    INCF piso_actual, f
    CALL DELAY_MS
    GOTO LOOP

Explicación

  • Establece el estado de movimiento a 1 (subiendo).
  • Incrementa el valor de piso_actual.
  • Actualiza la visualización del estado en el LCD y los LEDs.
  • Genera un retardo y repite el ciclo principal.

Rutina BAJAR

BAJAR
    MOVLW 2
    MOVWF estado_mov
    CALL MOSTRAR_TODO
    DECF piso_actual, f
    CALL DELAY_MS
    GOTO LOOP

Explicación

  • Establece el estado de movimiento a 2 (bajando).
  • Decrementa el valor de piso_actual.
  • Actualiza la visualización del estado.
  • Genera un retardo y repite el ciclo principal.

Rutina EN_PISO

EN_PISO
    CLRF estado_mov
    CALL MOSTRAR_TODO
    GOTO LOOP

Explicación

  • Si el elevador ya se encuentra en el piso deseado:
    • Establece el estado de movimiento a 0 (detenido).
    • Muestra el mensaje "EN PISO" en el LCD.
    • Espera por una nueva instrucción o selección de piso.

Entradas relacionadas: