;**********************************************************************
;   This file is a basic code template for object module code         *
;   generation on the PIC16F57. This file contains the                *
;   basic code building blocks to build upon.  As a project minimum   *
;   the 16F57.lkr file will also be required for this file to         *
;   correctly build. The .lkr files are located in the MPLAB          *  
;   directory.                                                        *
;                                                                     *
;   Refer to the MPASM User's Guide for additional information on     *
;   features of the assembler and linker.                             *
;                                                                     *
;   Refer to the respective PIC data sheet for additional             *
;   information on the instruction set.                               *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Filename:	    xxx.asm                                           *
;    Date:          2007.03.23.                                       *
;    File Version:  V4.0                                              *
;                                                                     *
;    Author:        Czifra Tibor                                      *
;    Company:       Home                                              *
;                                                                     * 
;                                                                     *
;**********************************************************************
;                                                                     *
;    Files required:                                                  *
;                                                                     *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Notes:   fejlesztés alatt  , rasec gyártmányú kapuvezérlő        * 
;reprodukciója                                      				  *
;                                                                     *
;                                                                     *
;                                                                     *
;                                                                     *
;**********************************************************************

	list      p=16F57             ; list directive to define processor
	#include <p16F5x.inc>         ; processor specific variable definitions

	__CONFIG   _CP_OFF & _WDT_OFF & _XT_OSC

; '__CONFIG' directive is used to embed configuration word within .asm file.
; The lables following the directive are located in the respective .inc file. 
; See respective data sheet for additional information on configuration word.

;**************regiszterek***************

	CBLOCK 0X00C			; SAJÁT REGISZTEREK DEKLARÁLÁSA
	ALLAP				; ALLAPOT REGISZTER
	ALLAP_MENT				; ALLAPOT REGISZTER MENTÉSE
	
	REG_A				; A PORT MENTÉSE
	REG_B				; B PORT MENTÉSE
	REG_C				; C PORT MENTÉSE
	REG_TIMER_EL		; 
	TMR1_MENT			; 
	TEMPO_TEMP_REG		; 
	SIN_ELOZO_ALLAPOT				; 
	SIN_LEF_EL_SZAMLALO	;
	TEMPO_SET			;
	MENTES				; TMR1 MENTÉSE, INTERRUPHOZ, MIKOR INDULT AZ ASTABIL (+ VAR)
	VAR					; MENNIT VARJON AZ ASTABIL , LEJÁRTA INTERRUPTOL
	RIASZT				; RISZTÁS ESEMÉNY VAN-E?
	ME_IDOZITO


	TMR1				; IDŐZÍTÉS

	TEMP				; ÁTMENETI TÁR (TEMPORARY)
	
	ENDC

;**************kivezetések elnevezése***********************

#define	MOT3 	PORTA, 0	; motor vezérlés, MOT3-at hajtja meg																Mot 3
#define	ME 		PORTA, 1	; Master slave; Master: kimenet, 1: vezérel, 0 nem; Slave: bemenet, 1: vezérelve, 0: nem; 			M/E 
#define	SINUS	REG_A, 3	; tirisztor indításához 50 hz-es szinusz bemenet a hálózatról (0-5V)								-
; portA 2-es bitje nincs használva

#define	SYREN 	PORTB, 0	; hangszóró																							-
#define	LAMPA 	PORTB, 1	; lámpa vezérlés, LAMPAn-t hajtja meg																Lantern
#define	CAPT1 	REG_B, 2	; 1. szenzor, ha nem lát rá az optó, avagy nyitni kell 1-es, különben 0								CAPT1
#define	CAPT2 	REG_B, 3	; 2. szenzor, mint feljebb																			CAPT2
#define	CAPO 	REG_B, 4	; zárt pozíció jelző szenzor, 1 ha nyitva															Ca.Po.
#define	TEMPO 	PORTB, 5	; astabil működést biztosít, időzítő funkció, időzítés külső potival								-
#define	CLEF1 	REG_B, 6	; 3 állapotú kulcsos kapcsoló egyik kimenete, ha aktív, mindíg nyit állapot							Clef 1
#define	CLEF3	REG_B, 7	; 3 állapotú kulcsos kapcsoló egyik kimenete, ha aktív, alarm állapot								Clef 3
; clef1, és clef 3 kizáró állapotok, kapcsoló 3. állása normál állapotpt eredményez	


