;************************************************************************* ;* Clever Lamp * ;* (c)Tolaemon 2003 * ;************************************************************************* ;CALCULO DE LAS TEMPORIZACIONES ;PSA esta a '1' por lo que el preescaler esta asignado al WATCHDOG, asi el ;contador de TIMER0 se incrementara en cada ciclo de instruccion. Como el Xtal ;es de 3,6864Mhz y cada ciclo de instruccion son 4 ciclos de reloj, 1 ciclo de ;instruccion dura: Tinstr= 4 * (1/3,6864 E6) en seg. Como la fercuencia de ;parpadeo de los leds ha de ser de 40Hz Tled=0,025 en seg. Cada ciclo de led ha de ;durar 0,025 seg. La interrupcion se generara cuando se desborde el contador ;del timer, es decir cuando hayan pasado 255 ciclos de instruccion. Asi cada ;cada ciclo de led requerira Tled / (Tinstr*255) = aprox 90 interrupciones de ;reloj. Es decir que cuando se hayan producido 90 llamadas de interrupcion, ;habran pasado aprox 0,025 seg. ;No sobrecargar la RSI del timer ya que si en el siguiente desboradmiento del ;contador todavia se esta ejecutando la RSI del timer, se perdera la interrupcion ;de este. list P=16F84 #include p16f84a.inc ; se definen las variables TICKS_C_MAX equ 0x10 TICKS_C equ 0x11 TICKS_UV equ 0x12 TICKS_RJ equ 0x13 TICKS_VD equ 0x14 TICKS_AZ equ 0x15 TICKS_BL equ 0x16 TICKS_UV_MAX equ 0x17 TICKS_RJ_MAX equ 0x18 TICKS_VD_MAX equ 0x19 TICKS_AZ_MAX equ 0x1A TICKS_BL_MAX equ 0x1B C_PARPAD_MAX equ 0x1C ;es el numero de CICLOS DE PARPADEO MAXIMO y controla la duracion del parpadeo C_PARPAD equ 0x1D ;es el contador de CICLOS DE PARPADEO y controla el tiempo de espera entre parpadeo y parpadeo PARPAD_ACTIVO equ 0x1E AZAR_ACTIVO equ 0x1F HAY_TICK equ 0x20 C_ANTIREB_MAX equ 0x21 C_ANTIREB equ 0x22 LECT_ACTUAL equ 0x23 ;valor leido del puerto de pulsadores, se usa para avaluar las pulsaciones de los diferentes pulsadores en un mismo instante, cosa que no se podria hacer si se leiera directamente del puerto LECT_ANTERIOR equ 0x24 ;valor leido del puerto de pulsadores en el ultimo ciclo, sirve para saber si en el ultimo ciclo el pulsador estaba apretado o no y asi evitar coger 2 veces una misma pulsacion SELECCION_MAX equ 0x25 SELECCION equ 0x26 MASCARA_SALIDA equ 0x27 ;mascara que se aplica a SALIDA para seleccionar que leds han de encenderse o no MASCARA_PARPAD equ 0x28 ;mascara que se aplica a SALIDA para implementar el PARPADEO MASCARA_AZAR equ 0x29 ;mascara que se aplica a SALIDA para implementar las variaciones al AZAR SALIDA equ 0x2A ;bits que se sacaran por el puerto de los LEDs es decir contiene el estado de los LEDs ; empieza el programa org 0 ;el codigo que hay a continuacion se situa a partir de la @ 0x00 (es el vector de RESET) goto inicializacion ;saltamos a otra zona de codigo para no pisar la @ 0x04 donde esta el codigo de la RSI ; ****************************************** ; * RSI GENERAL * ; ****************************************** org 4 ;el codigo que hay a continuacion se situa a partir de la @0x04 (es el vector de interrupcion GLOBAL) como a continuacion no hay ninguna otra direccion especial el codigo continua y no es necesario hacer ningun goto btfsc INTCON,T0IF ;se comprueba que la causa de interrupcion es el TIMER0 call gestion_int_timer bcf INTCON,T0IF ;resetea el bit de overflow de TIMER0 retfie ;la propia instruccion RETFIE reactiva el GIE ; ****************************************** ; * PROGRAMA PRINCIPAL * ; ****************************************** inicializacion bsf STATUS,RP0; BANCO1 es activado ; Configuración general ; RBPU (7) = 0 : pull-up activados ; INTEDG (6) ; TOCS (5) = 0 : seleccionamos timer ; TOSE (4) = 0 : incremento en transicion low-high ; PSA (3) = 1 : prescaler asignado al WATCHDOG ; PS2 (2) = 0 : ; PS1 (1) = 0 : PS2:PS0 (1/2) ; PS0 (0) = 0 : movlw b'01011000' ; division de frecuencia de (1/2) movwf OPTION_REG bcf STATUS,RP0 ; BANCO0 es activado clrf PORTB clrf PORTA bsf STATUS,RP0 ;BANCO1 es activado movlw b'00000000' ;se carga en el registro W: 00000000 0: Salida 1:Entrada movwf TRISA ;se configuran los pins de E/S del puerto A movlw b'00000011' ;se carga en el registro W: 00000111 0: Salida 1:Entrada movwf TRISB ;se configuran los pins de E/S del puerto B bcf STATUS,RP0 ;BANCO0 es activado bsf INTCON,T0IE ;activa interrupción del TIMER0 bcf INTCON,T0IF ;resetea el bit de overflow de TIMER0 bcf INTCON,EEIE ;activa la interrupcion por escritura en la EEPROM bsf INTCON,GIE ;activa las interrupciones movlw 0x5A movwf TICKS_RJ movwf TICKS_RJ_MAX movwf TICKS_VD movwf TICKS_VD_MAX movwf TICKS_AZ movwf TICKS_AZ_MAX movwf TICKS_BL movwf TICKS_BL_MAX movwf TICKS_UV movwf TICKS_UV_MAX movlw 0x5A ;cada 90 llamadas de interrupcion habra pasado un ciclo de LED,esto da una freq de actualizacion de 40Hz movwf TICKS_C_MAX movwf TICKS_C movlw 0x01 movwf C_PARPAD_MAX movwf C_PARPAD movlw 0x00 movwf PARPAD_ACTIVO ;0x01 PRARPADEO ACTIVO 0x00 PARPADEO NO ACTIVO movwf AZAR_ACTIVO ;0x01 AZAR ACTIVO 0x00 AZAR NO ACTIVO movlw 0x14 ;el numero de opciones de seleccion es de 14 movwf SELECCION_MAX movlw 0x01 ;el programa se incia en la opcion de seleccion 1 movwf SELECCION movlw 0xFF ;se ponen todas las MASCARAS a '11111111' movwf MASCARA_SALIDA movwf MASCARA_PARPAD movwf MASCARA_AZAR movlw 0x00 movwf SALIDA movwf HAY_TICK movlw 0x1A ;despues de apretar un pulsador no volvera a ser escuchado movwf C_ANTIREB_MAX ;hasta que hayan pasado C_ANTIREB_MAX ciclos de LED y ademas movwf C_ANTIREB ;no se haya soltado el pulsador (se sabe con LECT_ANTERIOR) movlw b'00000011' ;se inicializa la variable de lectura anterior del filtro de los movwf LECT_ANTERIOR ;pulsadores. Hay que tener en cuenta que llevan pull-up por lo que al no estar presionados dan un 1 y al presionarlos un 0. bucle movfw SALIDA andwf MASCARA_SALIDA,0 ;se aplica la MASCARA de SALIDA a SALIDA la cual permite seleccionar que leds se encienden andwf MASCARA_PARPAD,0 ;se aplica la MASCARA DE PARPADEO que decide si los leds estan encendidos o apagados andwf MASCARA_AZAR,0 ;se aplica la MASCARA DE AZAR que modifica aleatoriamente los leds que se han de encender movwf PORTA call gestion_timer call gestion_pulsadores goto bucle ; ********************************** ; * RUTINAS DE INTERRUPCION * ; ********************************** ; RUTINA DE INTERRUPCION DEL TIMER gestion_int_timer bsf HAY_TICK,0 return ; ********************************** ; * PROCEDIMIENTOS * ; ********************************** gestion_timer btfss HAY_TICK,0 ;se mira si HAY_TICK esta activo y si esta a 0 goto fin_gestion_timer ;(no hay ticks) entonces se ejecuta el goto bcf HAY_TICK,0 ;se desactiva HAY_TICKS decfsz TICKS_C ,1 ;se mira si el contador de ciclo de leds se ha puesto a 0, si es asi se reinicializa el ciclo goto decrementa_ticks movfw TICKS_C_MAX ;se recarga el contador de ciclo con el numero de llamadas de RSI por ciclo de LEDs movwf TICKS_C movfw TICKS_RJ_MAX ;se reinicializa el contador de ticks de RJ movwf TICKS_RJ movfw TICKS_VD_MAX ;se reinicializa el contador de ticks de VD movwf TICKS_VD movfw TICKS_AZ_MAX ;se reinicializa el contador de ticks de AZ movwf TICKS_AZ movfw TICKS_BL_MAX ;se reinicializa el contador de ticks de BL movwf TICKS_BL movfw TICKS_UV_MAX ;se reinicializa el contador de ticks de UV movwf TICKS_UV movlw 0xFF ;se ponen todos los bits de salida a 1 movwf SALIDA control_parpadeo btfss PARPAD_ACTIVO,0 ;si el bit de PARPADEO ACTIVO esta a 0 se ejecuta el goto goto azar decfsz C_PARPAD,1 goto azar movfw C_PARPAD_MAX movwf C_PARPAD movlw 0xFF ; se hace una XOR de la MASCARA con b'11111111' xorwf MASCARA_PARPAD,1 ; para invertir todos los bits de esta azar btfss AZAR_ACTIVO,0 ;si el bit de AZAR ACTIVO esta a 0 se ejecuta el goto goto antirebotes incf MASCARA_AZAR,1 rlf MASCARA_AZAR,1 antirebotes decfsz C_ANTIREB,1 ;se decrementa el temporizador ANTIREBOTE y si ya goto fin_gestion_timer ;esta a 1 (al decrementar da 0) no se tiene que decrementar movlw 0x01 ;asi que como se ja decrementado y no era necesario se movwf C_ANTIREB ;deja como estaba antes de decrementar, es decir a 1 goto fin_gestion_timer decrementa_ticks decrementa_rj decfsz TICKS_RJ,1 goto decrementa_vd ;si el resultado vale >=1 se ejecuta el goto movlw 0x01 ;se pone la variable de nuevo a 1 para que movwf TICKS_RJ ;en el siguiente decremnto vuelva a valer 0 bcf SALIDA,0 ;se pone a 0 el pin del rojo decrementa_vd decfsz TICKS_VD,1 goto decrementa_az ;si el resultado vale >=1 se ejecuta el goto movlw 0x01 ;se pone la variable de nuevo a 1 para que movwf TICKS_VD ;en el siguiente decremnto vuelva a valer 0 bcf SALIDA,1 ;se pone a 0 el pin del verde decrementa_az decfsz TICKS_AZ,1 goto decrementa_bl ;si el resultado vale >=1 se ejecuta el goto movlw 0x01 ;se pone la variable de nuevo a 1 para que movwf TICKS_AZ ;en el siguiente decremnto vuelva a valer 0 bcf SALIDA,2 ;se pone a 0 el pin del azul decrementa_bl decfsz TICKS_BL,1 goto decrementa_uv ;si el resultado vale >=1 se ejecuta el goto movlw 0x01 ;se pone la variable de nuevo a 1 para que movwf TICKS_BL ;en el siguiente decremnto vuelva a valer 0 bcf SALIDA,3 ;se pone a 0 el pin del blanco decrementa_uv decfsz TICKS_UV,1 goto fin_gestion_timer ;si el resultado vale >=1 se ejecuta el goto movlw 0x01 ;se pone la variable de nuevo a 1 para que movwf TICKS_UV ;en el siguiente decremnto vuelva a valer 0 bcf SALIDA,4 ;se pone a 0 el pin de ultra violetas fin_gestion_timer return gestion_pulsadores movlw b'00000001' ;para hacer la comparacion de si C_ANTIREB es igual a 0 se hace xorwf C_ANTIREB,0 ;una XOR con '0000000' y si el resultado es 0 es que los valores btfss STATUS,2 ;son iguales. Mediante el bit Z del status register se sabe goto fin_gestion_pulsadores ;si la operacion ha dado como resultado 0 o !=0 bcf PORTB,2 ;pasado el tiempo de espera antirebotes se apaga el led indicador de pulsadores no disponibles, lo que indica que estos vuelven a ser "escuchados" movfw PORTB ;se lee el contenido del puerto y se deja en la variable de lectura de los pulsadores movwf LECT_ACTUAL ;esta variable se usa para evitar leer en instantes diferentes del puerto de pulsadores lo que podria provocar algun problema, hacer esto equivale a consultar los pulsadores en un mismo intervalo de tiempo mira_pulsador1 btfsc LECT_ACTUAL,0 ;se consulta si el pulsador 1 (bit0) esta apretado. Si el bit vale 1 (recordar que los pulsadores van con pull-up) no lo esta goto mira_pulsador2 ;entonces se ejecuta el goto y se mira el siguiente pulsador btfss LECT_ANTERIOR,0 ;si el pulsador esta apretado, se mira que anteriormente haya estado desapretado (LECT_ANTERIOR) goto mira_pulsador2 ;y si no lo ha estado se mira el siguiente pulsador. Esto es util para diferenciar pulsaciones consecutivas y evitar leer 2 veces la misma pulsacion. Sino se hiciera esto manteniendo el pulsador apretado todo el rato las variables se irian incrementando lo que podria se un poco incomodo call gestion_seleccion goto ini_antirebote mira_pulsador2 btfsc LECT_ACTUAL,1 ;se consulta si el pulsador 2 esta apretado. Si el bit vale 1 no lo esta goto fin_gestion_pulsadores ;entonces se ejecuta el goto btfss LECT_ANTERIOR,1 ;si esta apretado el pulsador, se mira que anteriormente haya estado desapretado (LECT_ANTERIOR) goto fin_gestion_pulsadores ;si no lo ha estado se ejecuta el goto. Esto es util para diferenciar pulsaciones consecutivas y evitar leer 2 veces la misma pulsacion. Sino se hiciera esto manteniendo el pulsador apretado todo el rato las variables se irian incrementando lo que podria se un poco incomodo incf SELECCION,1 ;como se ha presionado el pulsador 2 se incrementa la variable de seleccion pero hay que mirar que no nos pasemos del maximo movfw SELECCION ;para hacer la comparacion de si SELECCION es igual a SELECCION_MAX xorwf SELECCION_MAX,0 ;se hace una XOR y si el resultado es 0 es que los valores son btfss STATUS,2 ;iguales. Mediante el bit Z del status register se sabe si goto ini_antirebote ;la XOR ha dado 00000000 o no. Si no da, Z=0 y se ejecuta el goto movlw 0x01 ;si efectivamente se ha llegado al maximo de vuelve otra vez al inicio movwf SELECCION goto ini_antirebote ini_antirebote movfw C_ANTIREB_MAX ;se carga el tiempo de espera maximo (en ciclos de led) movwf C_ANTIREB bsf PORTB,2 ;se enciende el LED que indica que se oido la pulsacion y que los pulsadores no se encuentran disponibles, es decir que no se escucharan hasta que pase le tiempo C_ANTIREB_MAX fin_gestion_pulsadores movfw LECT_ACTUAL movwf LECT_ANTERIOR return gestion_seleccion compara_1 movfw SELECCION ;para hacer la comparacion de si SELECCION es igual a 1 xorlw b'00000001' ;se hace una XOR y si el resultado es 0 es que los valores btfss STATUS,2 ;son iguales. Mediante el bit Z del status register se sabe goto compara_2 ;si la operacion ha dado como resultado 0 o !=0 movfw TICKS_C_MAX ;se asigna el numero de ticks de ciclo de led maximo al movwf TICKS_RJ_MAX ;numero de ticks de los diferentes colores movwf TICKS_VD_MAX movwf TICKS_AZ_MAX movwf TICKS_BL_MAX movwf TICKS_UV_MAX movlw 0xFF movwf MASCARA_SALIDA ;se activan todos los leds movwf MASCARA_PARPAD ;se activan todos los leds de la MASCARA DE PARPADEO movwf MASCARA_AZAR ;se activan todos los leds de la MASCARA DE AZAR movlw 0x00 movwf PARPAD_ACTIVO ;se desactiva el parpadeo movwf AZAR_ACTIVO ;se desactiva el ciclo aleatorio goto fin_gestion_seleccion compara_2 movfw SELECCION ;para hacer la comparacion de si SELECCION es igual a 2 xorlw b'0000010' ;se hace una XOR y si el resultado es 0 es que los valores btfss STATUS,2 ;son iguales. Mediante el bit Z del status register se sabe goto compara_3 ;si la operacion ha dado como resultado 0 o !=0 movlw 0x2D movwf TICKS_RJ_MAX movwf TICKS_VD_MAX movwf TICKS_AZ_MAX movwf TICKS_BL_MAX movwf TICKS_UV_MAX movlw 0xFF movwf MASCARA_SALIDA ;se activan todos los leds movwf MASCARA_PARPAD ;se activan todos los leds de la MASCARA DE PARPADEO movwf MASCARA_AZAR ;se activan todos los leds de la MASCARA DE AZAR movlw 0x00 movwf PARPAD_ACTIVO ;se desactiva el parpadeo movwf AZAR_ACTIVO ;se desactiva el ciclo aleatorio goto fin_gestion_seleccion compara_3 movfw SELECCION ;para hacer la comparacion de si SELECCION es igual a 3 xorlw b'00000011' ;se hace una XOR y si el resultado es 0 es que los valores btfss STATUS,2 ;son iguales. Mediante el bit Z del status register se sabe goto compara_4 ;si la operacion ha dado como resultado 0 o !=0 movlw 0x01 movwf TICKS_RJ_MAX movwf TICKS_VD_MAX movwf TICKS_AZ_MAX movwf TICKS_BL_MAX movwf TICKS_UV_MAX movlw 0xFF movwf MASCARA_SALIDA ;se activan todos los leds de la MASCARA DE SALIDA movwf MASCARA_PARPAD ;se activan todos los leds de la MASCARA DE PARPADEO movwf MASCARA_AZAR ;se activan todos los leds de la MASCARA DE AZAR movlw 0x00 movwf PARPAD_ACTIVO ;se desactiva el parpadeo movwf AZAR_ACTIVO ;se desactiva el ciclo aleatorio goto fin_gestion_seleccion compara_4 movfw SELECCION ;para hacer la comparacion de si SELECCION es igual a 4 xorlw b'00000100' ;se hace una XOR y si el resultado es 0 es que los valores btfss STATUS,2 ;son iguales. Mediante el bit Z del status register se sabe goto compara_5 ;si la operacion ha dado como resultado 0 o !=0 movfw TICKS_C_MAX movwf TICKS_RJ_MAX movlw b'00000001' movwf MASCARA_SALIDA movlw 0xFF movwf MASCARA_PARPAD ;se activan todos los leds de la MASCARA DE PARPADEO movwf MASCARA_AZAR ;se activan todos los leds de la MASCARA DE AZAR movlw 0x00 movwf PARPAD_ACTIVO ;se desactiva el parpadeo movwf AZAR_ACTIVO ;se desactiva el ciclo aleatorio goto fin_gestion_seleccion compara_5 movfw SELECCION ;para hacer la comparacion de si SELECCION es igual a 5 xorlw b'00000101' ;se hace una XOR y si el resultado es 0 es que los valores btfss STATUS,2 ;son iguales. Mediante el bit Z del status register se sabe goto compara_6 ;si la operacion ha dado como resultado 0 o !=0 movfw TICKS_C_MAX movwf TICKS_VD_MAX movlw b'00000010' movwf MASCARA_SALIDA movlw 0xFF movwf MASCARA_PARPAD ;se activan todos los leds de la MASCARA DE PARPADEO movwf MASCARA_AZAR ;se activan todos los leds de la MASCARA DE AZAR movlw 0x00 movwf PARPAD_ACTIVO ;se desactiva el parpadeo movwf AZAR_ACTIVO ;se desactiva el ciclo aleatorio goto fin_gestion_seleccion compara_6 movfw SELECCION ;para hacer la comparacion de si SELECCION es igual a 6 xorlw b'00000110' ;se hace una XOR y si el resultado es 0 es que los valores btfss STATUS,2 ;son iguales. Mediante el bit Z del status register se sabe goto compara_7 ;si la operacion ha dado como resultado 0 o !=0 movfw TICKS_C_MAX movwf TICKS_AZ_MAX movlw b'00000100' movwf MASCARA_SALIDA movlw 0xFF movwf MASCARA_PARPAD ;se activan todos los leds de la MASCARA DE PARPADEO movwf MASCARA_AZAR ;se activan todos los leds de la MASCARA DE AZAR movlw 0x00 movwf PARPAD_ACTIVO ;se desactiva el parpadeo movwf AZAR_ACTIVO ;se desactiva el ciclo aleatorio goto fin_gestion_seleccion compara_7 movfw SELECCION ;para hacer la comparacion de si SELECCION es igual a 7 xorlw b'00000111' ;se hace una XOR y si el resultado es 0 es que los valores btfss STATUS,2 ;son iguales. Mediante el bit Z del status register se sabe goto compara_8 ;si la operacion ha dado como resultado 0 o !=0 movfw TICKS_C_MAX movwf TICKS_BL_MAX movlw b'00001000' movwf MASCARA_SALIDA movlw 0xFF movwf MASCARA_PARPAD ;se activan todos los leds de la MASCARA DE PARPADEO movwf MASCARA_AZAR ;se activan todos los leds de la MASCARA DE AZAR movlw 0x00 movwf PARPAD_ACTIVO ;se desactiva el parpadeo movwf AZAR_ACTIVO ;se desactiva el ciclo aleatorio goto fin_gestion_seleccion compara_8 movfw SELECCION ;para hacer la comparacion de si SELECCION es igual a 8 xorlw b'00001000' ;se hace una XOR y si el resultado es 0 es que los valores btfss STATUS,2 ;son iguales. Mediante el bit Z del status register se sabe goto compara_9 ;si la operacion ha dado como resultado 0 o !=0 movfw TICKS_C_MAX movwf TICKS_UV_MAX movlw b'00010000' movwf MASCARA_SALIDA movlw 0xFF movwf MASCARA_PARPAD ;se activan todos los leds de la MASCARA DE PARPADEO movwf MASCARA_AZAR ;se activan todos los leds de la MASCARA DE AZAR movlw 0x00 movwf PARPAD_ACTIVO ;se desactiva el parpadeo movwf AZAR_ACTIVO ;se desactiva el ciclo aleatorio goto fin_gestion_seleccion compara_9 movfw SELECCION xorlw b'00001001' btfss STATUS,2 goto compara_10 movlw 0x00 ;se desactivan todos los bits de la MASCARA de SALIDA menos el BLANCO que hace de piloto ya que sino no sabriamos si la Clever Lamp esta o no encendida movwf MASCARA_SALIDA movlw 0x01 ;se ponen todos los colores al minimo movwf TICKS_RJ_MAX movwf TICKS_VD_MAX movwf TICKS_AZ_MAX movwf TICKS_BL_MAX movwf TICKS_UV_MAX goto fin_gestion_seleccion compara_10 movfw SELECCION xorlw b'00001010' btfss STATUS,2 goto compara_11 bsf MASCARA_SALIDA,0 movlw 0x05 addwf TICKS_RJ_MAX,1 goto fin_gestion_seleccion compara_11 movfw SELECCION xorlw b'00001011' btfss STATUS,2 goto compara_12 bsf MASCARA_SALIDA,1 movlw 0x05 addwf TICKS_VD_MAX,1 goto fin_gestion_seleccion compara_12 movfw SELECCION xorlw b'00001100' btfss STATUS,2 goto compara_13 bsf MASCARA_SALIDA,2 movlw 0x05 addwf TICKS_AZ_MAX,1 goto fin_gestion_seleccion compara_13 movfw SELECCION xorlw b'00001101' btfss STATUS,2 goto compara_14 bsf MASCARA_SALIDA,3 movlw 0x05 addwf TICKS_BL_MAX,1 goto fin_gestion_seleccion compara_14 movfw SELECCION xorlw b'00001110' btfss STATUS,2 goto compara_15 bsf MASCARA_SALIDA,4 movlw 0x05 addwf TICKS_UV_MAX,1 goto fin_gestion_seleccion compara_15 movfw SELECCION xorlw b'00001111' btfss STATUS,2 goto compara_16 ;SE GUARDA EL ROJO bcf STATUS,RP0 ;BANCO0 es activado movlw 0x00 ;se carga en EEADR la direccion donde se va a escribir movwf EEADR movfw TICKS_RJ_MAX ;se carga en EEDATA el valor que se va a guardar movwf EEDATA bsf STATUS,RP0 ;BANCO1 es activado bcf INTCON, GIE ;se desactivan todas las interrupciones bsf EECON1, WREN ;se activa el flag de permsio de escritura movlw 0x55 ;se realiza la secuencia de seguridad: movwf EECON2 ; 1->se escribe 0x55 en EECON2 movlw 0xAA movwf EECON2 ; 2->se escribe 0xAA en EECON2 bsf EECON1,WR ;comienza la escritura espera1 btfss EECON1, EEIF ;antes de continuar con la siguiente escritura hay que dejar que termine esta, para goto espera1 ;saberlo se va consultando el flag EEIF que se activa cuando termina la escritura bcf EECON1,EEIF ;se limpia el flag indicador de escritura completa ;SE GUARDA EL VERDE bcf STATUS,RP0 ;BANCO0 es activado movlw 0x01 ;se carga en EEADR la direccion donde se va a escribir movwf EEADR movfw TICKS_VD_MAX ;se carga en EEDATA el valor que se va a guardar movwf EEDATA bsf STATUS,RP0 ;BANCO1 es activado bcf INTCON, GIE ;se desactivan todas las interrupciones bsf EECON1, WREN ;se activa el flag de permsio de escritura movlw 0x55 ;se realiza la secuencia de seguridad: movwf EECON2 ; 1->se escribe 0x55 en EECON2 movlw 0xAA movwf EECON2 ; 2->se escribe 0xAA en EECON2 bsf EECON1,WR ;comienza la escritura espera2 btfss EECON1, EEIF ;antes de continuar con la siguiente escritura hay que dejar que termine esta, para goto espera2 ;saberlo se va consultando el flag EEIF que se activa cuando termina la escritura bcf EECON1,EEIF ;se limpia el flag indicador de escritura completa ;SE GUARDA EL AZUL bcf STATUS,RP0 ;BANCO0 es activado movlw 0x02 ;se carga en EEADR la direccion donde se va a escribir movwf EEADR movfw TICKS_AZ_MAX ;se carga en EEDATA el valor que se va a guardar movwf EEDATA bsf STATUS,RP0 ;BANCO1 es activado bcf INTCON, GIE ;se desactivan todas las interrupciones bsf EECON1, WREN ;se activa el flag de permsio de escritura movlw 0x55 ;se realiza la secuencia de seguridad: movwf EECON2 ; 1->se escribe 0x55 en EECON2 movlw 0xAA movwf EECON2 ; 2->se escribe 0xAA en EECON2 bsf EECON1,WR ;comienza la escritura espera3 btfss EECON1, EEIF ;antes de continuar con la siguiente escritura hay que dejar que termine esta, para goto espera3 ;saberlo se va consultando el flag EEIF que se activa cuando termina la escritura bcf EECON1,EEIF ;se limpia el flag indicador de escritura completa ;SE GUARDA EL BLANCO bcf STATUS,RP0 ;BANCO0 es activado movlw 0x03 ;se carga en EEADR la direccion donde se va a escribir movwf EEADR movfw TICKS_BL_MAX ;se carga en EEDATA el valor que se va a guardar movwf EEDATA bsf STATUS,RP0 ;BANCO1 es activado bcf INTCON, GIE ;se desactivan todas las interrupciones bsf EECON1, WREN ;se activa el flag de permsio de escritura movlw 0x55 ;se realiza la secuencia de seguridad: movwf EECON2 ; 1->se escribe 0x55 en EECON2 movlw 0xAA movwf EECON2 ; 2->se escribe 0xAA en EECON2 bsf EECON1,WR ;comienza la escritura espera4 btfss EECON1, EEIF ;antes de continuar con la siguiente escritura hay que dejar que termine esta, para goto espera4 ;saberlo se va consultando el flag EEIF que se activa cuando termina la escritura bcf EECON1,EEIF ;se limpia el flag indicador de escritura completa ;SE GUARDA EL UV bcf STATUS,RP0 ;BANCO0 es activado movlw 0x04 ;se carga en EEADR la direccion donde se va a escribir movwf EEADR movfw TICKS_UV_MAX ;se carga en EEDATA el valor que se va a guardar movwf EEDATA bsf STATUS,RP0 ;BANCO1 es activado bcf INTCON, GIE ;se desactivan todas las interrupciones bsf EECON1, WREN ;se activa el flag de permsio de escritura movlw 0x55 ;se realiza la secuencia de seguridad: movwf EECON2 ; 1->se escribe 0x55 en EECON2 movlw 0xAA movwf EECON2 ; 2->se escribe 0xAA en EECON2 bsf EECON1,WR ;comienza la escritura espera5 btfss EECON1, EEIF ;antes de continuar con la siguiente escritura hay que dejar que termine esta, para goto espera5 ;saberlo se va consultando el flag EEIF que se activa cuando termina la escritura bcf EECON1,EEIF ;se limpia el flag indicador de escritura completa ;SE GUARDA LA MASCARA DE SALIDA bcf STATUS,RP0 ;BANCO0 es activado movlw 0x05 ;se carga en EEADR la direccion donde se va a escribir movwf EEADR movfw MASCARA_SALIDA ;se carga en EEDATA el valor que se va a guardar movwf EEDATA bsf STATUS,RP0 ;BANCO1 es activado bcf INTCON, GIE ;se desactivan todas las interrupciones bsf EECON1, WREN ;se activa el flag de permsio de escritura movlw 0x55 ;se realiza la secuencia de seguridad: movwf EECON2 ; 1->se escribe 0x55 en EECON2 movlw 0xAA movwf EECON2 ; 2->se escribe 0xAA en EECON2 bsf EECON1,WR ;comienza la escritura espera6 btfss EECON1, EEIF ;antes de continuar con la siguiente escritura hay que dejar que termine esta, para goto espera6 ;saberlo se va consultando el flag EEIF que se activa cuando termina la escritura bcf EECON1,EEIF ;se limpia el flag indicador de escritura completa bcf EECON1, WREN ;se desactiva el flag de permsio de escritura bsf INTCON, GIE ;se reactivan todas las interrupciones bcf STATUS,RP0 ;BANCO0 es activado goto fin_gestion_seleccion compara_16 movfw SELECCION xorlw b'00010000' btfss STATUS,2 goto compara_17 ;SE LEE EL ROJO bcf STATUS,RP0 ;BANCO0 es activado movlw 0x00 ;se carga en EEADR la direccion de donde se quiere leer movwf EEADR bsf STATUS,RP0 ;BANCO1 es activado bsf EECON1,RD ;comienza la lectura bcf STATUS,RP0 ;BANCO0 es activado movfw EEDATA ;se carga el valor leido en la correspondiente variable movwf TICKS_RJ_MAX ;SE LEE EL VERDE bcf STATUS,RP0 ;BANCO0 es activado movlw 0x01 ;se carga en EEADR la direccion de donde se quiere leer movwf EEADR bsf STATUS,RP0 ;BANCO1 es activado bsf EECON1,RD ;comienza la lectura bcf STATUS,RP0 ;BANCO0 es activado movfw EEDATA ;se carga el valor leido en la correspondiente variable movwf TICKS_VD_MAX ;SE LEE EL AZUL bcf STATUS,RP0 ;BANCO0 es activado movlw 0x02 ;se carga en EEADR la direccion de donde se quiere leer movwf EEADR bsf STATUS,RP0 ;BANCO1 es activado bsf EECON1,RD ;comienza la lectura bcf STATUS,RP0 ;BANCO0 es activado movfw EEDATA ;se carga el valor leido en la correspondiente variable movwf TICKS_AZ_MAX ;SE LEE EL BLANCO bcf STATUS,RP0 ;BANCO0 es activado movlw 0x03 ;se carga en EEADR la direccion de donde se quiere leer movwf EEADR bsf STATUS,RP0 ;BANCO1 es activado bsf EECON1,RD ;comienza la lectura bcf STATUS,RP0 ;BANCO0 es activado movfw EEDATA ;se carga el valor leido en la correspondiente variable movwf TICKS_BL_MAX ;SE LEE EL UV bcf STATUS,RP0 ;BANCO0 es activado movlw 0x04 ;se carga en EEADR la direccion de donde se quiere leer movwf EEADR bsf STATUS,RP0 ;BANCO1 es activado bsf EECON1,RD ;comienza la lectura bcf STATUS,RP0 ;BANCO0 es activado movfw EEDATA ;se carga el valor leido en la correspondiente variable movwf TICKS_UV_MAX ;SE LEE LA MASCARA DE SALIDA bcf STATUS,RP0 ;BANCO0 es activado movlw 0x05 movwf EEADR bsf STATUS,RP0 ;BANCO1 es activado bsf EECON1,RD ;comienza la lectura bcf STATUS,RP0 ;BANCO0 es activado movfw EEDATA ;se carga el valor leido en la correspondiente variable movwf MASCARA_SALIDA goto fin_gestion_seleccion compara_17 movfw SELECCION ;para hacer la comparacion de si SELECCION es igual a 9 xorlw b'00010001' ;se hace una XOR y si el resultado es 0 es que los valores btfss STATUS,2 ;son iguales. Mediante el bit Z del status register se sabe goto compara_18 ;si la operacion ha dado como resultado 0 o !=0 movlw 0x01 ;se hace una XOR entre PARPAD_ACTIVO y b'00000001' xorwf PARPAD_ACTIVO,1 ;por tal de invertir su estado btfsc PARPAD_ACTIVO,0 ;si el bit de AZAR ACTIVO ha pasado a 0 entonces se reinicializan las mascaras goto compara_18 movlw 0xFF movwf MASCARA_PARPAD goto fin_gestion_seleccion compara_18 movfw SELECCION ;para hacer la comparacion de si SELECCION es igual a 10 xorlw b'00010010' ;se hace una XOR y si el resultado es 0 es que los valores btfss STATUS,2 ;son iguales. Mediante el bit Z del status register se sabe goto compara_19 ;si la operacion ha dado como resultado 0 o !=0 movlw 0x02 ;el periodo de ciclo de parpadeo se incrementara en 2 tras cada pulsacion addwf C_PARPAD_MAX,1 goto fin_gestion_seleccion compara_19 movfw SELECCION ;para hacer la comparacion de si SELECCION es igual a 11 xorlw b'00010011' ;se hace una XOR y si el resultado es 0 es que los valores btfss STATUS,2 ;son iguales. Mediante el bit Z del status register se sabe goto fin_gestion_seleccion ;si la operacion ha dado como resultado 0 o !=0 movlw 0x01 ;se hace una XOR entre AZAR_ACTIVO y b'00000001' xorwf AZAR_ACTIVO,1 ;por tal de invertir su estado btfsc AZAR_ACTIVO,0 ;si el bit de AZAR ACTIVO ha pasado a 0 entonces se reinicializan las mascaras goto fin_gestion_seleccion movlw 0xFF movwf MASCARA_PARPAD movwf MASCARA_AZAR movlw 0x01 movwf C_PARPAD_MAX ;se reinicializa la variable de CICLOS DE PARPADEO MAXIMOS que controla la duracion del parpadeo goto fin_gestion_seleccion fin_gestion_seleccion return END movwf TICKS_RJ_MAX