;-------------------------------------------
;---SNAHA O VYTVOŘENÍ STŘÍDAČE 50Hz---------
;-------------------------------------------
;-CPU: PIC16F630  - 4MHz KRYSTALOVÝ OSCILÁTOR--
;-------------------------------------------
;-------------VERZE:  1.0-------------------
;-------------------------------------------

	list p=16f630, R=DEC
	include "p16f630.inc"




	cblock 0x20
	OFFSET	
	TMP1	
	TMP2
	TMP0
	TMP_W
	TMP_S
	TMP_PCLATH
	TMP_FSR
	TMP_PORTC
	POCET
	EADRESA
	EDATA
	PRETIZENI_H
	PRETIZENI_L
	STARTY_L			;počítadlo startů - spodní byte
	STARTY_S			;počítadlo startů - prostřední byte
	STARTY_H			;počítadlo startů - horní byte
	endc

;	BANKA 1



;-------------------------------------------------
;	VSTUPY/VÝSTUPY

#DEFINE	OUT1	PORTC,0	;RC0
#DEFINE	OUT2	PORTC,1	;RC1
#DEFINE	LED	PORTC,4	;RC4	LOG 1 ROZSVÍTÍ LED
#DEFINE	SERVIS	PORTC,2	;RC3	LOG 0 SMAŽE ZÁZNAM O NADPROUDU


#DEFINE	STOP	OFFSET,0
;-------------------------------------------------
;	EEPROM PAMĚŤ

	ORG	0x2100
	DE	0x00,0x00,0x00	; POČÍTADLO POČTU SPUŠTĚNÍ
	DE	0xAA,0x00,0x00	; POČÍTADLO POČTU PŘETÍŽENÍ
	DE	0x00,0x00,A'V',A' '	;verze v 1.0
	DE	A'1',A'.',A'0'

;------------------------------------------------
;	PAMĚŤ




;------------------INICIALIZACE--------------------
	__CONFIG	B'00000110100001'

	ORG	000
	GOTO	INIT
	ORG	004

PRERUSENI
	movwf	TMP_W		; (ulozeni hodnot registru W a STATUS)
	movf	STATUS,W	; prohodi nibble STATUS a ulozi do W
	clrf	STATUS		; nastaveni banky 0
	movwf	TMP_S		; ulozit STATUS
	movf	PORTC,w
	movwf	TMP_PORTC


	
	BCF		PIR1,CMIF		;SMAZÁNÍ PŘÍZNAKU KOMPARÁTORU
	CLRF	PORTC		;SMAZÁNÍ PORTU C
	BSF		LED		;ZOZSVIŤ LED
	DECFSZ	POCET,F		;POČÍTÁNÍ PŘETÍŽENÍ
	GOTO	$+2
	CALL	NADPROUD
	
POKRACUJ	CALL	CEK_1S		;ČEKEJ 1 SEKUNDU
	BCF	LED		;ZHASNE LED
	MOVF	TMP_PORTC,W		;NASTAVENÍ PORTUC ZPĚT
	MOVWF	PORTC
	
KONEC	
	
	movf	TMP_S,W		; prohodi nibble TMP_S a ulozi do W
;	swapf	TMP_S,W		; prohodi nibble TMP_S a ulozi do W
	movwf	STATUS		; obnova STATUS

	swapf	TMP_W,F		; prohodi nibble TMP_W a ulozi do W
	swapf	TMP_W,W		; obnova W
	retfie

;--------------------------------------------------
INIT
	CLRF	PORTA		;smazání portu a
	CLRF	PORTC		;smazání portu c

	MOVLW	.5		
	MOVWF	POCET		;uloží 5 do počet

	banksel	TRISC
	MOVLW	B'11101100'	
	MOVWF	TRISC		;nastavení výstupů
	MOVLW	0xFF		;nastavení vstupů
	MOVWF	TRISA

	MOVLW	B'10100011'
	MOVWF	VRCON		;nastavení reference - cca 0.63V

	MOVLW	B'00001000'
	MOVWF	PIE1		;povolení přerušení

	banksel	CMCON
	MOVLW	B'00010100'	;nastavení komparátoru
	MOVWF	CMCON	

	MOVLW	B'01000000'	;nastavení přerušení
	MOVWF	INTCON

	CALL	PULZ		;čekej 10ms
	CALL	START		;záznam o počtu spuštění
	BCF	STOP		;STOP BIT
	CALL	PULZ		;čekej	10ms
	BSF		INTCON,GIE		;povolení přerušení
	


HLAVNI	BTFSC	STOP	;OTESTUJ STOP BIT
	SLEEP		;JESTLI STOP = 1 -> ZACYKLOVAT SE NA HLAVNI
	
	BSF	OUT1	;NASTAVIT OUT 1
	CALL	PULZ	;ČEKEJ  
	BCF	OUT1	;VYNULOVAT OUT 1
	NOP		;DEADTIME
	NOP		
	NOP
	NOP
	BSF	OUT2	;NASTAVIT OUT 2
	CALL	PULZ	;ČEKEJ
	BCF	OUT2	;VYNULUJ OUT 2


	GOTO	HLAVNI

;***************************************************
;	PODPROGRAMY
;***************************************************

;---------------------------------------------------	
;	podprogram čekání cca 10ms

PULZ	MOVLW	.13	
	MOVWF	TMP1
	MOVLW	.248	
	MOVWF	TMP0
	DECFSZ	TMP0,F
	GOTO	$-1
	DECFSZ	TMP1,F
	GOTO	$-3
	RETURN

;---------------------------------------------------
;


	;čekání 1000000 cyklů -> 1s