#define	M_SLAVE REG_C, 0	; 2bites mikrokapcsoló, 1. része, 1-es esetén master a kártya										Mode 1
#define	B_JOBB 	REG_C, 1	; 2bites mikrokapcsoló, 2. része, 1-es esetén jobbos a kapu a kapu									Mode 2
#define	LLAMP 	PORTC, 2	; LED-es kimenet, sárga																				Lampe
#define	LALARM	PORTC, 3	; LED-es kimenet, piros, risztás esetén aktív														Alarme
#define	LVERROU	PORTC, 4	; LED-es kimenet, sárga, fék jelenséget mutatná (panelen van, fék nincs bekötve a kapuban)			Verrou
#define	LALIM	PORTC, 5	; LED-es kimenet, zöld, normál működést mutatja														Alim							
#define	VE 		PORTC, 6	; Fék vezérlés, kimenet																				V/E
#define	MOT1_BNYIT 	PORTC, 7	; motor vezérlés, MOT1-at hajtja meg, bal oldalon nyit


RESET_VECTOR   CODE   0x7FF       	; processor reset vector
	goto    START

; ******* INICIALIZÁLÁS **********

	org 0X000
START	
	MOVLW B'00000111'
	OPTION							; PRESCALER, TIMER BEÁLLÍTÁSA

			
	movlw B'11111110'				; A port I/O irány beállítása 	(csak az utolsó 4 lehet nem 1!! na,na,na,na,RA3,RA2,RA1,RA0)
	TRIS PORTA
	
	movlw B'11111100'				; B port I/O irány beállítása  	(RB7,RB6,RB5,RB4,RB3,RB2,RB1,RB0)
	TRIS PORTB
	
	movlw B'00000011'				; C port I/O irány beállítása	(1: input; 0: output)
	TRIS PORTC

	CLRF REG_A
	CLRF REG_B
	CLRF REG_C
	CLRF REG_TIMER_EL
	CLRF TMR1_MENT
	CLRF TEMPO_TEMP_REG
	CLRF SIN_ELOZO_ALLAPOT
	CLRF SIN_LEF_EL_SZAMLALO

	CLRF TMR1
	CLRF RIASZT
	CLRF MENTES
	MOVLW B'00101000'				; TMR1 16*8 SZOR FORDUL KÖRBE (KB 4 MP)
	MOVWF VAR

	CLRF ALLAP						; ALLAPOT REGISZTER NULLAZASA, 00-ZÁRÓDIK ÁLLAPOTBÓL INDUL
;	MOVLW 0X01
;	MOVWF ALLAP


	BCF LVERROU						; PANELEN A FÉKLED NINCS HASZNÁLVA, LEGYEN MINDÍG KIKAPCSOLVA
	
	BCF MOT1_BNYIT					; A TÖBBI OUTPUT LEGYEN 0
	BCF MOT3
	BCF VE
	BCF LAMPA

	BSF LALIM						; ZÖLS LED, ÜZEMKÉSZ, BEKAPCSOLÁSA
	BCF LALARM						
	BCF SYREN					
	BCF LLAMP
	BCF LAMPA
	BCF LVERROU
	CALL STARTINT

MAIN

	MOVF PORTA, 0					; PORTOK LEMENTVE
	MOVWF REG_A	
	MOVF PORTB, 0
	MOVWF REG_B
	MOVF PORTC, 0
	MOVWF REG_C
	

