Está en la página 1de 11

;

; | | | | | | | | | | | |
; _|__|__|__|__|__|__|__|__|__|__|__|_ _\\|//_ Jose
; | | (| o-o |) Martinez
; | WWW.DISELC.ES | \ (_) / Ortiz
; |) | \_"_/
; | Ascensor de 5 plantas | __|U|__
; | | / \
; |_ __ __ __ __ __ __ __ __ __ __ __ _| / /| |\ \
; | | | | | | | | | | | | //| |\\
; | | | | | | | | | | | | "" |___| ""
;
;con el pic 16f84A solo disponia de pines para controlar 5 plantas, pero
;utilizando elmicrocontrolador 16f628 podemos controlar 7 plantas utilizando
;su reloj interno.

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC


LIST P=16f84A ;Procesador utilizado.
INCLUDE <P16F84A.INC>

;codigo de proteccion no;perro guardian no;reset inicio si;oscilador a cristal

;******************************** igualdades
********************************

;tanto las salidas como las entradas se consideran que estan activadas cuando
;se encuentran en estado logico bajo

;RA0 entrada y salida de cabina de 5 planta


;RA1 salida de bajada, dispara por positivo
;RA2 salida de subida, dispara por positivo
;RA3 entrada y salida del pulsador de llamada de 5 planta
;RA4 entrada y salida del pulsador de llamada de 4 planta

;RB0 entrada y salida del pulsador de llamada de 3 planta


;RB1 entrada y salida del pulsador de llamada de 2 planta
;RB2 entrada y salida del pulsador de llamada de 1 planta
;RB3 entrada de puerta de cabina
;RB4 entrada y salida de cabina de 1 planta
;RB5 entrada y salida de cabina de 2 planta
;RB6 entrada y salida de cabina de 3 planta
;RB7 entrada y salida de cabina de 4 planta

;****************************** ZONA DE DATOS


****************************

LIST P=16f84a ;Procesador utilizado.


RADIX hex ;trabajo en numeracion hexadecimal
;***************************** MAPA DE MEMORIA
****************************

status equ 0x03


trisa equ 0x05
porta equ 0x05
trisb equ 0x06
portb equ 0x06
reg1 equ 0x0c
reg2 equ 0x0d
reg3 equ 0x0e
reg4 equ 0x0f

;******************************** inicio
**********************************

reset org 0x00 ;El programa comienza en la direccin 0.


goto inicio ;pasa a la posicion de inicio para evitar la int.
;que se encuentra en la posicion 4

inicio bsf status,5 ;Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.

movlw b'11001' ;3 entradas y dos salida del puerto a.


movwf trisa
movlw b'11111111' ;el puerto b esta como entradas
movwf trisb
bcf status,5 ;Acceso al Banco 0.

bcf porta,1 ;paro el motor hacia abajo


bcf porta,2 ;paro el motor hacia arriba

principio nop

call pulsadores ;compueba si hay algun pulsador dado, asi como la posicion
;de la cabina

cs call coincide ;aqui para el motor si la cabina coincide con la llamada y


;espera 5 seg chequeando los pulsadores
call subida ;comprueba todas las combinaciones posibles para activar el
;motor en direccion ascendente
call pulsadores

btfsc porta,2 ;si el motor esta subiendo, ejecuta la siguiente instruccion


goto cs
cb call coincide
call bajada ;comprueba todas las combinaciones posibles para activar el
;motor en direccion descendente
call pulsadores
btfsc porta,1 ;si el motor esta bajando, ejecuta la siguiente instruccion
goto cb

goto principio

;
**********************************************************************
********
;************************** RUTINA DE SUBIDA
***************************
;
**********************************************************************
********

;aqui solo conectamos el motor en sentido ascendente teniendo en cuenta la


;posicion donde esta la cabina y las llamadas que hay realizadas

subida nop

sube2 btfsc portb,1 ;si esta activada la llamada2 salta la siguiente linea
goto sube3 ;comprueba sube3

btfss portb,4 ;si la cabina esta en la 1 planta ejecuta la


;siguiente linea
bsf porta,2 ;activa la subida

sube3 btfsc portb,0 ;si esta activada la llamada3 salta la siguiente linea
goto sube4 ;comprueba sube4

btfss portb,4 ;si la cabina esta en la 1 planta ejecuta la


;siguiente linea
bsf porta,2 ;activa la subida

btfss portb,5 ;si la cabina esta en la 2 planta ejecuta la


;siguiente linea
bsf porta,2 ;activa la subida

sube4 btfsc porta,4 ;si esta activada la llamada4 salta la siguiente linea
goto sube5 ;comprueba sube5

btfss portb,4 ;si la cabina esta en la 1 planta ejecuta la