CEK_1S	MOVLW	0x15	;21 DEC
	MOVWF	TMP2
	MOVLW	0x59	;89 DEC
	MOVWF	TMP1
	MOVLW	0x0B1	;177 DEC
	MOVWF	TMP0
	DECFSZ	TMP0,F
	GOTO	$-1
	DECFSZ	TMP1,F
	GOTO	$-5
	DECFSZ	TMP2,F
	GOTO	$-9
	RETURN

;---------------------------------------------------
;	ZÁZNAM O PŘETÍŽENÍ SYSTÉMU

NADPROUD	MOVLW	0x05		;nižší byte
	MOVWF	EADRESA
	CALL	CTI_EEPROM
	MOVWF	PRETIZENI_L		;nižší byte uložit do PRETIZENI_L	
	
	MOVLW	0x04		;vyšší byte
	MOVWF	EADRESA
	CALL	CTI_EEPROM
	MOVWF	PRETIZENI_H		;VYŠŠÍ BAJT ULOŽIT DO PRETIZENI_H
	
	INCFSZ	PRETIZENI_L,F	;PŘIČTI PŘETÍŽENÍ K NIŽŠÍMU BYTE
	GOTO	NIZSI		;POKUD PRETIZENI_L NEPRETEKLO SKOC NA NIZSI
	INCF	PRETIZENI_H,F		;POKUD PŘETEKL NIŽŠÍ BAJT PŘIČTI VYŠŠÍ BAJT

	MOVF	PRETIZENI_H,W	;kopni PRETIZENI_H do W
	MOVWF	EDATA		;nasypat do EDATA
	MOVLW	0x04		;adresa vyššího byte
	MOVWF	EADRESA	
	CALL	ZAPIS_EEPROM	;podprogram zápisu do eeprom
	
NIZSI	MOVF	PRETIZENI_L,W	;kopni PRETIZENI_L  do W
	MOVWF	EDATA		; a potom do EDATA
	MOVLW	0x05		;adresa nižšího byte
	MOVWF	EADRESA
	CALL	ZAPIS_EEPROM	;zapiš do eeprom

	MOVLW	.5		;NASTAVENÍ NOVÉ HODNOTY POČTU PŘETÍŽENÍ
	MOVWF	POCET
	RETURN

;---------------------------------------------------
;	ČTENÍ EEPROM
; DATA PŘEČTENÁ Z EEPROM ZŮSTÁVAJÍ VE W

CTI_EEPROM	
	banksel	EADRESA
	MOVF	EADRESA,W
	banksel	EEADR
	MOVWF	EEADR
	banksel	EECON1
	bsf		EECON1,RD ;EE Read
	banksel	EEDATA
	movf	EEDATA,W ;Move data to W
	return			;		!!! data v registru W !!!


;-----------------------------------------------------
;	ZÁPIS DO EEPROM


ZAPIS_EEPROM	;BCF	GIE	;zakázání přerušení
	banksel	EDATA
	MOVF	EDATA,W
	banksel	EEDAT
	MOVWF	EEDAT
	banksel	EADRESA
	MOVF	EADRESA,W
	banksel	EEADR
	MOVWF	EEADR
	
	banksel	EECON1
	bsf		EECON1,WREN ;Enable write
	bcf		INTCON,GIE ;Disable INTs
	movlw	0x55 ;Unlock write
	movwf	EECON2 ;
	movlw	0xAA ;
	movwf	EECON2 ;
	bsf		EECON1,WR ;Start the write
	banksel	PIR1
	btfss	PIR1,EEIF	; pockat na konec zapisu
	goto	$-1
	bcf		PIR1,EEIF
	banksel	INTCON

	bsf		INTCON,GIE ;Enable INTS


	RETURN


;-----------------------------------------------------
;	POCET STARTŮ SYSTÉMU
;RUTINA ZAZNAMENÁVÁ POČET SPUŠTĚNÍ PROGRAMU - nezměněné bajty se nezapisují

START	MOVLW	0x02	;adresa nižšího byte STARTY_L
	MOVWF	EADRESA
	CALL	CTI_EEPROM	;přečti stav STARTY_L
	MOVWF	STARTY_L
	
	MOVLW	0x01	;adresa prostředního byte STARTY_S
	MOVWF	EADRESA	
	CALL	CTI_EEPROM	;Přečti stav STARTY_S
	MOVWF	STARTY_S
	
	MOVLW	0x00	;adresa horního byte STARTY_H
	MOVWF	EADRESA
	CALL	CTI_EEPROM	;přečti stav STARTY_H
	MOVWF	STARTY_H
	
	INCFSZ	STARTY_L,F	;zvyš počet STARTY_L
	GOTO	PRVNI	;pokud nepřeteklo jdi na PRVNI
		;pokud přeteklo jdi dále
	INCFSZ	STARTY_S,F	;zvyš počet STARTY_S
	GOTO	DRUHY	;pokud nepřeteklo jdi na DRUHY
	INCF	STARTY_H,F	;pokud přeteklo tak zvyš i STARTY_H

	CLRF	EADRESA		;adresa nejvyššího byte
	MOVF	STARTY_H,W
	MOVWF	EDATA
	CALL	ZAPIS_EEPROM	;zapiš do eeprom

DRUHY	MOVLW	0x01	;adresa prostředního byte
	MOVWF	EADRESA
	MOVF	STARTY_S,W
	MOVWF	EDATA
	CALL	ZAPIS_EEPROM	;zapiš eeprom
	
PRVNI
	MOVLW	0x02	;adresa nejnižšího byte
	MOVWF	EADRESA
	MOVF	STARTY_L,W
	MOVWF	EDATA
	CALL	ZAPIS_EEPROM	;zapiš eeprom

	RETURN


;-----------------------------------------------------

	org	0x3ff
	RETLW	B'10000000'		;KALIBRAČNÍ HODNOTA

;-----------------------------------------------------

	END