; PRÓBA
;	BSF CAPO
;	BSF RIASZT, 0
;	BCF M_SLAVE
;	BCF B_JOBB
;	BCF ME
;	BCF CAPT1
;	BCF CAPT1
;	BCF CLEF1
;	BCF	CLEF2




	MOVF ALLAP, 0					; ALLAP -> W
	MOVWF ALLAP_MENT 				; W-> ALLAP_MENT

	RLF REG_TIMER_EL, 1				; BALRA SHIFT REG_TIMER_EL-ET, EREDMÉNY REG_TIMER_EL-BEN
	MOVF TMR0, 0					; TIMER LEMENTÉSE, HOGY AZ UTOLSÓ BIT NE VÁLTOZZON
	MOVWF TEMP		

	BTFSC TEMP, 7					; TMR0 UTOLSÓ BITJE 1 -> REG_TIMER_EL 0. BITJE 1
		BSF REG_TIMER_EL, 0
	BTFSS TEMP, 7					; TMR0 UTOLSÓ BITJE 0 -> REG_TIMER_EL 0. BITJE 0
		BCF REG_TIMER_EL, 0			; REG 4 MOST ILYEN: ..., RÉGI, RÉGI, RÉGI, ÚJ

	BTFSC REG_TIMER_EL, 1			; HA LEFUTÓ ÉL VAN :XXXXXX10
	BTFSC REG_TIMER_EL, 0
		GOTO TIMER_UTAN						; HA NINCS LEFUTÓ ÉL MENJEN TIMER_UTAN-RA
	INCF TMR1, 1					; HA VAN TMR1+1 -> TMR1

TIMER_UTAN

	BCF LALARM						; RIASZTÁS JELZŐL KIKAPCSOLÁSA
	BCF SYREN					
	BCF LLAMP
	BCF LAMPA

	BTFSS RIASZT, 0					; RISZTÁS BEKAPCSOLÁSA, HA KELL
		GOTO R_UTAN			
	; *** RIAZTAS ***
	BTFSS TMR1, 3					; 2HZ-ES JEL, VILLOGÁSHOZ, SZIRÉNÁHOZ
		GOTO R2
R1
	BSF LALARM						; ALARM SYRENA KIKAPCSOLVA
	BCF SYREN					
	BCF LLAMP
	BCF LAMPA
	GOTO R_UTAN
R2
	BCF LALARM						; ALARM SYRENA BEKAPCSOLVA
	BSF SYREN					
	BSF LLAMP
	BSF LAMPA
	GOTO R_UTAN


R_UTAN		
	BTFSC CLEF1						; CLEF1 = 1 HA MINDÍG NYITVA ÜZEMMÓD
		GOTO NYILIK
	BTFSC CLEF3						; CLEF3 = 1 HA MINDÍG ZÁRVA ÜZEMMÓD
		GOTO ZAR
	BTFSC M_SLAVE					; MASTER-E (0 HA IGEN, 1 HA NEM)
		GOTO SLAVE
	; GOTO MASTER                     SZÜKSÉGTELEN
MASTER	
	MOVLW b'11111100'				; MASTER ÁLLAPOTBAN KIMENENT AZ M/E
	TRIS PORTA

		MOVF TMR1, 0				; HA ME AKTIVÁLVA VAN ÉS LEJÁR
	SUBWF ME_IDOZITO, 0
	BTFSC STATUS, 2
		BCF ME						; TÖRÖLJE ME-T

	BTFSC CAPT1						; SZENZOR 1, 1, HA NYITNI KELL
		GOTO NYILIK
	BTFSC CAPT2						; SZENZOR 2, 1, HA NYITNI KELL
		GOTO NYILIK
	GOTO T2

SLAVE
	MOVLW b'11111110'				; MASTER ÁLLAPOTBAN BEMENENT AZ M/E
	TRIS PORTA						
	BTFSC ME						; HA SLAVE ÁLLAPOTBAN VEZÉRLÉST KAP. NYISSON
		GOTO NYILIK 	
	GOTO T2

NYILIK	

	BSF ALLAP, 1					; 11-ES ÁLLAPOTBA MEGYÜNK
	BSF ALLAP, 0
							; HA NYÍLIK-BE KERÜLTÜNK
	BTFSC M_SLAVE					; HA MSATERBEN VAGYUNK
		GOTO NYILIK2
	MOVF ALLAP_MENT, 0				; ÉS HA ÚJ AZ ÁLLAPOT
	SUBWF ALLAP, 0					
	BTFSC STATUS, 2					; HA EGYEZNEK, MENJEN NYILIK2-RE (NINCS ÚJ ÁLLAPOT)
		GOTO NYILIK2
									; AKKOR
	BSF ME							; ME KIMENET 1						
	MOVF TMR1, 0					; ELMENTJÜK A JELEN IDŐT
	MOVWF ME_IDOZITO				; HOZZÁADJUK A VÁRAKOZÁST
	MOVLW	0X08
	ADDWF ME_IDOZITO, 1				; EREDMÉNY ME_IDOZITO-BEN , ITT VAN MIKOR JÁR LE ME IDŐZÍTÉSE	
	
