; Spinac ventilatoru po 24hod
; Verze programu:  1.1
; Obvod: PIC12F675, OSC interni = 4MHz
;*******************************************************************************************************
        list P=12F675, R=DEC
	include <P12F675.INC>
	ERRORLEVEL      -302    	; VYNECH HLASENI C.302 V BUILD RESULTS - BANK WARNING
	ERRORLEVEL      -306    	; VYNECH HLASENI C.306 V BUILD RESULTS - Crossing page boundary

RAM		EQU	020h	; prvni adresa pameti RAM je 20h  a posledni je 5Fh  - 64 bajtù
;**********************************************************************************************************************
TMP_W		EQU	RAM	; temp preruseni
TMP_S		EQU	RAM+01	; temp preruseni
;**********************************************************************************************************************
;		EQU	RAM+02	; POMOCNY REGISTR
;		EQU	RAM+03	; POMOCNY REGISTR 
;**********************************************************************************************************************
REGZAP		EQU	RAM+04	; POMOCNY REGISTR
TMP0		EQU	RAM+05	; TEMP REGISTR

;POCITANI JE POMOCI WATCHDOGU PO 2,304s, TAKZE NEJEDNA SE O PRESNY CASOVAC ALE O PRIBLIZNE CASOVANI ZAPNUTI A VPNUTI VENTILATORU
CASOVANI_S	EQU	RAM+06	; REGISTR POCITANI CASU - SEKUNDY
CASOVANI_M	EQU	RAM+07	; REGISTR POCITANI CASU - MINUTY
CASOVANI_H	EQU	RAM+08	; REGISTR POCITANI CASU - HODINY
;******************************
CAS_S_PAUZA	EQU	.26;.4	;CAS VYDELEN NA 1 MINUTU
; 60s : 2,3s = 26,x   (2,3 JE PERIODA PROBUZENI OBVODU ZE SLEEPu WATCHDOGEM S PREDDELICKOU PRIPOJENOU V OPTIONu)
CAS_M_PAUZA	EQU	.60;.1	
; 1m x 60 = 60min = 1hod.   
CAS_H_PAUZA	EQU	.24;.1
; 1hod. x 24 = 24hodin
;******************************
CAS_S_BEZI	EQU	.1;.26	;CAS VYDELEN NA 1 MINUTU
; 60s : 2,3s = 26,x   (2,304 JE PERIODA PROBUZENI OBVODU ZE SLEEPu WATCHDOGEM S PREDDELICKOU PRIPOJENOU V OPTIONu)
CAS_M_BEZI	EQU	.1;.15	
; 1m x 15 = 15min   
CAS_H_BEZI	EQU	.1
; 1hod. x 1 = 0hodin
;********************************************************************************************************************** 
;**********************************************************************************************************************
        ;DEFINICE ZKRATEK A K NIM PRIRAZENYCH I/O PINU
        ;---------------------------------------------;
;#define		 GPIO,0 ; NONE
;#define       		 	; NONE
#define	        TLACITKO GPIO,2 ; TLACITKO RUCNIHO PREPNUTI REZIU BEZI/PAUZA
#define	        MCLR     GPIO,3 ; RESET PROCESORU (NAVRAT NA ADR. 0x00)
;#define       		 GPIO,4 ; NONE
#define		RELE	 GPIO,5 ; VYSTUP NA RELE

;**********************************************************************************************************************
	org	0x2007		; adresa konfiguracniho slova PIC12F675
	__CONFIG 0x038C		; WATCHDOG ON, GP3/MCLR - INTERNI MCLR,OSC=int.RC bez CLK,POR=ON, CP=OFF, BOR=OFF.
;******************** Nastavení dat v EEPROM  *************************************************************************
; 00h - 4Fh - bajty
; 50h - 7Fh - bajty

	org	0x2100		; tabulka v pameti EEPROM (128 bajtu)

	de	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff	; 			   ( 00h )
	de	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff	; 			   (  .  )
	de	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff	; 			   (  .  )
	de	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff	; 			   (  .  )
	de	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff	; 			   (  .  )
	de	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff	; 			   (  .  )
	de	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff	; 			   (  .  )
	de	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff	; 			   ( 3Fh )

	de	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff	; 			   ( 40h )
	de	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff	; 			   (  .  )
	de	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff	; 			   (  .  )
	de	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff	; 			   (  .  )
	de	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff	; 			   (  .  )
	de	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff	; 			   (  .  )
	de	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff	; 			   (  .  )
	de	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff	; 			   ( 7Fh )

