; programma alarm voor PIC 16F84 ; Copyright (c) 2003 Vanderhaegen Bart ; list P=PIC16F84 include __FUSES _CP_OFF & _WDT_OFF & _XT_OSC &_PWRTE_OFF ; definities van registers TRISA EQU 85h ; config register poort A PORTA EQU 05h ; status register poort A PORTB EQU 06h ; config register poort B TRISB EQU 86h ; status register poort B OPTION_REG EQU 81h ZONEFLAG EQU 0dh ; statusregister alarm zones teller EQU 40h ; hulpteller 1 teller2 EQU 41h ; hulpteller 2 teller3 EQU 42h ; hulpteller 3 hulpflag EQU 43h ; declaraties I/O poorten #define _SEN1 PORTB,0 ; sensor 1 #define _SEN2 PORTB,1 ; sensor 2 #define _SEN3 PORTB,2 ; sensor 3 #define _SW1 PORTB,3 ; schakelaar 1 #define _SW2 PORTB,4 ; schakelaar 2 #define _SW3 PORTB,5 ; schakelaar 3 #define _LOCK PORTB,6 ; codeslot #define _BUZZ PORTA,0 ; buzzer #define _SIREN PORTA,1 ; sirene #define _IGAL ZONEFLAG,4 ; ignore alarm #define _IGALL PORTA,2 ; #define _ALFLAG hulpflag,0 ; bug: als het alarm is uitgeschakeld, blijft de LED toch branden! ORG 00H ; schijf programma op locatie 00H reset GOTO begin ; ga naar het begin v/h programma ORG 04H ; vector voor subroutine afhandeling CALL interrupt ; start de interrupt afhandeling BCF INTCON,2 ; wis de interrupt flag RETFIE ; verlaat de interrupt routine begin CLRF PORTA ; wis I/O poort A CLRF PORTB ; wis I/O poort B BSF 03,5 ; selecteer bank 1 CLRF TRISA ; stel RA in als output MOVLW 0FFH MOVWF TRISB ; stel RB in als input BCF 03,5 ; selecteer bank 0 ; initialiseer de tellers MOVLW 0FFH MOVWF teller MOVLW 05H MOVWF teller2 MOVLW 20H MOVWF teller3 ; initialiseer de variabelen MOVLW 00H MOVWF ZONEFLAG ; wis alle zoneflags BSF _IGAL ; wis de ignore alarm flag ; initialiseer de timer movlw 00h ;prescaler a 256 sur timer 0 bsf STATUS,RP0 ;banque 1 movwf OPTION_REG bcf STATUS,RP0 ;banque 0 clrf TMR0 ;255 x 256 x 1ęS =65 millisecondes movlw 0xA0 ;interrupt on timer 0 overflow movwf INTCON LOOP ; lees de sensoren in BTFSC _SEN1 CALL TRIG1 ; start TRIG1 als sensor 1 = aan BTFSC _SEN2 CALL TRIG2 ; start TRIG2 als sensor 2 = aan BTFSC _SEN3 CALL TRIG3 ; start TRIG3 als sensor 3 = aan ; lees de schakelaars in BTFSS _SW1 CALL UTRIG1 ; start UTRIG1 als switch 1 = uit BTFSS _SW2 CALL UTRIG2 ; start UTRIG2 als switch 2 = uit BTFSS _SW3 CALL UTRIG3 ; start UTRIG3 als switch 3 = uit ; lees het codeslot in BTFSC _LOCK CALL UTRIG11 ; start UTRIG11 als slot = aan ; activeer sirene indien nodig ;BCF _SIREN ; stop de sirene ;BTFSC ZONEFLAG,0 ;BSF _SIREN ; start SIREN als zoneflag 0 = aan ;BTFSC ZONEFLAG,1 ;BSF _SIREN ; start SIREN als zoneflag 1 = aan ;BTFSC ZONEFLAG,2 ;BSF _SIREN ; start SIREN als zoneflag 2 = aan ; activeer sirene indien nodig BCF _ALFLAG ; stop de sirene BTFSC ZONEFLAG,0 BSF _ALFLAG ; start SIREN als zoneflag 0 = aan BTFSC ZONEFLAG,1 BSF _ALFLAG ; start SIREN als zoneflag 1 = aan BTFSC ZONEFLAG,2 BSF _ALFLAG ; start SIREN als zoneflag 2 = aan ; activeer de sirene wanneer _ALFLAG = 1 BTFSC _ALFLAG BSF _SIREN ; toon de toestand van de _igall LED BCF _IGALL ; wis de igal led BTFSC _IGAL GOTO LOOP ; verlaat routine als flag = uit BTFSS _SW1 GOTO LOOP BSF _IGALL ; zet de led aan GOTO LOOP ;************************************************************************ ; Trigger routines ; Deze routines worden aangeroepen wanneer er een alarm optreed. Dan ; wordt gekeken of de zone wel actief is. Als dit zo is, zal de zone ; flag voor de betreffende zone geactiveerd worden. ;************************************************************************ TRIG1 BTFSC _IGAL RETURN ; verlaat routine als Igal = aan BTFSS _SW1 RETURN ; verlaat routine als switch 1 = uit BSF ZONEFLAG,3 ; stel zoneflag 3 = aan RETURN TRIG2 BTFSS _SW2 RETURN ; verlaat routine als switch 2 = uit BSF ZONEFLAG,1 ; stel zoneflag 1 = aan RETURN TRIG3 BTFSS _SW3 RETURN ; verlaat routine als switch 3 = uit BSF ZONEFLAG,2 ; stel zoneflag 2 = aan RETURN ;************************************************************************ ; Untrigger routines ; Deze routines worden aangeroepen wanneer er een schakelaar is ; uitgeschakeld. De zoneflags voor de betreffende zone zullen dan ; worden gedeactiveerd. ;************************************************************************ UTRIG1 BCF ZONEFLAG,3 ; wis alarm-gevaar BCF ZONEFLAG,0 ; wis alarm-toestand BCF PORTA,0 ; stop de buzzer BCF _IGAL MOVLW 20H ; reset pink teller voor alarm MOVWF teller3 RETURN UTRIG11 MOVLW 20H MOVWF teller3 BCF ZONEFLAG,3 ; stop het alarm, indien actief BCF ZONEFLAG,0 BCF PORTA,0 ; wis de buzzer MOVLW 0FFH MOVWF teller MOVLW 05H MOVWF teller2 MOVLW 20H MOVWF teller3 BSF _IGAL ; set the ignore alarm flag! RETURN UTRIG2 BCF ZONEFLAG,1 RETURN UTRIG3 BCF ZONEFLAG,2 RETURN ;************************************************************************ ; Interrupt routine ; Deze routines worden aangeroepen wanneer er een schakelaar is ; uitgeschakeld. De zoneflags voor de betreffende zone zullen dan ; worden gedeactiveerd. ;************************************************************************ interrupt BTFSC _IGAL GOTO igal1 ; skip if ignore alarm = 1 BTFSS ZONEFLAG,3 RETURN ; exit als zone1 niet getriggerd BTFSC ZONEFLAG,0 RETURN ; exit als sirene reeds actief igal1 ; vertraging uitvoeren: vertragen van de beep snelheid DECFSZ teller,1 RETURN MOVLW 0FFH MOVWF teller DECFSZ teller2,1 RETURN MOVLW 05H MOVWF teller2 ; inverteer de toestand van de beeper BTFSC _IGAL GOTO igal2 ; skip if ignore alarm = 1 MOVLW 01H XORWF PORTA,1 ; inverteer de buzzer igal2 ; vertraging uitvoeren: bepaalt aantal beepjes DECFSZ teller3,1 RETURN MOVLW 20H MOVWF teller3 ; activeren van het alarm! BTFSC _IGAL GOTO igal3 ; skip if ignore alarm = 1 BCF PORTA,0 ; wis de buzzer BCF ZONEFLAG,3 ; wis de pre-alarm indicatie BSF ZONEFLAG,0 ; zet alarm zoneflag RETURN igal3 BCF _IGAL ; clear the ignore alarm flag RETURN END