Story Transcript
ALARMA ANTIRROBO La alarma queda conectada por medio de un dip−switch que alimenta al microcontrolador (16F84). Una vez el microcontrolador recibe corriente (en este caso ante la imposibilidad de implementar en hardware esta opción, colocamos el dipswitch justo antes de la tierra común). Una vez la alarma recibe corriente, se inicia una cuenta atrás de 9 a 0 (representada en el display de 7 segmentos), durante la cual el optoacoplador no está a la escucha. La aplicación de este proceso sería tener la alarma conectada, en casa por ejemplo, por medio de un interruptor. Una vez que lo hemos conectado, salimos de casa, y tras finalizar la cuenta atrás, la alarma queda armada. Si algo pasa por el optoacoplador, por ejemplo, un ladrón, comienza de nuevo una cuenta atrás representada en el display, al final de la cual, si no se desconecta el interruptor que alimenta la alarma (podría hacerse por medio de una llave especial), un diodo led se encenderá y una sirena (zumbador) comenzará a sonar intermitentemente. La única forma de desconectar la alarma es cortando la alimentación. NOTA: En el circuito presentado, el interruptor que menciono que debiera de cortar la alimentación al pic, no hace realmente eso, ya que no es posible teniendo en cuenta que la placa de prototipos PIC 18−ME ya implementa determinadas funciones, una de las cuales es la alimentación del PIC. Por este motivo, en lugar de conectarlo como describo, lo conecto a tierra. De modo que todos los elementos antes de conectarse a tierra, pasan por el interruptor. El efecto sin embargo, no es el mismo, por lo cual incluyo esta nota. Inicio Cuenta Atrás De 9 a 0 ( y apaga el display) SLEEP (Sale de él por medio del optoacoplador conectado a RB0) Cuenta atrás, esperando una posible desconexión El diodo se enciende, y el zumbador suena LIST P=16F84 ;Se indica al ensamblador el tipo de pic RADIX HEX ;Por defecto utilizaremos hexadecimal W EQU 0x00 ;Renombramos los registros, para no tener 1
F EQU 0x01 ;que trabajar con direcciones de memoria Z EQU 0x02 PC EQU 0x02 ESTADO EQU 0x03 PA EQU 0x05 PB EQU 0x06 INTCON EQU 0x0B TMR_OPT EQU 0x01 CONTAR EQU 0x0C TEMPO1 EQU 0x0D ORG 0 ;Saltamos el vector de interrupción GOTO INICIO ORG 4 ;El vector de interrupción nos remite a GOTO OPTO_INT ;una etiqueta llamada "OPTO_INT" ORG 5 INICIO BSF ESTADO,5 ;Cambiamos al banco 1 MOVLW b'00000001' ;Establecemos el bit 0 de la puerta B como ;entrada (optoacoplador), y el resto como ;salidas. MOVWF PB MOVLW b'11111100' ;establecemos los 2 primeros bits de la ;puerta A como salidas (zumbador y led) MOVWF PA MOVLW b'10000000' ;permitimos las interrupciones MOVWF INTCON MOVLW b'01000111' ;inicializamos el preescaler del timer
2
MOVWF TMR_OPT BCF ESTADO,5 ;cambiamos al banco 0 CLRF PB ;borramos lo que haya en la puerta A y B CLRF PA BCF INTCON,4 ;nos aseguramos que la interrupción de P0 ;no está permitida CALL CUENTA ;comenzamos la cuenta atrás BCF PB,0 ;borramos el contenido que pudiera tener ;la puerta B en su bit 0 BCF INTCON,1 ;por si se ha activado el flag al pasar ;alguien por el optoacoplador, lo ponemos ;a 0 BSF INTCON,4 ;permitimos la interrupción por P0 SLEEP ;modo SLEEP DELAY2 BCF INTCON,2 ;Borra flag del TMR0 MOVLW 0x00 MOVWF TMR_OPT ;Carga TMR0 para que cuente 256 DELAY2X BTFSS INTCON,2 ;Espera overflow del TMR0 GOTO DELAY2X DECF TEMPO1,0 MOVWF TEMPO1 BTFSC TEMPO1,1 GOTO DELAY2 RETURN DELAY_ MOVLW 0xFF ;Repite la rutina DELAY2 256 veces MOVWF TEMPO1
3
CALL DELAY2 RETURN OPTO_INT BCF INTCON,4 ;Borra el permiso de interrupción por P0 BCF INTCON,1 ;Borra el flag que se ha activado tras ;la interrupción CALL CUENTA ;hace la cuenta atrás, esperando una posible ;desconexión de corriente BSF PA,1 ;el diodo se enciende (PA1) LOOP BSF PA,0 ;el zumbador se enciende y se apaga, para CALL DELAY ;darle un aspecto de alarma BCF PA,0 ;se repite indefinidamente, hasta que se resetee CALL DELAY ;el pic GOTO LOOP DELAY CALL DELAY_ CALL DELAY_ RETURN CUENTA MOVLW b'11110110' ;Esta función realiza la cuenta atrás MOVWF PB ;enciende un 9 y espera CALL DELAY CALL DELAY MOVLW b'11111110' ;enciende un 8 y espera MOVWF PB CALL DELAY CALL DELAY MOVLW b'11100000' ;enciende un 7 y espera MOVWF PB
4
CALL DELAY CALL DELAY MOVLW b'10111110' ;enciende un 6 y espera MOVWF PB CALL DELAY CALL DELAY MOVLW b'10110110' ;enciende un 5 y espera MOVWF PB CALL DELAY CALL DELAY MOVLW b'01100110' ;enciende un 4 y espera MOVWF PB CALL DELAY CALL DELAY MOVLW b'11110010' ;enciende un 3 y espera MOVWF PB CALL DELAY CALL DELAY MOVLW b'11011010' ;enciende un 2 y espera MOVWF PB CALL DELAY CALL DELAY MOVLW b'01100000' ;enciende un 1 y espera MOVWF PB CALL DELAY CALL DELAY
5
MOVLW b'11111100' ;enciende un 0 y espera MOVWF PB CALL DELAY CALL DELAY MOVLW b'00000000' ;se apaga el display, para ;no consumir energía MOVWF PB RETURN END
6