;siguiente linea
bsf porta,2 ;activa la subida
btfss portb,5 ;si la cabina esta en la 2 planta ejecuta la
;siguiente linea
bsf porta,2 ;activa la subida

btfss portb,6 ;si la cabina esta en la 3 planta ejecuta la


;siguiente linea
bsf porta,2 ;activa la subida

sube5 btfsc porta,3 ;si esta activada la llamada5 salta la siguiente linea
goto subefin ;va al final de esta rutina

btfss portb,4 ;si la cabina esta en la 1 planta ejecuta la


;siguiente linea
bsf porta,2 ;activa la subida

btfss portb,5 ;si la cabina esta en la 2 planta ejecuta la


;siguiente linea
bsf porta,2 ;activa la subida

btfss portb,6 ;si la cabina esta en la 3 planta ejecuta la


;siguiente linea
bsf porta,2 ;activa la subida

btfss portb,7 ;si la cabina esta en la 4 planta ejecuta la


;siguiente linea
bsf porta,2 ;activa la subida

subefin nop

return ; vuelvo donde se hizo la llamada

;
**********************************************************************
********
;************************** RUTINA DE BAJADA
***************************
;
**********************************************************************
********

;aqui solo conectamos el motor en sentido descendente teniendo en cuenta la


;posicion donde esta la cabina y las llamadas que hay realizadas

bajada nop

baja4 btfsc porta,4 ;si esta activada la llamada4 salta la siguiente linea
goto baja3 ;comprueba baja3
btfss porta,0 ;si la cabina esta en la 5 planta ejecuta la
;siguiente linea
bsf porta,1 ;activa la bajada

baja3 btfsc portb,0 ;si esta activada la llamada3 salta la siguiente linea
goto baja2 ;comprueba baja2

btfss portb,7 ;si la cabina esta en la 4 planta ejecuta la


;siguiente linea
bsf porta,1 ;activa la bajada

btfss porta,0 ;si la cabina esta en la 5 planta ejecuta la


;siguiente linea
bsf porta,1 ;activa la bajada

baja2 btfsc portb,1 ;si esta activada la llamada2 salta la siguiente linea
goto baja1 ;comprueba baja1

btfss portb,6 ;si la cabina esta en la 3 planta ejecuta la


;siguiente linea
bsf porta,1 ;activa la bajada

btfss portb,7 ;si la cabina esta en la 4 planta ejecuta la


;siguiente linea
bsf porta,1 ;activa la bajada

btfss porta,0 ;si la cabina esta en la 5 planta ejecuta la


;siguiente linea
bsf porta,1 ;activa la bajada

baja1 btfsc portb,2 ;si esta activada la llamada4 salta la siguiente linea
goto bajafin ;va al final de esta rutina

btfss portb,5 ;si la cabina esta en la 2 planta ejecuta la


;siguiente linea
bsf porta,1 ;activa la bajada

btfss portb,6 ;si la cabina esta en la 3 planta ejecuta la


;siguiente linea
bsf porta,1 ;activa la bajada

btfss portb,7 ;si la cabina esta en la 4 planta ejecuta la


;siguiente linea
bsf porta,1 ;activa la bajada

btfss porta,0 ;si la cabina esta en la 5 planta ejecuta la


;siguiente linea
bsf porta,1 ;activa la bajada
bajafin nop

return ; vuelvo donde se hizo la llamada

;
**********************************************************************
********
;************************** RUTINA DE PULSADORES
***************************
;
**********************************************************************
********

;enciendo y apago los led de posicion de la cabina


;compruebo la posicion de la cabina, pasandola a salida, y la posicion de la
;cabina inferior y superior mas inmediata la pongo como entrada

;vamos a un bucle, para hacer tiempo para que la carga de los condensadores
;de filtro se estabilice

;enciendo los led de llamada

pulsadores nop

;*********** enciendo y apago los led de posicion de la cabina ************

cabina1 btfsc portb,4 ;si la cabina esta en el 1 salto la siguiente linea


goto cabina2 ;si no voy a cabina2
bsf status,5 ;acceso al banco 1
bcf trisb,4 ;configuro cabina 1 como salida - enciende el led
bsf trisb,5 ;configuro cabina 2 como entrada
bcf status,5 ;acceso al banco 0
bcf portb,4 ;ahora enciendo el led
call condensador ;hago tiempo para estabilizar los condensadores

cabina2 btfsc portb,5 ;si la cabina esta en el 2 salto la siguiente linea