NYILIK2		

	MOVF ALLAP_MENT, 0				; ALLAP_ MENT -> W
	SUBWF ALLAP, 0					; ALLAP_MENT -  ALLAP ->W
	BTFSS STATUS, 2					; MEGEGYEZTT, Z=1, NINCS ÁLLAPOT VÁLTÁS
		CALL STARTINT				; VAN ÁLLAPOT VÁLTÁS,
	GOTO T2

ZAR
	BCF LALARM						
	BCF LLAMP
	BTFSC CAPO						; ZÁRVA VAN-E AZ AJTÓ, 1 HA IGEN
		GOTO ZARODIK
ZARVA

	BCF ALLAP, 1
	BSF ALLAP, 0					; 01 ALLAPOT

	MOVF ALLAP_MENT, 0				; ALLAP_ MENT -> W
	SUBWF ALLAP, 0					; ALLAP_MENT -  ALLAP ->W
	BTFSS STATUS, 2					; MEGEGYEZTT, Z=1, NINCS ÁLLAPOT VÁLTÁS
		CALL STARTINT				; VAN ÁLLAPOT VÁLTÁS,
	GOTO T2
	
ZARODIK
	BCF ALLAP, 1					; 00 ÁLLAPOT	
	BCF ALLAP, 0

	MOVF ALLAP_MENT, 0				; ALLAP_ MENT -> W
	SUBWF ALLAP, 0					; ALLAP_MENT -  ALLAP ->W
	BTFSS STATUS, 2					; MEGEGYEZTT, Z=1, NINCS ÁLLAPOT VÁLTÁS
		CALL STARTINT				; VAN ÁLLAPOT VÁLTÁS,
	GOTO T2

	
;************** SZINUSZ LEFUTÓ ÉL-E, HA IGEN LEHET A MOTORT VEZÉRELNI ****************

T2
	RLF SIN_ELOZO_ALLAPOT, 1		; BALRA SHIFT REG_TIMER_EL-ET, EREDMÉNY REG_TIMER_EL-BEN
	BCF SIN_ELOZO_ALLAPOT, 0
	BTFSC SINUS						; HA AZ EREDMÉNY NULLA, UGORJON
		BSF SIN_ELOZO_ALLAPOT, 0	; HA EGY, AKKOR 1 LESZ AZ UTOLSÓ, (MOST ILYEN: ..., RÉGI, RÉGI, RÉGI, ÚJ)
	
	BSF	SIN_ELOZO_ALLAPOT, 7		; UTOLSÓ 2 BITRE ÉRZÉKETLENÍTÜNK
	BSF SIN_ELOZO_ALLAPOT, 6		; MOST ILYEN 1,1,RÉGI,RÉGI,RÉGI,RÉGI, RÉGI, ÚJ
								


;*************** ÁLLAPOTOK *********************
		
	BTFSC ALLAP, 1					; NYILÁS IRÁNYÚ AZ ÁLLAPOT? (1: NYÍLIK, 0: ZÁR)
		GOTO NY	
	GOTO ZA

;*** NYITOTT ÁLLAPOTOTK ***
NY	;1X
	CLRF RIASZT						; RISZTÁS KIKAPCSOLÁSA

	MOVF TMR1, 0					; TMR1 -> W
	SUBWF MENTES, 0					; W-MENTES -> W
	BTFSS STATUS, 2					; HA 0 AZ EREDMÉNY (Z=1), LEJÁRT AZ IDŐ
		GOTO NYMOT					; HA NEM JÁRT LE, UGORJON A MOTOR VEZÉRLÉSRE
	; HA LEJÁRT
	BTFSS ALLAP, 0
		GOTO NY_10					
