Flatulant Boss detektor (7 / 9 steg)
Steg 7: nu för den svåra biten.
Denna bild är slutprodukten. Jag lämnar elektroniken som en övning för studenten.
Här är koden för PIC Micro 12F675:
;*****************************************************************************
; Filnamn: Flatulant_Boss
; Processor: 12F675
; Författare: Alan Mollick (alanmollick.com)
; Läge: Avbryta på GP2 förändring
;
; ~ GPIO REGISTRERAR ~
; GP0 = ingång--n/c
; GP1 = utgång--relay
; GP2 = INPUT--hög = rörelse upptäcks
; GP3 = ingång--n/c
; GP4 = utgång--röd LED
;*****************************************************************************
lista över p = 12F675; lista direktiv att definiera processor
#include < p12f675.inc >; processorn varierande definitioner
ERRORLEVEL-302; dölja meddelandet 302 från listan över
CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
; ~ Variabler ~
w_temp EQU 0x20; variabel som används för ramen besparing
status_temp EQU 0x21; variabel som används för ramen besparing
hiB EQU 0x21; MSByte
lowB EQU 0x22; LSByte
Temp EQU 0x23
extra EQU 0x24
temp1 EQU 0x25; utlösa avbrott flagga
temp2 EQU 0x26
dröjsmål EQU 0x27; fördröjningstiden
Pins EQU 0x28; PIN staten
spare1 EQU 0x29
spare2 EQU 0x2a
greve EQU 0x2b; loop greve
count1 EQU 0x2c; yttre loopen greve
count2 EQU 0x2d; yttre loopen greve
D1 EQU 0x2e; dröjsmål counter
D2 EQU 0x2f; dröjsmål counter
D3 EQU 0x30; dröjsmål counter
D4 EQU 0x31; dröjsmål counter
;**********************************************************************
RESET_VECTOR ORG 0X000; processorn återställa vektor
gå till huvudsakliga; gå till början av program
INT_VECTOR ORG 0X004; avbrott vektor läge
movwf w_temp; spara av nuvarande W registrera innehållet
movf STATUS, w; flytta statusregistret till W register
movwf status_temp; besparing av innehållet i STATUS register
; ISR kod
kalla motion_detect; Skicka varningssignaler
banksel INTCON
BCF INTCON, ITF; Rensa GP2/INT flagga
movf status_temp, w; Hämta kopia av STATUS register
movwf STATUS, restaurera pre-isr STATUS register innehållet
swapf w_temp, f
swapf w_temp, w; återställa pre-isr W register innehållet
retfie; returnera från avbrott
;****************************************************************
huvudsakliga:; huvudprogrammet
; dessa första 4 instruktioner behövs inte om intern oscillator inte används
kalla 0x3FF; Hämta fabriken kalibreringsvärde
BSF STATUS, RP0; sätta filen register bank till 1
movwf OSCCAL; Uppdatera registret med fabriken cal värde
BCF STATUS, RP0; Anger filen register bank 0
;***********************************
; * Initiering *
;***********************************
; GP0 = inte används, GP1 = reläutgång, GP2 = input (motion detect),
; GP3 = ingång för cntrl/emergency cutoff, GP4 = utgång till LED-indikator,
; GP5 = inte används
; ställa in riktning I/O Pins
banksel TRISIO
movlw b '00000101'
; xx---inte genomfört
; --0---0 = utgång, GP5 = n/c
; ---0---0 = utgång, GP4 = LED
; ---x---inte används, GP3, tillägnad MCLR
; ---1--1 = ingång, GP2 rörelse upptäcks
; ---0-0 = utgång, GP1 = magnetventil
; ---1 1 = ingång GP0 = A/D
movwf TRISIO
; Ställ in A/D-omvandlare
banksel ANSEL
movlw b '00010000'
; x---inte genomfört
; -001---001 = Focs/8 konvertering klocka
; ---0---0 = digital I/O, GP4, Fosc/4 clockout för debug ändamål.
; ---0--0 = digital I/O, GP2
; ---0-0 = digital I/O, GP1, relä/etc
; ---0 0 = digital i/o, 1 = analoga GP0
movwf ANSEL
banksel ADCON0
movlw b '00000000'
; 0---1 = rätt motiverade resultat
; -0---0 = Vdd är spänning referens
; --xx---inte genomfört
; ---00--00 = välja kanal 0 (GP0)
; ---0-0 0 0/D omvandling inte startat
; ---0 0 = A/D-omvandlare-modulen är avstängd
movwf ADCON0
; initiera utgångsstift
init
banksel GPIO
movlw b '00000000'
movwf GPIO
; initiera avbryter
banksel INTCON
movlw b '00000000'
; 0---0 = global avbryter inaktiverad
; -0---1 = aktivera perifera avbryter
; --0---0 = inaktivera TMR0 overflow avbrott
; ---1---1 = aktivera GP2/INT yttre mellanjobb
; ---0---0 = inaktivera GPIO port förändring avbrott
; ---0--0 = ingen på TMR0 overflow
; ------0- 1=
; ---0 0 = ingen GPIO port förändring
movwf INTCON
; initiera avbrott på stift ändra GP2
banksel IOCEN
movlw b "00000100"
; x---inte genomfört
; -x---inte genomfört
; --0---0 = inaktivera GP5
; ---0---0 = inaktivera GP4
; ---0---0 = inaktivera GP3
; ---1--1 = aktivera GP2/INTR ***
; ---0-0 = inaktivera GP1
; ---0 0 = inaktivera GP0
movwf IOCEN
banksel PIE1
movlw b '00000000'
; 0---0 = inaktivera EE skriva komplett avbrott
; -0---0 = inaktivera A/D-omvandlare avbrott
; --xx---inte genomfört
; ---0---0 = komparator avbrott inaktiverad
; ---xx-inte genomfört
; ---0 1 = aktivera TMR1 overflow avbrott
movwf PIE1
banksel PIR1
movlw b '00000000'
; 0---0 = ingen EE skriva komplett
; -0---0 = ingen A/D omvandling komplett
; --xx---inte genomfört
; ---0---0 = ingen kontrollapparat avbrott
; ---xx-inte genomfört
; ---0 0 = ingen TMR1 overflow
movwf PIR1
;**********************************************************
; GP1 = utgång till relä
; GP4 = utgång till LED
;**********************************************************
banksel INTCON
BSF INTCON, INTE; Aktivera GP2-avbrott
BSF INTCON, GIE
Main_Loop:
; om GP2 = 1 sedan utgång varningssignaler på GP1, GP4 via avbrott
sömn
NOP
gå till Main_Loop
;**********************************************************
; Motion Detection avbrottshanterare
;
; GP1 = utgång till relä, GP4 = utgång till LED
;**********************************************************
motion_detect:
BSF GPIO, 1; vitalisera relä för 100 MSEK
kalla pause_100ms
BCF GPIO, 1; de-aktivera relä
BSF GPIO, 4. Aktivera LED för 0.5 sek.
kalla pause_500ms
BCF GPIO, 4
returnera
;**********************************************************
; Online dröjsmål kodgenerator
; http://massmind.org/techref/piclist/Codegen/Delay.htm
;**********************************************************
pause_100msec:
; Delay = 0.1 sekunder
; Klockfrekvensen = 4 MHz
movlw 0x1F; 99998 cykler
movwf d1
movlw 0x4F
movwf d2
Delay_100
decfsz d1, f
gå till $+ 2
decfsz d2, f
gå till Delay_100
gå till $+ 1; 2 cykler
returnera
pause_500msec:
; Delay = 0,5 sekunder
; Klockfrekvensen = 4 MHz
movlw 0x03; 499994 cykler
movwf d1
movlw 0x18
movwf d2
movlw 0x02
movwf d3
Delay_500
decfsz d1, f
gå till $+ 2
decfsz d2, f
gå till $+ 2
decfsz d3, f
gå till Delay_500
gå till $+ 1, 6 cykler
gå till $+ 1
gå till $+ 1
returnera
pause_1sec
; Delay = 1 sekunder
; Klockfrekvensen = 4 MHz
movlw 0x08; 999997 cykler
movwf d1
movlw 0x2F
movwf d2
movlw 0x03
movwf d3
Delay_1sec
decfsz d1, f
gå till $+ 2
decfsz d2, f
gå till $+ 2
decfsz d3, f
gå till Delay_1sec
gå till $+ 1, 3 cykler
NOP
returnera
;*****************************************************************************