;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXX www.diselc.es XXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXX ASCENSOR DE 5 PLANTAS XXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;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 ;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 dirección 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