;********************************************************************************************************************** 
;********************     Reset procesoru     ********************
;*********************************************************************************
	org	0x0000
	CLRWDT
        CLRF    STATUS
	GOTO	START
;********************************************************************************************************************** 
	org	0x0004
	NOP
	BCF	INTCON,INTF	;ZRUS PRIZNAK PRERUSENI TLACITKEM (GP2)
	RETFIE
;********************************************************************************************************************** 
;********************************************************************************************************************** 
START	;INIT_SW
        MOVLW   0x07            ;NASTAVENI
        MOVWF   CMCON
 	CLRF	ADCON0		;VYPNUTI AD PREVODU
        BSF     STATUS,RP0      ;BANKA 1
        CLRF  	VRCON           ;NASTAVENI 
	MOVLW	B'00010000'	;PRERUSENI SESTUPNOU HRANOU NA GP2/INT, GIE=0, BUDE SE VYUZIVAT POUZE PROBUZENI ZE SLEEP ALE BEZ PROVEDENI RUTINY PRERUSENI.        
        MOVWF	INTCON		;ZAKAZANI PRERUSENI
	MOVLW	B'00000100'	
        MOVWF   WPU     	;POVOLENI PULL-UPu NA GP2/INT, OSTATNI OFF
	MOVLW	B'00000000'
	MOVWF   IOC		;NASTAVENI POVOLENI PRERUSENI PRI ZMENE NA URCITYCH VSTUPECH      
        CLRF    ANSEL         
        MOVLW   B'00001111'     ;GLOBALN ENABLE PULL-UP POVOLEN, GP2/INT REGUJE NA SESTUPNOU HRANU SIGNALU, PREDDELICKA K WDT, DELENI 1:256
        MOVWF   OPTION_REG
        BCF     STATUS,RP0      ;BANKA 0       
;********************************************************************************************************************** 
	;INIT_HW                ;NASTAVENI I/O
        CLRF    GPIO            ;VYMAZANI VYSTUPU - NASTAVENI VYCHOZIHO STAVU
        BSF     STATUS,RP0      ;BANKA 1
        MOVLW   B'00001100'            
        MOVWF   TRISIO

        CALL	0x03FF 		;KALIBRACE VNITRNIHO OSCILATORU 
        MOVWF   OSCCAL
        
        BCF     STATUS,RP0      ;BANKA 0
;********************************************************************************************************************** 
        CLRF    REGZAP          ;VYNULOVANI REGISTRU REGZAP
	GOTO	ZAPNI_RELE	;STAV PO ZAPNUTI JE ZAPNUTE RELE	
;********************************************************************************************************************** 
;********************************************************************************************************************** 
;********************************************************************************************************************** 
HL_PROG
        ;UVEDENI DO REZIMU SLEEP
	NOP
        SLEEP                   ;AKTIVUJ REZIM SLEEP - PRUBUZENI NASTANE SESTUPNOU HRANOU NA PINU GPIO,2
        NOP                     ;PRAZDNA OPERACE PRO PROBUZENI
	BTFSC	STATUS,NOT_TO	;POKUD JE PROBUZENI WATCHDOGEM, JE TENTO BIT NASTAVENEJ AUTOMATICKY DO 0, PRI UVADENI OBVODU DO SLEEP SE AUTOMATICKY NASTAVUJE DO 1.
	GOTO	OSETRENI_TL	;PROBUZENI BYLO ZMACKNUTIM TLACITKA, OSETRI TENTO STAV	
				;PROBUZENI NASTALO PRETECENIM WATCHDOGU, PROVED POCITANI CASU
	BCF	INTCON,INTF	;ZRUS PRIZNAK PRERUSENI TLACITKEM (GP2) (POKUD BYL NASTAVEN)
	BSF	INTCON,INTE	;POVOL PRERUSENI INT/GP2 (POKUD BYLO VYPNUTE KVULI ODSTRANENI ZAKMITU)
	BTFSC	RELE		;POKUD JE RELE V 1, POCITA SE CAS BEHU
	GOTO	RELE_SEPNUTE	;RELE JE ZAPNUTE, POCITEJ DOBU ZAPNUTI RELE
;	GOTO 	RELE_VYPNUTE	;RELE JE VYPNUTE, POCITEJ DOBU VYPNUTEHO RELE
;------------------------------------------------------------------------------	 
RELE_VYPNUTE
 	DECFSZ	CASOVANI_S,F	;CAS-1, JE NULA?
        GOTO    HL_PROG         ;JDI NA ZACATEK PROGRAMU
	MOVLW	CAS_S_PAUZA	;NACTI CAS PAUZY
	MOVWF	CASOVANI_S	;A NAHRAJ JEJ DO PRISLUSNEHO REGISTRU
	
	DECFSZ	CASOVANI_M,F	;CAS-1, JE NULA?
        GOTO    HL_PROG         ;JDI NA ZACATEK PROGRAMU
        MOVLW	CAS_M_PAUZA	;NACTI CAS PAUZY
	MOVWF	CASOVANI_M	;A NAHRAJ JEJ DO PRISLUSNEHO REGISTRU
	
	DECFSZ	CASOVANI_H,F	;CAS-1, JE NULA?
        GOTO    HL_PROG         ;JDI NA ZACATEK PROGRAMU 
