Paso 7: ahora para la parte difícil.
Esta foto es el producto final. Voy a dejar la electrónica como un ejercicio para el estudiante.
Aquí está el código para el PIC Micro 12F675:
;*****************************************************************************
; Nombre de archivo: Flatulant_Boss
; Procesador: 12F675
; Autor: Alan Mollick (alanmollick.com)
; Modo: Interrupción cambio de GP2
;
; ~ REGISTRA GPIO ~
; GP0 = entrada--n/c
; GP1 = salida, relé
; GP2 = entrada--alta = movimiento detectado
; GP3 = entrada--n/c
; GP4 = producción - LED rojo
;*****************************************************************************
lista p = 12F675; Directiva lista para definir procesador
#include < p12f675.inc >; definiciones de variables específicas del procesador
ERRORLEVEL-302; suprimir el mensaje 302 de archivo de la lista
CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
; ~ Variables de ~
w_temp EQU 0 x 20; variable utilizada para el ahorro del contexto
status_temp EQU 0x21; variable utilizada para el ahorro del contexto
hiB EQU 0x21; MSByte
lowB EQU 0x22; LSByte
Temp EQU 0x23
repuesto EQU 0x24
temp1 EQU 0x25; Bandera de interrupción de disparo
temp2 EQU 0x26
retardo EQU 0x27; tiempo de retardo
pernos de EQU 0x28; Estado del PIN
spare1 EQU 0x29
spare2 EQU 0x2a
cuenta EQU 0x2b; lazo cuenta
count1 EQU 0x2c; cuenta del lazo externo
count2 EQU 0x2d; cuenta del lazo externo
D1 EQU 0x2e; contador de retardo
D2 EQU 0x2f; contador de retardo
D3 EQU 0 x 30; contador de retardo
D4 EQU 0x31; contador de retardo
;**********************************************************************
RESET_VECTOR ORG 0X000; vector de reset del procesador
Goto principal; ir al principio del programa
INT_VECTOR ORG 0X004; Ubicación del vector de interrupción
movwf w_temp; guardar apagado W actual registro contenido
movf STATUS, w; entrar registro W a registro del estado
movwf status_temp; Ahorre descuento contenido del registro del estado
; código de ISR
Call motion_detect; enviar señales de alarma
banksel INTCON
BCF INTCON, INTF; limpiar bandera de GP2/INT
movf status_temp, w; recuperar copia del registro del estado
movwf STATUS; contenido del registro de estado de restauración pre-isr
swapf w_temp, f
swapf w_temp, w; restaurar el contenido del registro de pre-isr W
retfie; retorno de interrupción
;****************************************************************
principal:; principal del programa
; estas instrucciones primero 4 no son necesarias si no se utiliza el oscilador interno
Llame a 0x3FF; recuperar el valor de calibración de fábrica
bsf STATUS, RP0; Banco de registro de archivo el valor 1
movwf OSCCAL; registro de actualización con valor de fábrica cal
BCF STATUS, RP0; Banco de registro de archivo se establece en 0
;***********************************
; * Inicialización *
;***********************************
; GP0 = no usada, GP1 = salida de relé, GP2 = entrada (detección de movimiento),
; GP3 = entrada de control emergencia corte, GP4 = salida al indicador del LED,
; GP5 = no usada
; configurar dirección de pines de I/O
banksel TRISIO
movlw b '00000101'
; XX---no implementado
; --0---0 = salida, GP5 = n/c
; ---0---0 = salida, GP4 = LED
; ---x---no se utiliza, GP3, dedicada a MCLR
; ---1--1 = entrada, detecta movimiento de GP2
; ---0-0 = salida, GP1 = válvula solenoide
; ---1 1 = entrada GP0 = A/D
movwf TRISIO
; configurar el convertidor A/D
banksel ANSEL
movlw b '00010000'
; x---no implementado
; -001---001 = reloj de conversión Focs/8
; ---0---0 = entrada-salida digital, GP4, Fosc/4 clockout fines de depuración.
; ---0--0 = entrada-salida digital, GP2
; ---0-0 = entrada-salida digital, GP1, relé, etc.
; ---0 0 = entrada-salida digital, 1 = GP0 analógico
movwf ANSEL
banksel ADCON0
movlw b '00000000'
; 0---1 = resultado justificado a la derecha
; -0---0 = Vdd es referencia de voltaje
; --xx---no implementado
; ---00--00 = seleccionar el canal 0 (GP0)
; ---0-0 0 0/D conversión no iniciado
; ---0 0 = A/D convertidor módulo está apagado
movwf ADCON0
; Inicializa los pines de salida
init
banksel GPIO
movlw b '00000000'
movwf GPIO
; inicializar las interrupciones
banksel INTCON
movlw b '00000000'
; 0---0 = deshabilitadas las interrupciones globales
; -0---1 = habilitar las interrupciones periféricas
; --0---0 = disable TMR0 overflow interrupción
; ---1---1 = activar interrupción externa de GP2/INT
; ---0---0 = disable GPIO puerto cambio interrupción
; ---0--0 no = desbordamiento de TMR0 en
; ------0- 1=
; ---0 0 no = ningún cambio del puerto GPIO
movwf INTCON
; inicializar la interrupción cambio de pin GP2
banksel IOC
movlw b '00000100'
; x---no implementado
; -x---no implementado
; --0---0 = disable GP5
; ---0---0 = disable GP4
; ---0---0 = disable GP3
; ---1--1 = habilitar GP2/INTR ***
; ---0-0 = disable GP1
; ---0 0 = disable GP0
movwf IOC
banksel PIE1
movlw b '00000000'
; 0---0 = disable EE escribir interrupción completa
; -0---0 = interrupción del convertidor A/d de desactivar
; --xx---no implementado
; ---0---0 = interrupción comparador deshabilitado
; ---xx-no implementado
; ---0 1 = habilitar TMR1 overflow interrupción
movwf PIE1
banksel PIR1
movlw b '00000000'
; 0---0 no = escritura EE completa
; -0---0 no = completa de conversión A/D
; --xx---no implementado
; ---0---0 no = ninguna interrupción del comparador
; ---xx-no implementado
; ---0 0 no = desbordamiento de TMR1
movwf PIR1
;**********************************************************
; GP1 = salida a relé
; GP4 = salida para LED
;**********************************************************
banksel INTCON
BSF INTCON, INTE; habilitar interrupción de GP2
BSF INTCON, GIE
Main_Loop:
; Si GP2 = 1 entonces la salida de las señales de alarma en la GP1, GP4 via interrupción
sueño
NOP
Goto Main_Loop
;**********************************************************
; Manejador de interrupción de detección de movimiento
;
; GP1 = salida a relé, GP4 = salida para LED
;**********************************************************
motion_detect:
BSF GPIO, 1; energizar el relé de 100 mseg
llamar al pause_100ms
BCF GPIO, 1; desactivar el relé de
BSF GPIO, 4; activar LED durante 0,5 seg.
llamar al pause_500ms
BCF GPIO, 4
volver
;**********************************************************
; online generador de retardo
; http://massmind.org/techref/piclist/CODEGEN/Delay.htm
;**********************************************************
pause_100msec:
; Retardo = 0.1 segundos
; Frecuencia de reloj = 4 MHz
movlw 0x1F; 99998 ciclos
movwf d1
movlw 0x4F
movwf d2
Delay_100
decfsz d1, f
Goto $+ 2
decfsz d2, f
Goto Delay_100
Goto $+ 1; 2 ciclos
volver
pause_500msec:
; Retardo = 0,5 segundos
; Frecuencia de reloj = 4 MHz
movlw 0 x 03; 499994 ciclos
movwf d1
movlw 0x18
movwf d2
movlw 0 x 02
movwf d3
Delay_500
decfsz d1, f
Goto $+ 2
decfsz d2, f
Goto $+ 2
decfsz d3, f
Goto Delay_500
Goto $+ 1; 6 ciclos
Goto $+ 1
Goto $+ 1
volver
pause_1sec
; Retardo = 1 segundos
; Frecuencia de reloj = 4 MHz
movlw 0x08; 999997 ciclos
movwf d1
movlw 0x2F
movwf d2
movlw 0 x 03
movwf d3
Delay_1sec
decfsz d1, f
Goto $+ 2
decfsz d2, f
Goto $+ 2
decfsz d3, f
Goto Delay_1sec
Goto $+ 1; 3 ciclos
NOP
volver
;*****************************************************************************