; Smoke Transmitter
Device 12F629
Config CPD_OFF, CP_OFF, BODEN_OFF, MCLRE_OFF, PWRTE_ON, WDT_ON, XT_OSC
Declare Watchdog = On
All_Digital True
Xtal = 4
; PSA Watchdog
Symbol PS0 = OPTION_REG.0 ' Prescaler Rate Select
Symbol PS1 = OPTION_REG.1 ' Prescaler Rate Select
Symbol PS2 = OPTION_REG.2 ' Prescaler Rate Select
Symbol PSA = OPTION_REG.3 ' Prescaler Assignment
Dim test_teller As Word
Dim teller2 As Word
Dim smokealarm As Bit
Dim teller As Word
Dim notactive_timer As Word
Dim tel As Word
Dim x As Byte
Dim BD1 As Byte
Dim aantal_lowbat As Byte
; 76543210
PORTB = %00000000
TRISB = %00000010
; Initialize watchdog
PSA = 1 ;Assign postscaler to watchdog
PS0 = 1 ;Postscaler = 1:128 (bit 2^3 = 8 of divider -> 1:128. Means: 18ms * 128 ~ 2.3 sec approx)
PS1 = 1
PS2 = 1
Clear ; wis alle ram geheugen
DelayMS 500 ;stabilisatie signalen
INTCON.7 = 0 ; Interupt Handler uit zetten
INTCON.3 = 1 ; GPIO Port Change Interupt enable
IOC = %00000010 ;Interrupt On Change voor GPIO.1 inschakelen
; ======= HOOFDLUS ========
Main:
BD1 = PORTB ;Lees "This wil end the mismatch condition" in de datasheet
INTCON.0 = 0
Sleep
If STATUS.4 = 0 Then
Inc test_teller ; WDT reset
If test_teller > 1000 Then
Clear test_teller
GoTo test_signal
EndIf
EndIf
If STATUS.4 = 1 Then GoTo verder
GoTo Main
verder:
Inc notactive_timer
If notactive_timer > 7000 Then GoTo sleepmode ; meer als 70 seconden geen alarm meer gehoord ?
If smokealarm = 1 Then Inc teller2
If teller2 > 1500 Then ; test of er 15 seconden aan stilte is verstreken na een rookalarm
Clear smokealarm
Clear teller2
GoTo Main
EndIf
If PORTB.1 = 1 Then GoTo check_count ; sirene uitgang hoog
DelayMS 10
GoTo verder
sleepmode:
If PORTB.1 = 0 Then ; Geen sirene en geen lowbatmeldingen?
DelayMS 100
If PORTB.1 = 0 Then ; Nogmaals testen
DelayMS 50
Clear notactive_timer
GoTo Main
EndIf
EndIf
GoTo Main ; voor de zekerheid
check_count:
Clear notactive_timer
tel = Counter PORTB.1, 3000
If tel > 200 Then fire
GoTo Main
;===================== Sirene rookmelder is aan ========================
fire:
Clear teller2
smokealarm = 1
High PORTB.0 ; Zender aan
DelayMS 1000 ; stabilisatie zender
SerOut PORTB.2, 813, [170, 170, 170, 170, 170, 170, 170]
For x = 1 To 14
SerOut PORTB.2, 813, [23, 36, 73, 9, 16, 1]
Next x
Low PORTB.0 ; Zender uit
DelayMS 2000 ; 3 seconden wachten alvorens weer te testen
GoTo verder
test_signal:
High PORTB.0 ; Zender aan
DelayMS 1000 ; stabilisatie zender
SerOut PORTB.2, 813, [170, 170, 170, 170, 170, 170, 170]
For x = 1 To 14
SerOut PORTB.2, 813, [23, 36, 73, 9, 16, 3]
Next x
Low PORTB.0 ; Zender uit
GoTo Main