Microcontrolador PIC16F84A, sistemas de protección de circuitos
Con un microcontrolador PIC16F84A se desea diseñar un programa de protección del pic. Por ejemplo:
PortA como entradas.
PortB como salidas.
RA0..RA2, sensores.
RA3, tiene que estar en pulso alto, si desconecta la pila se pone a pulso bajo o 0 y en la eeprom se guarda el valor “d” o 64h.
RA4, si detecta pulso bajo a 0, guarda en su eeprom interna un valor en una dirección de memoria. Por ejemplo:
En la dirección 0x2100 se guarda un valor llamado 61h que en ASCII es una “a” nada más arrancar el pic, es decir, desde que pongas la pila o lo grabe desde el grabador ic-prog o winpic800. Le llega pulso alto (1). Esta “a” significa activado. Si por cualquier motivo en la entrada RA4 detecta pulso bajo (0), el pic entrará en una parte de programación donde se desactivará las entradas y salidas, es decir, que el pic no responda y entre en modo Sleep y que no pueda salir de él. Antes de ello, guarda en la eeprom interna del pic en la posición 0x2100 la letra en “d” en ASCII que en hexadecimal se llama 64h.
Por mucho que vuelvas a poner 0 ó 1 en la entrada RA4 o quites y vuelvas a poner la batería, el pic quedará siempre en Sleep. La única manera de que funcione es grabar otra vez el pic con el grabador. Digamos que hay un sensor conmutador de tres patas, que al quitar la tapa de la caja se ponga a 1 en al entrada RA4 y si pones la tapa de la caja en la entrada RA4 se pone a 0 con lo cual en la eeprom ya grabaría la letra “d” y el circuito no funciona.
Si pensamos bien, aún faltan cosas. El funcionamiento ideal sería que si quitas la batería, en la eerpom guarde la “d”. Pero si la quitas, el pic se apaga y no da tiempo de guardar la letra “d” en la eeprom, así que si vuelves a conectar la pila, el circuito funciona, la idea es dejar de funcionar quitando la pila y poner a 0 la entrada RA0.
¿Cuál es la solución?
Incluir un circuito temporizador que cuando la pila se desconecta, el temporizador dure unos 3 segundos para guardar en la eeprom la letra “d”. Una vez que guarde la letra “d”, el pic ya sabe que si vuelve a conectar la pila, lo primero que hace es comprobar si hay una “a” de activado o una letra “d” de desactivado. La única manera de hacer funcionar el circuito es, volver a grabar el pic16f84a.
Funcionamiento general
Diseñar un circuito y programa mediante ensamblador con el microcontrolador pic16f84a. Este circuito es para un control de riego por goteo en un jardín particular. Dejar el circuito en la pared dentro de un cuarto de aperos. Se utiliza un sistema de seguridad que al manipular la caja se desactive el circuito bien abriendo la caja o quitando la fuente de alimentación. En una salida del puerto b se activa un led y un altavoz o zumbador piezoeléctrico como aviso de alarma al mismo tiempo que el pic se pasa a estado Sleep (sueño). Cuando se queda en estado Sleep el circuito se queda inoperativo y no hay forma de volver a funcionar aunque vuelva a cerrar la tapa de la caja del circuito o vuelva a conectar la fuente de alimentación.
Funcionamiento interno
Cuando se conecte el circuito a la fuente de alimentación, el pic16f84a graba en la eeprom interna un valor 61h o “a”, el pic o circuito completo funciona correctamente.
Si en las entradas RA3 y/o RA4 se detecta pulso bajo, el pic16f84a graba el dato que hay en la dirección 0x2100 donde está la 61h “a” que significa activado y lo sustituye por el 64h “d” en la misma posición de memoria.
Si volvemos a poner la caja o la fuente de alimentación, el pic comprueba en la eeprom si en la dirección 0x2100 que dato hay. Como ha sido modificado, el pic encontrará el dato 64h “d” y el circuito no funcionará. La única manera de hacerlo funcionar es volver a grabar el pic con el grabador que es la opción A. Opción B, sería esperar una media hora desde que conecte la pila. Opto por la opción A, ya que quiero más seguridad.
;************************************ Proteccion_01.asm *************************************
;
; El Puerto B, que actúa como salida es controlado por el bit 0 del Puerto A, que actúa como
; entrada. De manera tal que:
; - Si el bit 0 del PORTA es "1", se encienden todos los diodos LED de salida.
; - Si el bit 0 del PORTA es "0", se encienden los LED del nibble alto y se apagan los bajo.
;
; ZONA DE DATOS *********************************************************************
LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
; ZONA DE CÓDIGOS ********************************************************************
ORG 0 ; El programa comienza en la dirección 0.
Inicio
bsf STATUS,RP0 ; Acceso al Banco 1.
clrf TRISB ; Las líneas del Puerto B se configuran como salida.
movlw b'00011111' ; Las 5 líneas del Puerto A se configuran como entrada.
movwf TRISA
bcf STATUS,RP0 ; Acceso al Banco 0.
Principal ; Supone que el bit de entrada estará a "1" y por
movlw b'10000000' ; tanto se van encender el LED del bit 7, RB7.
btfss PORTA,0 ; ¿Bit 0 del PORTA es "1"?
goto Cuelgue ; No. Bloqueo hacia Sleep.
movlw b'00000000' ; Sí.
movwf PORTB ; Resultado se visualiza por el puerto de salida.
goto Principal ; Crea un bucle cerrado e infinito.
Cuelgue
movlw b'10000000'
movwf PORTB ; Se muetra 0 en las salidas.
Sleep ; Se que en estado Sleep (Sueño) y no sale de ahí. Con lo cual,
; queda el pic inoperativo.
; Para volver a hacer funcionar el pic, hay que volve a grabar el pic.
; La entrada RA0 tiene que estar a 1, desde que se ponga a 0 entra en
; estado Sleep.
END ; Fin del programa.
Sistemas de protección de circuitos con pic