;-------------------------------------------
;---SNAHA O VYTVOŘENÍ STŘÍDAČE 50Hz---------
;-------------------------------------------
;-CPU: PIC16F630  - 4MHz KRYSTALOVÝ OSCILÁTOR--
;-------------------------------------------
;-------------VERZE:  1.0-------------------
;-------------------------------------------


;-------------------MAKRA--------------------------
BANKA0	MACRO		;PŘEPNE NA BANKU 0
	BCF	RP0
;	BCF	RP1
	ENDM

BANKA1	MACRO		;PREPNE NA BANKU 1
	BSF	RP0
;	BCF	RP1
	ENDM

BANKA2	MACRO		;PŘEPNE NA BANKU 2
	BCF	RP0
	BSF	RP1
	ENDM

BANKA3	MACRO		;PŘEPNE NA BANKU 3
	BSF	RP0
	BSF	RP1
	ENDM

;----------JEDNOTLIVÉ BITY REGISTRŮ---------------

#DEFINE	RP0	STATUS,5
#DEFINE 	RP1	STATUS,6
#DEFINE	C	STATUS,0
#DEFINE	Z	STATUS,2
#DEFINE	DC	STATUS,1
#DEFINE	GIE	INTCON,7
#DEFINE	T0IF	INTCON,2

;----------------REGISTRY-------------------------

;	BANKA 0

TMR0	EQU	0x01
PCL	EQU	0x02
STATUS	EQU	0x03
FSR	EQU	0x04
PORTA	EQU	0x05
PORTC	EQU	0x07
PCLATH	EQU	0x0A
INTCON	EQU	0x0B
PIR1	EQU	0x0C
TMR1L	EQU	0x0E
TMR1H	EQU	0x0F
T1CON	EQU	0x10
CMCON	EQU	0x19


OFFSET	EQU	0x20

;	BANKA 1

OPTION_REG	EQU	0x01
PCL	EQU	0x02
STATUS	EQU	0x03
FSR	EQU	0x04
TRISA	EQU	0x05
TRISC	EQU	0x07
PCLATH	EQU	0x0A
INTCON	EQU	0x0B
PIE1	EQU	0x0C
PCON	EQU	0x0E
OSCCAL	EQU	0x10
WPUA	EQU	0x15
IOCA	EQU	0x16
VRCON	EQU	0x19
EEDATA	EQU	0x1A
EEADR	EQU	0x1B
EECON1	EQU	0x1C
EECON2	EQU	0x1D
ADRESL	EQU	0x1E
ANSEL	EQU	0x1F

;-------------------------------------------------
;	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

;-------------------------------------------------
;	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ĚŤ

#DEFINE	EEIF	PIR1,7
#DEFINE	EEPGD	EECON1,7
#DEFINE	WREN	EECON1,2
#DEFINE	COUT	CMCON,6
#DEFINE	CMIF	PIR1,3
#DEFINE	STOP	OFFSET,0
#DEFINE	WR	EECON1,1
#DEFINE	RD	EECON1,0
TMP1	EQU	OFFSET+.1
TMP2	EQU	OFFSET+.2
TMP0	EQU	OFFSET+.3
TMP_W	EQU	OFFSET+.4
TMP_STATUS	EQU	OFFSET+.5
TMP_PORTC	EQU	OFFSET+.6
POCET	EQU	OFFSET+.7
EADRESA	EQU	OFFSET+.8
EDATA	EQU	OFFSET+.9
PRETIZENI_H	EQU	OFFSET+.10
PRETIZENI_L	EQU	OFFSET+.11
STARTY_L	EQU	OFFSET+.12	;počítadlo startů - spodní byte
STARTY_S	EQU	OFFSET+.13	;počítadlo startů - prostřední byte
STARTY_H	EQU	OFFSET+.14	;počítadlo startů - horní byte


;------------------INICIALIZACE--------------------
	__CONFIG	B'00000110100001'

	ORG	000
	GOTO	INIT
	ORG	004

PRERUSENI	BCF	GIE		;ZAKÁZÁNÍ PŘERUŠENÍ
	MOVWF	TMP_W		;UKLIZENÍ W
	SWAPF	STATUS,W
	MOVWF	TMP_STATUS		;UKLIZENÍ	STATUSU
	MOVF	PORTC,W		;UKLIZENÍ PORTC
	MOVWF	TMP_PORTC
	
	BCF	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	SWAPF	TMP_STATUS,W	;NAHRÁTÍ ZÁLOHOVANÝCH REGISTRŮ ZPĚT
	MOVWF	STATUS
	SWAPF	TMP_W,F
	SWAPF	TMP_W,W

	RETFIE

;--------------------------------------------------
INIT	BCF	GIE		;zakázání přerušení
	CLRF	PORTA		;smazání portu a
	CLRF	PORTC		;smazání portu c

	MOVLW	.5		
	MOVWF	POCET		;uloží 5 do počet

	BANKA1			;banka 1
	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í

	BANKA0			;banka 0
	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	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

	BCF	EEIF		;VYNULUJ PŘÍZNAK ZÁPISU
	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	BANKA1
	MOVF	EADRESA,W
	MOVWF	EEADR
;	MOVF	EDATA,W
;	MOVWF	EEDATA	
	BSF	RD
	BTFSC	RD	;čekání dokud se data nepřečtou
	GOTO	$-1
	MOVF	EEDATA,W
	BANKA0
;	MOVWF	EDATA
	RETURN

;-----------------------------------------------------
;	ZÁPIS DO EEPROM


ZAPIS_EEPROM	;BCF	GIE	;zakázání přerušení
	BANKA1
	MOVF	EDATA,W
	MOVWF	EEDATA
	MOVF	EADRESA,W
	MOVWF	EEADR
	BSF	WREN
	MOVLW	0x55
	MOVWF	EECON2
	MOVLW	0xAA
	MOVWF	EECON2
	BSF	WR	;start zápisu
	BTFSC	WR	;čekání na konec zápisu
	GOTO	$-1
	BANKA0
;	BSF	GIE	
	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
