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
yPORTD
se configuran como salidas. - Los pines
RC0
aRC2
delPORTC
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
conpiso_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 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.
- Establece el estado de movimiento a