Título: Mejorar Senpir para la versión 2.0 Publicado por: Meta en 17 Enero 2014, 20:20 pm Hola:
(http://1.bp.blogspot.com/-KbZ1FXBF6lk/T0jOoc1yQ9I/AAAAAAAAAJM/k8FyN-IE3WA/s1600/Senpir_proyecto.jpeg) Hace tiempo hice un mini proyecto cuando estaba aprendiendo a programar asm del PIC16F84A. Debo mejorarlo muy bien antes de fabricar uno. Por eso es bueno hacer una lista de lo que se va hacer. En mi caso es este. - Condensador de 100 nF entre los pines de allimentación del PIC. - Usar un IC 40106 para estabilizar las señales de entrada del PIC sobre la LDR. - Controlar los tiempos con Timer dentro del PIC. El problema de arriba que usa los tiempos con retardos y el PIC queda esclavo, si cambio la configuración de los tiempos no puedo hasta que el tiempo iniciado termine, la única manera es resetear el PIC. La solución es usar el Timer 0 con interrupciones. Es lo que debo hacer. Para aquellos que tienen muy al día de manejar bien el timer a su antojo con interrupciones puedes modificar el código principal que es este. (http://1.bp.blogspot.com/-Z53Q-AyIRgU/TzPo-RURxWI/AAAAAAAAAIc/dK-Z3nPVzos/s1600/senpir04.jpg) Código: ; El proyecto pueden verlo en el enlace de abajo.; Programa de un interruptor con sensor movimiento y de luz solar: Si es de noche, ; mientras el sensor de movimiento (PIR) detecta la presencia de alguien ; entorno a 6 metros, activa o se pone a 1 la entrada RA3 y la lámpara ; se enciende. En caso de que sea de día detectado por la LDR, nunca se enciende ; la lámpara. En la otra opción, cuando la LDR detecta la noche o falta de Sol, ; la lámpara se enciende, cuando sea de día, la lámpara se apaga. ; En los microinterruptores puedes activar el tiempo que tarda en apagarse la ; lámpara después de ser detectado por el sensor Pir y de noche de un máximo ; una hora y treinta y cinco minutos. ; ;¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬ ; DATOS ¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬ LIST P=16F84A INCLUDE <P16F84A.INC> __CONFIG 3FF1 __idlocs 0001 ; ID, versión del programa. CBLOCK 0x0C ENDC #DEFINE Led_verde PORTA,0 ; Led verde indica opción LDR seleccionada. #DEFINE Led_rojo PORTA,1 ; Led rojo indica opción PIR seleccionada. #DEFINE Led_azul PORTA,2 ; Led azul indica que el Relé está activado. #DEFINE lámpara PORTA,3 ; lámpara. #DEFINE PIR PORTB,1 ; Sensor PIR. #DEFINE LDR PORTB,3 ; Sensor LDR. #DEFINE Int_RB4 PORTB,4 ; Interruptor RB4. #DEFINE Int_RB5 PORTB,5 ; Interruptor RB5. #DEFINE Int_RB6 PORTB,6 ; Interruptor RB6. #DEFINE Int_RB7 PORTB,7 ; Interruptor RB7. ; EEPROM ¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬ ORG 0x2100 ; Comienza en la direccoón 0 de la memoria EERPOM. ; Datos nombre del archivo, versión del programa ; y dirección del correo electrónico. DE "Senpir.asm. v1.0. 25-03-2009. metaconta@gmail.com", 0x00 ; CÓDIGOS ¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬ ORG 0 Inicio bsf STATUS,RP0 ; Accede al Banco 1. clrf PORTA ; Puerto A como salidas. movlw b'11111111' ; Las 8 líneas del puerto B se configura como entradas. movwf PORTB bcf STATUS,RP0 ; Accede al Banco 0. clrf PORTA ; Supuestamente la lámpara y Led apagadas. Opcion_principal btfss Int_RB4 ; ¿Bit 4 del PORTB es "1"? ¿Int_RB4 activado? goto Opcion_LDR ; No, activa modo LDR. goto Opcion_PIR ; Sí, activa modo PIR. ; INTERRUPTOR CREPUSCULAR LDR ¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬ Opcion_LDR bcf Led_rojo ; Se apaga el Led rojo. bsf Led_verde ; Enciende Led verde indicando modo LDR activado. btfss LDR ; ¿La entrada LDR es igual a 1?, ¿LDR en oscuridad? goto Apaga_la_lámpara ; No, la LDR está iluminada por el Sol. La lámpara se apaga. Enciende_la_lámpara call Retardo_20_seg ; Espera 20 segundos para confirmar la oscuridad. btfss LDR ; ¿Entrada es igual a 1?, ¿LDR aún en oscuridad? goto Opcion_principal ; No, sale fuera. bsf lámpara ; Sí, enciende la lámpara. bsf Led_azul ; Led_azul activo. goto Opcion_principal Apaga_la_lámpara call Retardo_20_seg ; Espera 20 segundos para confirmar la oscuridad. btfsc LDR ; ¿Entrada es = 0?, ¿LDR sigue iluminada por luz del sol? goto Opcion_principal ; No, sale fuera. bcf lámpara ; Sí, apaga lámpara. bcf Led_azul ; Led_azul indica que la lámpara está apagada. goto Opcion_principal ; DETECTOR DE MOVIMIENTO ¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬ Opcion_PIR bcf Led_verde ; Apaga el Led verde de aviso. bsf Led_rojo ; Enciende Led rojo avisando que está activado el modo PIR. btfss LDR ; ¿La entrada LDR es igual a 1?, ¿LDR en oscuridad? goto lámpara_OFF ; No. btfss PIR ; ¿La entrada PIR es igual a 1?, ¿PIR ha detectado presencia? goto lámpara_OFF ; No, no ha detectado presencia o movimiento. lámpara_ON bsf lámpara ; Sí, enciende la lámpara. bsf Led_azul ; Led_azul activo. btfss Int_RB5 ; ¿Bit 5 del PORTB es igual a 1?, ¿Activado el interruptor RB5? goto RB6 ; No, salta a la línea siguiente. call Retardo_5_min ; Tiempo lámpara encendida 5 minutos. RB6 btfss Int_RB6 ; ¿Bit 6 del PORTB es igual a 1?, ¿Activado el interruptor RB6? goto RB7 call Retardo_30_min ; Tiempo lámpara encendida 30 minutos. RB7 btfss Int_RB7 ; ¿Bit 7 del PORTB es igual a 1?, ¿Activado el interruptor RB7? goto Opcion_principal call Retardo_1_hora ; Tiempo lámpara encendida 1 hora. goto Opcion_principal lámpara_OFF bcf lámpara ; Apaga lámpara. bcf Led_azul ; Apaga Led_azul. goto Opcion_principal ; SUBRUTINAS ¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬ ; Retardo de 20 segundos ................................................................ cblock ret_00 ret_01 ret_02 Nulo endc Retardo_20_seg ;19999992 ciclos movlw 0xB5 movwf ret_00 movlw 0x99 movwf ret_01 movlw 0x2C movwf ret_02 Retardo_20_seg_0 decfsz ret_00, f goto $+2 decfsz ret_01, f goto $+2 decfsz ret_02, f goto Retardo_20_seg_0 ;4 ciclos goto $+1 goto $+1 ;4 ciclos (incluyendo call) return ; Retardo de 5 minutos .................................................................. cblock ret_05 ret_06 ret_07 ret_08 endc Retardo_5_min ;299999995 ciclos movlw 0x54 movwf ret_05 movlw 0xA1 movwf ret_06 movlw 0xFD movwf ret_07 movlw 0x02 movwf ret_08 Retardo_5_min_0 decfsz ret_05, f goto $+2 decfsz ret_06, f goto $+2 decfsz ret_07, f goto $+2 decfsz ret_08, f goto Retardo_5_min_0 ;1 ciclo nop ;4 ciclos (incluyendo call) return ; Retardo de 30 minutos ................................................................. cblock ret_09 ret_10 ret_11 ret_12 endc Retardo_30_min ;1799999989 ciclos movlw 0xFE movwf ret_09 movlw 0xC2 movwf ret_10 movlw 0xEC movwf ret_11 movlw 0x0C movwf ret_12 Retardo_30_min_0 decfsz ret_09, f goto $+2 decfsz ret_10, f goto $+2 decfsz ret_11, f goto $+2 decfsz ret_12, f goto Retardo_30_min_0 ;7 ciclos goto $+1 goto $+1 goto $+1 nop ;4 ciclos (incluyendo call) return ; Retardo de 1 hora ..................................................................... cblock ret_13 ret_14 ret_15 ret_16 endc Retardo_1_hora ;3599999989 ciclos movlw 0xFE movwf ret_13 movlw 0x84 movwf ret_14 movlw 0xD8 movwf ret_15 movlw 0x18 movwf ret_16 Retardo_1_hora_0 decfsz ret_13, f goto $+2 decfsz ret_14, f goto $+2 decfsz ret_15, f goto $+2 decfsz ret_16, f goto Retardo_1_hora_0 ;7 ciclos goto $+1 goto $+1 goto $+1 nop ;4 ciclos (incluyendo call) return END http://electronica-pic.blogspot.com.es/2009/11/interruptor-crepuscular-y-de-movimiento.html Cualquier consejo, sugerencia o algún comentario para mejorarlo es bienvenido. |