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_OFFExplicació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
ENDCExplicació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 MAINExplicació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
RETURNExplicació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_PULSEExplicació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
RETURNExplicació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_LCDExplicació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_TODOExplicación
Invoca a las rutinas MOSTRAR_LED y MOSTRAR_LCD. Posteriormente, imprime en la segunda línea del LCD el estado de movimiento:
EN PISOSUBIENDOBAJANDO
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,PORTByPORTDse configuran como salidas. - Los pines
RC0aRC2delPORTCse configuran como entradas para los botones de selección de piso.
Inicialización de Puertos a Cero
CLRF PORTA, PORTB, PORTC, PORTDInicialización de Variables
CLRF piso_actual
CLRF estado_movInicialización del LCD
CALL LCD_INITBucle 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_actualconpiso_deseado:- Si son iguales: Salta a
EN_PISO. - Si el actual es menor: Salta a
SUBIR. - Si el actual es mayor: Salta a
BAJAR.
- Si son iguales: Salta a
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 LOOPExplicació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 LOOPExplicació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 LOOPExplicació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.
- Establece el estado de movimiento a