;*********************************************************
;Program pro PIC12F508, vnitřní osc 4MHz
;tlačítko na GP3 proti GND, pull-up odpor na Ucc
;indikační LED na GP0 proti Ucc
;po stisku TL začne uP čítat po dobu cca 2h, LED bliká 1x za sek. poté indikace blikáním 2x za sek.
;LED1(GP0),zvuková signalizace po dobu 1min. Poté přechod do SLEEP režimu
;aktivace stiskem TL. V době čítání dlouhý stisk(cca3s)TL vyvolá reset času.
;*****************************************************************
;****************************************************************
		include "P12F508.inc"
		__config	_CP_OFF	& _MCLRE_OFF & _WDT_OFF & _IntRC_OSC
;****************************************************************
TMR1	equ	10h
TMR2	equ	11h
TMR3	equ	12h
TMR4	equ	13h 
Timer1	equ	14h
Time	equ	15h

#define LED1	GPIO,0
#define	TL	GPIO,3
#define	OUTA	GPIO,4
#define	OUTB	GPIO,5
;****************************************************************
		org	000h
		goto	Init		
;***************************************************************
Delay4ms
		movlw	.250
		movwf	TMR2
		movlw	.4
		movwf	TMR1
		decfsz	TMR1,F
		goto	$-1
		decfsz	TMR2,F
		goto	$-5
		retlw	00h
;.........................................................
Ton
		movlw	.12
		movwf	TMR2
Ton2
		bcf	OUTA
		bsf	OUTB
		call	Ton1	
		bsf	OUTA
		bcf	OUTB
		call	Ton1	
		movlw	.4
		movwf	TMR1
		decfsz	TMR1,F
		goto	$-1
		nop
		nop
		nop
		decfsz	TMR2,F
		goto	Ton2
		retlw	00h	
Ton1
		movlw	.50
		movwf	TMR1
		decfsz	TMR1,F
		goto	$-1
		retlw	00h
;*****************************************************************
;9.2.2     Vnitřní taktovací oscilátor 4 MHz
;Vnitřní oscilátor má po kalibraci základní pracovní frekvenci 4 MHz. Podrobnější informace o přesnosti oscilátoru jsou uvedeny v 
;kapitole 12.0
;.Výrobce mikropočítače umísťuje do každého mikropočítače kalibrační konstantu v podobě instrukce RETLW, která je umístěna na
;poslední adresovatelné buňce paměti programu. Tuto poslední pozici je vždy možné z mikropočítače vyčíst nezávisle na případném
;nastavení ochrany kódu proti vyčtení. Po resetu mikropočítače dojde k nastavení adresy právě na poslední buňku paměti programu.
;Mikropočítač vykoná instrukci RWTLW xx a tím přesune kalibrační konstantu do střadače. Následuje přetečení programového čítače PC
;a další vykonaná instrukce leží na adrese 0000h, což je tzv. vektor Resetu. Uživatel tak může první instrukcí svého programu zapsat
;kalibrační konstantu ze střadače do registru OSCCAL (adresa 05h) nebo může tento postup ignorovat.
;Okamžikem zápisu kalibrační konstanty do registru OSCCAL je definována taktovací frekvence. Obsah registru OSCCAL a tím i taktovací
;frekvence jsou po signálu reset náhodné.
;Poznámka:
;Smazáním obsahu paměti programu dojde i k neobnovitelnému smazání kalibrační konstanty. Před mazáním této
;paměti  je  nutné  vyčíst  kalibrační  konstantu  a  zapamatovat  si  ji,  pro  pozdější  správnou  kalibraci  taktovacího
;oscilátoru.
Init	
		movwf	OSCCAL			;vloží kalibrační konstantu načtenou z 1FFh
		movlw	b'11001110'		;GP4-GP5 a GP0-GP1 výstup, GP2-GP3 vstup
		tris	GPIO
		movlw	b'00001111'		;LED off
		option
;Test TL -  Start programu, aktivní v 0
		btfsc	TL				;Testuj, pokud 0 skok o 1
		goto	$-1				;Pokud 1 opakuj Test
;čekání 8ms po stisku TL - ustálení stavu, ošetření zákmitů
		call	Delay4ms		;bylo stisknuto čekej 4ms
		call	Delay4ms		;čekej 4ms
		btfsc	TL				;Testuj znovu
		goto	$-4				;Pokud 1 opakuj

;provede se test po dobu 1s svítí LED a píská piezo 
Start
		movlw	.250
		movwf	TMR3
Test
		bcf	LED1				;LED on
		call	Ton				;cca 4ms
		decf	TMR3,F
		btfss	STATUS,Z
		goto	Test
		bsf	LED1				;LED off
;32 x 225 = 7200s tj. 2h
		movlw	.32				
		movwf	TMR3			;Time1 = 32
		movlw	.225
		movwf	TMR4			;Time2 = 225
		movlw	.250
		movwf	Timer1
Opak
		call	Delay4ms
;4ms x 250 = 1s
		decf	Timer1,F		;každé 4ms sniž o 1 
		btfss	STATUS,Z
		goto	Opak			;Opakuj dokud Timer1 > 0

		movlw	.250
		movwf	Timer1			;Znovu naplnění časovače

;bliknutí LED1 1x za sekundu(kontrola činosti),aktivní v 0
		btfsc	LED1			;Test LED
		goto	$+3				;sem pokud LED off
		bsf	LED1				;sem pokud LED on, LED off
		goto	$+2				;Přejdi o 1
		bcf	LED1				;LED = 0	
		incf	Time,F
;Test TL pokud stisknuto 3s provede reset, aktivní v 0
		btfsc	TL				
		goto	Time1			;nebylo stisknuto, reset Time
		movf	Time,W			;stisk, načti stav Time
		xorlw	.3				;je Time = 3 ?
		btfsc	STATUS,Z
		goto	Start			;Ano Time = 3, reset
		goto	$+2				;Ne, pokračuj, ale neresetuj Time
Time1
		clrf	Time			;Time = 0
		decf	TMR3,F			;sniž o 1 (32x)
		btfss	STATUS,Z
		goto	Opak			;opakuj dokud není = 0

		movlw	.32
		movwf	TMR3
Time2
		decf	TMR4,F			;sniž o 1 (225x)
		btfss	STATUS,Z
		goto	Opak			;opakuj 
;Po uplynutí 2h následuje 1min pískání piezo a blikání LED 2x za sek.

		movlw	.60
		movwf	TMR3			;60s
		movlw	.2
		movwf	Time
		movlw	.125
		movwf	Timer1
Opak2
;125 x 4ms = 0,5s x 2 = 1s
		call	Ton
		
		decf	Timer1,F		;Po 4ms sniž o 1 
		btfss	STATUS,Z
		goto	Opak2			;Opakuj dokud Timer1 > 0

		movlw	.125
		movwf	Timer1			;Znovu naplnění časovače

;bliknutí LED1 2x za sekundu, aktivní v 0
		btfsc	LED1			;Test LED
		goto	$+3				;sem pokud LED off
		bsf	LED1				;sem pokud LED on, LED off
		goto	$+2				;Přejdi o 1
		bcf	LED1				;LED on		
		decf	Time,F			
		btfss	STATUS,Z
		goto	Opak2			;Opakuj dokud Time > 0

		movlw 	.2
		movwf	Time

		decf	TMR3,F
		btfss	STATUS,Z
		goto	Opak2

		movlw	b'00001111'
		movwf	GPIO
		sleep
;******************************************************************
		end