;** PIC16F84A HÄLYTIN ***************************************** ; ; GSM-puhelimen hälytinohjaus ; Teppo Rinne ; ; PORTA, 2 = Sisävalo ; PORTA, 3 [laajennuksille] ; PORTA, 4 = ON/OFF-kytkin ; PORTB, 0 = Soittolinja ; PORTB, 1 = Viiveledi ; PORTB, 2 [laajennuksille] ; PORTB, 3 = Hälytys päällä -ledi ; ; ;** VERSIOHISTORIA ******************************************** ; ; v 0.1 25.04.2005 ; - Saatu eka prototyyppi toimimaan ; v 0.2 28.04.2005 ; - Lisätty RESET-aliohjelma ; - Lisätty viive estämään soitto hälytyksen kytkennässä ; v 0.3 30.04.2005 ; - Resetistä poistettu ON/OFF-kytkimen päälläolopakko ; - Uusittu sisääntulonastat ja tulot/lähdöt nimetty ; - Ensimmäinen prototyyppi ;************************************************************** include "p16f84a.inc" __CONFIG _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF viive equ 0x0c ; viive-muuttuja DELAY-funktiota varten sisempi equ 0x0d ulompi equ 0x0e sisavalo equ 2 kytkin equ 4 rele equ 0 ledi equ 1 halyledi equ 3 org 0x00 goto ALUSTUS ALUSTUS ; Alustetaan PORTB clrf PORTB ; Nollaa PORTB-rekisteri bsf STATUS, RP0 ; Vaihdetaan bankki (1) oikeaksi, jotta ; päästään käpistelemään TRISB-rekisteriä clrf TRISB ; Nollataan TRISB-rekisteri (eli määritetään ; jokainen B-portin bitti outputiksi (Nolla ; meinaa että out ja 1 = in)) ; Alustetaan PORTA movlw 0xFF ; Siiretään w-rekisteriin arvo 0xFFh movwf TRISA ; Siiretään w-rekisteri TRISA-rekisteriin ; Eli PORTA:n suuntarekisteriin jokainen ; bitti ykköseksi (kaikki PORTA:n I/O-pinnit ; ovat sisääntuloja) bcf STATUS, RP0 ; Nollataan bankinvalintabitti status- ; rekisteristä (Bankki 0 jälleen käytössä) goto MAIN_PROGRAM MAIN_PROGRAM ; Pääohjelma, pyörii standby-tilassa ; odotetaan että hälytys laitetaan päälle ; sen jälkeen 30 sek poistua autosta btfss PORTA, kytkin goto MAIN_PROGRAM ; <- RA1="0" movlw 0xFF ;siirretään w-rekisteriin sopiva viive movwf viive ;siirretään w-rekisteri call DELAY goto OVI_AUKI OVI_AUKI ; hälytys on päällä ja seurataan vain oven avautumista bsf PORTB, halyledi btfsc PORTA, sisavalo goto OVI_AUKI ; <- RA0="0" movlw 0x7F ; viive 15 s movwf viive ; siirretään w-rekisteri call DELAY bcf PORTB, halyledi goto ALARM DELAY bsf PORTB, ledi ; merkkiledi päälle ULOMMAN_ALKU movlw 0xFF ; w = 255 ; movlw 0x04 ; debug movwf ulompi SISEMMAN_ALKU movlw 0x96 ; movlw 0x02 ; debug movwf sisempi SISEMMAN2_ALKU decfsz sisempi, 1 goto SISEMMAN2_ALKU decfsz ulompi, 1 ; if sisempi != 0 goto SISEMMAN_ALKU decfsz viive, 1 ; if viive != 0 goto ULOMMAN_ALKU bcf PORTB, ledi ; merkkiledi pois return ; viivesilmukan loppu ALARM ; alussa testataan vielä, onko hälytys kytketty pois. ; 1 -> hypätään soittovaiheeseen ; 0 -> hypätään resetointitilaan btfss PORTA, kytkin goto RESET ; <- RA0="0" bsf PORTB, rele ; soitto päälle movlw 0x19 movwf viive call DELAY ; n. 3 sek bcf PORTB, rele goto RESET RESET ; odotustila, ettei soiteta jatkuvasti uudelleen ; päästään pois vain jos ovi käy kiinni btfss PORTA, sisavalo goto RESET ; <- RA0="1" movlw 0x7F movwf viive call DELAY ; viive 15 sek -> 7F goto MAIN_PROGRAM END