;	MOVLW	CAS_H_PAUZA	;NACTI CAS PAUZY
;	MOVWF	CASOVANI_H	;A NAHRAJ JEJ DO PRISLUSNEHO REGISTRU	
ZAPNI_RELE
	BSF	RELE		;AKTIVUJ RELE
	
	MOVLW	CAS_S_BEZI	;NACTI CAS BEHU
	MOVWF	CASOVANI_S	;A NAHRAJ JEJ DO PRISLUSNEHO REGISTRU
        MOVLW	CAS_M_BEZI	;NACTI CAS BEHU
	MOVWF	CASOVANI_M	;A NAHRAJ JEJ DO PRISLUSNEHO REGISTRU
	MOVLW	CAS_H_BEZI	;NACTI CAS BEHU
	MOVWF	CASOVANI_H	;A NAHRAJ JEJ DO PRISLUSNEHO REGISTRU	
		
        GOTO    HL_PROG         ;JDI NA ZACATEK PROGRAMU	
;------------------------------------------------------------------------------
RELE_SEPNUTE	;RELE JE ZAPNUTE, VYPNI JEJ A NASTAV CAS PAUZY       
	DECFSZ	CASOVANI_S,F	;CAS-1, JE NULA?
        GOTO    HL_PROG         ;JDI NA ZACATEK PROGRAMU
	MOVLW	CAS_S_BEZI	;NACTI CAS BEHU
	MOVWF	CASOVANI_S	;A NAHRAJ JEJ DO PRISLUSNEHO REGISTRU
	
	DECFSZ	CASOVANI_M,F	;CAS-1, JE NULA?
        GOTO    HL_PROG         ;JDI NA ZACATEK PROGRAMU
        MOVLW	CAS_M_BEZI	;NACTI CAS BEHU
	MOVWF	CASOVANI_M	;A NAHRAJ JEJ DO PRISLUSNEHO REGISTRU
	
	DECFSZ	CASOVANI_H,F	;CAS-1, JE NULA?
        GOTO    HL_PROG         ;JDI NA ZACATEK PROGRAMU 
;	MOVLW	CAS_H_BEZI	;NACTI CAS BEHU
;	MOVWF	CASOVANI_H	;A NAHRAJ JEJ DO PRISLUSNEHO REGISTRU
VYPNI_RELE
	BCF	RELE		;DEAKTIVUJ RELE	
	        
	MOVLW	CAS_S_PAUZA	;NACTI CAS PAUZY
	MOVWF	CASOVANI_S	;A NAHRAJ JEJ DO PRISLUSNEHO REGISTRU
        MOVLW	CAS_M_PAUZA	;NACTI CAS PAUZY
	MOVWF	CASOVANI_M	;A NAHRAJ JEJ DO PRISLUSNEHO REGISTRU
	MOVLW	CAS_H_PAUZA	;NACTI CAS PAUZY
	MOVWF	CASOVANI_H	;A NAHRAJ JEJ DO PRISLUSNEHO REGISTRU	
	
        GOTO    HL_PROG         ;JDI NA ZACATEK PROGRAMU
;********************************************************************************************************************** 
;********************************************************************************************************************** 
OSETRENI_TL
	BCF	INTCON,INTE	;ZAKAZ PRERUSENI INT/GP2 PRO ODSTRANENI ZAKMITU. POVOLI SE AZ PO PROBUZENI ZE SLEEP WATCHDOGEM.
;	BCF	INTCON,INTF	;ZRUS PRIZNAK PRERUSENI TLACITKEM (GP2)
	
	BTFSC	RELE		;TEST, ZDA JE RELE ZAPNUTE
	GOTO	VYPNI_RELE	;RELE JE ZAPNUTE, VYPNI JEJ A NASTAV CAS PAUZY
	GOTO 	ZAPNI_RELE	;RELE JE VYPNUTE, ZAPNI JEJ A NASTAV CAS BEHU
;       GOTO    HL_PROG         ;JDI NA ZACATEK PROGRAMU
;********************************************************************************************************************** 
;********************************************************************************************************************** 
;********************************************************************************************************************** 
	END