goto cabina3 ;si no voy a cabina3
bsf status,5 ;acceso al banco 1
bcf trisb,5 ;configuro cabina 1 como salida - enciende el led
bsf trisb,4 ;configuro cabina 1 como entrada
bsf trisb,6 ;configuro cabina 3 como entrada
bcf status,5 ;acceso al banco 0
bcf portb,5 ;ahora enciendo el led
call condensador ;hago tiempo para estabilizar los condensadores
cabina3 btfsc portb,6 ;si la cabina esta en el 3 salto la siguiente linea
goto cabina4 ;si no voy a cabina4
bsf status,5 ;acceso al banco 1
bcf trisb,6 ;configuro cabina 3 como salida - enciende el led
bsf trisb,5 ;configuro cabina 2 como entrada
bsf trisb,7 ;configuro cabina 4 como entrada
bcf status,5 ;acceso al banco 0
bcf portb,6 ;ahora enciendo el led
call condensador ;hago tiempo para estabilizar los condensadores

cabina4 btfsc portb,7 ;si la cabina esta en el 4 salto la siguiente linea


goto cabina5 ;si no voy a cabina5
bsf status,5 ;acceso al banco 1
bcf trisb,7 ;configuro cabina 4 como salida - enciende el led
bsf trisb,6 ;configuro cabina 3 como entrada
bsf trisa,0 ;configuro cabina 5 como entrada
bcf status,5 ;acceso al banco 0
bcf portb,7 ;ahora enciendo el led
call condensador ;hago tiempo para estabilizar los condensadores

cabina5 btfsc porta,0 ;si la cabina esta en el 5 salto la siguiente linea


goto cabinafin ;si no voy a cabinafin
bsf status,5 ;acceso al banco 1
bcf trisa,0 ;configuro cabina 5 como salida - enciende el led
bsf trisb,7 ;configuro cabina 4 como entrada
bcf status,5 ;acceso al banco 0
bcf porta,0 ;ahora enciendo el led
call condensador ;hago tiempo para estabilizar los condensadores

cabinafin nop

;************** enciendo el led de los pulsadores de llamada **************

llama1 btfsc portb,2 ;si llama1 esta pulsado me salto la siguiente linea
goto llama2 ;si no voy a llama2
bsf status,5 ;acceso al banco 1
bcf trisb,2 ;configuro llama 1 como salida - enciende el led
bcf status,5 ;acceso al banco 0

bcf portb,2 ;ahora enciendo el led

llama2 btfsc portb,1 ;si llama2 esta pulsado me salto la siguiente linea
goto llama3 ;si no voy a llama3
bsf status,5 ;acceso al banco 1
bcf trisb,1 ;configuro llama 2 como salida - enciende el led
bcf status,5 ;acceso al banco 0

bcf portb,1 ;ahora enciendo el led


llama3 btfsc portb,0 ;si llama3 esta pulsado me salto la siguiente linea
goto llama4 ;si no voy a llama4
bsf status,5 ;acceso al banco 1
bcf trisb,0 ;configuro llama 3 como salida - enciende el led
bcf status,5 ;acceso al banco 0

bcf portb,0 ;ahora enciendo el led

llama4 btfsc porta,4 ;si llama4 esta pulsado me salto la siguiente linea
goto llama5 ;si no voy a llama5
bsf status,5 ;acceso al banco 1
bcf trisa,4 ;configuro llama 4 como salida - enciende el led
bcf status,5 ;acceso al banco 0

bcf porta,4 ;ahora enciendo el led

llama5 btfsc porta,3 ;si llama5 esta pulsado me salto la siguiente linea
goto llamafin ;si no voy a llamafin
bsf status,5 ;acceso al banco 1
bcf trisa,3 ;configuro llama 5 como salida - enciende el led
bcf status,5 ;acceso al banco 0

bcf porta,3 ;ahora enciendo el led

llamafin nop

call condensador ;hago tiempo para estabilizar los condensadores

return ;vuelvo donde se hizo la llamada

;
**********************************************************************
********
;************************** RUTINA DE COINCIDE
***************************
;
**********************************************************************
********

;si la cabina esta en la misma planta que esta pulsada:


;apaga el led de llamada, configurandolo como entrada
;para el motor tanto en sentido ascendente como descendente
;se detiene 5 segundos comprobando los pulsadores

coincide nop

llamada1 btfsc portb,2 ;si llamada1 esta pulsada salto la siguiente linea
goto llamada2 ;si no voy a llamada2
btfsc portb,4 ;si la cabina esta el la 1 planta salto una linea
goto llamada2 ;si no salta a llamada2

bsf status,5 ;acceso al banco 1


bsf trisb,2 ;pulsador de 1 planta como entrada
bcf status,5 ;acceso al banco 0

bcf porta,1 ;desconecta el motor en sentido descendente