NY_11 ; -> 10
	BSF ALLAP, 1
	BCF ALLAP, 0

	MOVF ALLAP_MENT, 0				; ALLAP_ MENT -> W
	SUBWF ALLAP, 0					; ALLAP_MENT -  ALLAP ->W
	BTFSS STATUS, 2					; MEGEGYEZTT, Z=1, NINCS ÁLLAPOT VÁLTÁS
		CALL STARTINT				; VAN ÁLLAPOT VÁLTÁS,,
	GOTO NYMOT
NY_10 ; -> 00
	BCF ALLAP, 1
	BCF ALLAP, 0

	MOVF ALLAP_MENT, 0				; ALLAP_ MENT -> W
	SUBWF ALLAP, 0					; SUB(ALLAP, ALLAP_MENT)-> W
	BTFSS STATUS, 2					; MEGEGYEZTT, Z=1, NINCS ÁLLAPOT VÁLTÁS
		CALL STARTINT				; VAN ÁLLAPOT VÁLTÁS,
	GOTO NYMOT
	
NYMOT
	MOVLW B'11111110'
	SUBWF SIN_ELOZO_ALLAPOT, 0		; HA LEFUTÓ ÉL VAN, MOTOR VEZÉRLÉS VAN
	BTFSS STATUS, 2
		GOTO MAIN

	INCF SIN_LEF_EL_SZAMLALO, 1		; LEFUTÓ ÉL SZÁMLÁLÓ, EREDMÉNY A SZÁMLÁLÓBAN
	BTFSS B_JOBB					; BALOS A KAPU (0 IGEN, 1 NEM)
		GOTO NYBAL
	GOTO NYJOBB
NYBAL								; BALOS
	BSF	MOT1_BNYIT
	BCF MOT3
	GOTO MAIN
NYJOBB								; JOBBOS
	BCF MOT1_BNYIT
	BSF MOT3
	GOTO MAIN

; **** ZÁRODIK ÁLLAPOT ****

; *** MELYIK ZÁR ÁLLAPOT? ****
ZA	
	BTFSC ALLAP, 0
		GOTO Z_01					; HA 1 -> Z_01
Z_00								; HA 0 -> TOVÁBB (Z_00)
	BTFSS CAPO						; HA CAPO = 0 -> ZÁRVA VAN, RISZTÁS KIKAPCSOLÁSA
		CLRF RIASZT
	; LEJÁRT -E AZ IDŐZÍTÉS
	MOVF TMR1, 0					; TMR1 -> W
	SUBWF MENTES, 0					; W-MENTES -> W
	BTFSS STATUS, 2					; HA 0 AZ EREDMÉNY (Z=1), LEJÁRT AZ IDŐ
		GOTO Z_00_MOT
	BTFSS CAPO						; HA ZÁRVA VAN AZ AJTÓ (CAPO =0)
		GOTO Z_00_ZARVA				; HA ZÁRVA VAN ->01

Z_00_ZARODIK	
	BSF RIASZT, 0					; HA NINCS ZÁRVA -> 00 + RISZTÁS
	
	BCF ALLAP, 1
	BCF ALLAP, 0

	MOVF ALLAP_MENT, 0				; ALLAP_ MENT -> W
	SUBWF ALLAP, 0					; ALLAP_MENT -  ALLAP ->W
	BTFSS STATUS, 2					; MEGEGYEZTT, Z=1, NINCS ÁLLAPOT VÁLTÁS
		CALL STARTINT				; VAN ÁLLAPOT VÁLTÁS,
	GOTO Z_00_MOT

Z_00_ZARVA
	BCF ALLAP, 1
	BSF ALLAP, 0

	MOVF ALLAP_MENT, 0				; ALLAP_ MENT -> W
	SUBWF ALLAP, 0					; ALLAP_MENT -  ALLAP ->W
	BTFSS STATUS, 2					; MEGEGYEZTT, Z=1, NINCS ÁLLAPOT VÁLTÁS
		CALL STARTINT				; VAN ÁLLAPOT VÁLTÁS,
	GOTO Z_00_MOT		


Z_00_MOT
	MOVLW B'11111110'
	SUBWF SIN_ELOZO_ALLAPOT, 0		; HA LEFUTÓ ÉL VAN, MOTOR VEZÉRLÉS VAN
	BTFSS STATUS, 2
		GOTO MAIN

	INCF SIN_LEF_EL_SZAMLALO, 1		; LEFUTÓ ÉL SZÁMLÁLÓ, EREDMÉNY A SZÁMLÁLÓBAN
	BTFSS B_JOBB					; JOBBOS, BALOS
		GOTO Z_00_BAL

