;** 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 ; v 0.4 8.5.2005 ; - Lisätty merkkiledi vilkkuvaksi 0.3 s / 5 s ; - Koodi tehotonta mutta so what, riittää tässä sovelluksessa ;) ;************************************************************** include "p16f84a.inc" __CONFIG _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF viive equ 0x0c ; viive-muuttuja DELAY-funktiota varten sisempi equ 0x0d ; viivemuuttuja ulompi equ 0x0e ; viivemuuttuja 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 kunnes 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 VENAA VENAA ; tässä odotellaan että ovi aukaistaan, samalla vilkutetaan lediä ; pienillä loopeilla. Paskaa koodia, sanoisin bsf PORTB, halyledi ; merkkiledi päälle movlw 0xFF ; w = 255 movwf viive ULKO11 movlw 0xFF ; w = 255 movwf ulompi SISA11 btfss PORTA, sisavalo goto OVI_AUKI ; <- RA0="0" decfsz ulompi, 1 ; if sisempi != 0 goto SISA11 decfsz viive, 1 ; if viive != 0 goto ULKO11 bcf PORTB, halyledi ; merkkiledi pois ; uudestaan, uudestaan movlw 0x10 movwf viive ULKO21 movlw 0xFF ; w = 255 movwf ulompi SISA21 movlw 0xFF movwf sisempi SISA22 btfss PORTA, sisavalo goto OVI_AUKI ; <- RA0="0" decfsz sisempi, 1 goto SISA22 decfsz ulompi, 1 ; if sisempi != 0 goto SISA21 decfsz viive, 1 ; if viive != 0 goto ULKO21 goto VENAA ; mennään takaisin alkuun OVI_AUKI ; ovi on avautunut, asetetaan viive ja mennään ALARM-aliohjelmaan bcf PORTB, halyledi ; merkkiledi pois movlw 0x7F ; viive 15 s movwf viive ; siirretään w-rekisteri call DELAY bcf PORTB, halyledi goto ALARM DELAY ; viive-muuttuja määrää silmukoissa vietetyn ajan ; t ~= 3 x 255 x 150 x viive (0...255) x 1 us ; jolloin FF ~= 30 s bsf PORTB, ledi ; merkkiledi päälle ULOMMAN_ALKU movlw 0xFF ; w = 255 movwf ulompi SISEMMAN_ALKU movlw 0x96 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