bcf porta,2 ;desconecta el motor en sentido ascendente
call bucle5 ;espera 5 seg comprobando los pulsadores

llamada2 btfsc portb,1 ;si llamada2 esta pulsada salto la siguiente linea
goto llamada3 ;si no voy a llamada3

btfsc portb,5 ;si la cabina esta el la 2 planta salto una linea


goto llamada3 ;si no salta a llamada3

bsf status,5 ;acceso al banco 1


bsf trisb,1 ;pulsador de 2 planta como entrada
bcf status,5 ;acceso al banco 0

bcf porta,1 ;desconecta el motor en sentido descendente


bcf porta,2 ;desconecta el motor en sentido ascendente
call bucle5 ;espera 5 seg comprobando los pulsadores

llamada3 btfsc portb,0 ;si llamada3 esta pulsada salto la siguiente linea
goto llamada4 ;si no voy a llamada4

btfsc portb,6 ;si la cabina esta el la 3 planta salto una linea


goto llamada4 ;si no salta a llamada4

bsf status,5 ;acceso al banco 1


bsf trisb,0 ;pulsador de 3 planta como entrada
bcf status,5 ;acceso al banco 0

bcf porta,1 ;desconecta el motor en sentido descendente


bcf porta,2 ;desconecta el motor en sentido ascendente
call bucle5 ;espera 5 seg comprobando los pulsadores

llamada4 btfsc porta,4 ;si llamada4 esta pulsada salto la siguiente linea
goto llamada5 ;si no voy a llamada5

btfsc portb,7 ;si la cabina esta el la 4 planta salto una linea


goto llamada5 ;si no salta a llamada5
bsf status,5 ;acceso al banco 1
bsf trisa,4 ;pulsador de 4 planta como entrada
bcf status,5 ;acceso al banco 0

bcf porta,1 ;desconecta el motor en sentido descendente


bcf porta,2 ;desconecta el motor en sentido ascendente
call bucle5 ;espera 5 seg comprobando los pulsadores

llamada5 btfsc porta,3 ;si llamada5 esta pulsada salto la siguiente linea
goto llamadafin ;si no voy a llamadafin

btfsc porta,0 ;si la cabina esta el la 5 planta salto una linea


goto llamadafin ;si no salta a llamadafin

bsf status,5 ;acceso al banco 1


bsf trisa,3 ;pulsador de 5 planta como entrada
bcf status,5 ;acceso al banco 0

bcf porta,1 ;desconecta el motor en sentido descendente


bcf porta,2 ;desconecta el motor en sentido ascendente
call bucle5 ;espera 5 seg comprobando los pulsadores

llamadafin nop
return ; vuelvo donde se hizo la llamada

;
**********************************************************************
********
;************************** RUTINA DE 5 SEGUNDOS
***************************
;
**********************************************************************
********

;rutina retardo de 5 seg aproximadamente


;no se puede calcular el tiempo exacto ya que al pasar por la rutina de
;pulsadores, el tiempo de esta depende de las variables que la componen
;por este motivo la llamada a pulsadores la hago en el ciclo3, ya que este es
;ciclo que menos veces se repite y por lo tanto menos interviene en el tiempo
;final

;con los tiempos aqui dados, cada 0,09seg comprobamos los pulsadores

;para conseguir un tiempo aproximado de 5 seg


;tendre que ir a la rutina de los
;pulsadores 50 veces
bucle5 movlw 50 ; (decimal) numero de veces que voy a pulsadores.
movwf reg1

ciclo3 call pulsadores ; continuamente voy a la rutina de pulsadores


movlw 30 ; t=766(30+90+1)= 92686 microsegundos
movwf reg2

ciclo2 movlw 0xff ;ff equivale a 255, t=(255x3)+1 = 766 microsegundos


movwf reg3

ciclo decfsz reg3,1 ; comienza a restar. cuando sea 0 salta 1 linea


goto ciclo ; sigue restando hasta que llege a 0

decfsz reg2,1 ; resta 1 a reg2.cuando sea 0 se saltara una linea


goto ciclo2

decfsz reg1,1 ; idem


goto ciclo3

return ; vuelvo donde se hizo la llamada

;
**********************************************************************
********
;************************ RUTINA DE CONDENSADORES
*************************
;
**********************************************************************
********

;aqui esperamos 766 microsegundos para que el valor de las entradas se


;estabilice, debido a la capacidad de los condensadores

condensador movlw 0xff ;ff equivale a 255, t=(255x3)+1 = 766 microsegundos


movwf reg4

espero decfsz reg4,1 ; comienza a restar. cuando sea 0 salta 1 linea


goto espero ; sigue restando hasta que llege a 0

return ; vuelvo donde se hizo la llamada

end

También podría gustarte