Z_00_JOBB							; JOBBOS
	BSF	MOT1_BNYIT
	BCF MOT3
	GOTO MAIN

Z_00_BAL							; BALOS
	BCF MOT1_BNYIT
	BSF MOT3
	GOTO MAIN

; **** ZÁRVA ÁLLAPOT ****
Z_01	
	BTFSS CAPO						; HA CAPO = 0 -> ZÁRVA VAN, RISZTÁS KIKAPCSOLÁSA  	
		CLRF RIASZT
	BTFSC CAPO
		BSF RIASZT, 0				; HA ZÁRVA VAGYUNK, ÉS NEMLEGÁLIS NYITÁS -> RIASZT

	; LEJÁRT -E AZ IDŐZÍTÉS
	MOVF TMR1, 0					; TMR1 -> W
	SUBWF MENTES, 0					; W-MENTES -> W
	BTFSS STATUS, 2					; HA 0 AZ EREDMÉNY (Z=1), LEJÁRT AZ IDŐ
		GOTO Z_01_MOT
	BTFSS CAPO						; HA ZÁRVA VAN AZ AJTÓ (CAPO =0)
		GOTO Z_01_ZARVA				; HA ZÁRVA VAN ->01

Z_01_ZARODIK	
	BSF RIASZT, 0					; HA NINCS ZÁRVA -> 00 + RISZTÁS
	
	BCF ALLAP, 1
	BCF ALLAP, 0

	MOVF ALLAP_MENT, 0				; ALLAP_ MENT -> W
	SUBWF ALLAP, 0					; ALLAP_MENT -  ALLAP ->W
	BTFSS STATUS, 2					; MEGEGYEZTT, Z=1, NINCS ÁLLAPOT VÁLTÁS
		CALL STARTINT				; VAN ÁLLAPOT VÁLTÁS,
	GOTO Z_01_MOT

Z_01_ZARVA
	BCF ALLAP, 1
	BSF ALLAP, 0

	MOVF ALLAP_MENT, 0				; ALLAP_ MENT -> W
	SUBWF ALLAP, 0					; ALLAP_MENT -  ALLAP ->W
	BTFSS STATUS, 2					; MEGEGYEZTT, Z=1, NINCS ÁLLAPOT VÁLTÁS
		CALL STARTINT				; VAN ÁLLAPOT VÁLTÁS,
	GOTO Z_01_MOT		


Z_01_MOT
	MOVLW B'11111110'	

	SUBWF SIN_ELOZO_ALLAPOT, 0		; HA LEFUTÓ ÉL VAN, MOTOR VEZÉRLÉS VAN
	BTFSS STATUS, 2
		GOTO MAIN

	INCF SIN_LEF_EL_SZAMLALO, 1		; LEFUTÓ ÉL SZÁMLÁLÓ, EREDMÉNY A SZÁMLÁLÓBAN
	BTFSS B_JOBB					; JOBBOS, BALOS
		GOTO Z_01_BAL

Z_01_JOBB							; JOBBOS
	BCF	MOT1_BNYIT
	BTFSS SIN_LEF_EL_SZAMLALO, 0	; MINDEN PÁRATLAN SZINUSZ CIKLUSBAN KAPCSOLJA BE MOT 1-ET
		BSF MOT1_BNYIT									
	BCF MOT3
	GOTO MAIN

Z_01_BAL									; BALOS

	BCF MOT3
	BTFSS SIN_LEF_EL_SZAMLALO, 0	; MINDEN PÁRATLAN SZINUSZ CIKLUSBAN KAPCSOLJA BE MOT 3-AT
		BSF MOT3
	BCF MOT1_BNYIT
	GOTO MAIN

STARTINT

	MOVF TMR1, 0					; TMR1 -> W
	ADDWF VAR, 0					; W(TMR1)+VAR -> W
	MOVWF MENTES					; W-> MENTES
	RETLW 0X00						; VISSZATÉRÉS
	END
