; 18F452
; mk pic-be ezt programozni
; indulaskor RD2 LED eg
; RA0 kapcsolo rovid megnyomasara balra rotalodik, engedélyezi az adatküldést(RC5 H-ra vált) es elkuldi a PORTD_ELOBYTE uj tartalmat a másik pic-nek



	LIST P=18F452		;directive to define processor
	#include <P18F452.INC>	;processor specific variable definitions  (INCLUDE - allows inclusion of secondary file (eg block of equates))

;******************************************************************************

;18F series Development Configuration Information
    CONFIG BOR=ON   ; Brown out reset ON
    CONFIG BORV=45  ; Brown out detect voltage=4.5 Volt   adatlap 197
    CONFIG CCP2MUX=OFF ; CCP2 input/output is to RB3
    CONFIG DEBUG=ON ; Background debugger ON   (on-nal hiaba release-el lett a pic felprogramozva az RB6 RB7 lab nem fog I/O labkent mukodni)
    CONFIG LVP=OFF  ; Low Voltage programming OFF
    CONFIG OSCS=OFF ; Oscillator switch OFF
    CONFIG OSC=XT   ; Use crystal oscillator (pl 4MHZ)
    CONFIG PWRT=ON  ; Power-up timer ON
    CONFIG STVR=OFF ; Stack over/underflow OFF
    CONFIG WDT=OFF  ; Watch dog timer OFF
					;UnProtect entire device program space for DEBUG
    CONFIG CP0=OFF  ; Code Protection Block 0 Disabled
    CONFIG CP1=OFF  ; Code Protection Block 1 Disabled
    CONFIG CP2=OFF  ; Code Protection Block 2 Disabled
    CONFIG CP3=OFF  ; Code Protection Block 3 Disabled
    CONFIG CPB=OFF  ; Boot Block Code Protection Disabled
    CONFIG CPD=OFF  ; Data EEPROM Code Protection Disabled
    CONFIG WRT0=OFF ; Write Protection Block 0 Disabled
    CONFIG WRT1=OFF ; Write Protection Block 1 Disabled
    CONFIG WRT2=OFF ; Write Protection Block 2 Disabled
    CONFIG WRT3=OFF ; Write Protection Block 3 Disabled
    CONFIG WRTB=OFF ; Boot Block Write Protection Disabled
    CONFIG WRTC=OFF ; Configuration Register Write Protection Disabled
    CONFIG WRTD=OFF ; Data EEPROM Write Protection Disabled



;******************************************************************************
;Variable definitions
; These variables are only needed if low priority interrupts are used. 
; More variables may be needed to store other special function registers used
; in the interrupt routines.

		CBLOCK	0x080	;BANK0 80h -tol FFh-g 128db GPR(general purpose register) van. The data memory map is divided into as many as 16 banks that contain 256 bytes each.    CBLOCK - allows consecutive locations to be labeled for variables
			WREG_TEMP	;variable used for context saving 
			STATUS_TEMP	;variable used for context saving
			BSR_TEMP	;variable used for context saving.  The lower 4 bits of the Bank Select Register (BSR<3:0>) select which bank will be accessed. The upper 4 bits for the BSR are not implemented.
			KAPCSOLO_PORTA0_TIMER_1		;  KAPCSOLO_PORTA0_TIMER idozito byte-ok
			KAPCSOLO_PORTA0_TIMER_ALLAPOT	;  KAPCSOLO_PORTA0_TIMER állapot byte: 0.bit: Timer mukodik. A figyelt esemeny bekovetkezte aktivalja (pl kapcsolo megnyomas)      1.bit: volt hosszu megnyomas       2.bit: hosszu megnyomas utan eloszor elengedett kapcsolo >> jelezzuk megtortent a timer nullazas az elengedes perges mentesitesehez
			PORTD_ELOBYTE
			T1
			T2				; indulási késlelteto
			T1ERTEK
			T2ERTEK
		ENDC

;******************************************************************************
;EEPROM data
; Data to be programmed into the Data EEPROM is defined here

		ORG	0xf00000

;******************************************************************************

		ORG	0x0000		;Reset vector  This code will start executing when a reset occurs.
		goto	Main		;go to start of main code

;******************************************************************************
;High priority interrupt vector
; This code will start executing when a high priority interrupt occurs or
; when any interrupt occurs if interrupt priorities are not enabled.

		ORG	0x0008		;high level priority interrupt

		bra	HPIService	;go to high priority interrupt routine

;******************************************************************************
;High priority interrupt routine		The high priority interrupt code is placed here to avoid conflicting with the low priority interrupt vector. (mivel 0x0008-0x0018 -ig csak 10 programsor van, belelógna a low priority interrupt program memoria területére)

HPIService	
	movff	STATUS,STATUS_TEMP	;save registers for later restore
	movff	WREG,WREG_TEMP
	movff	BSR,BSR_TEMP
	btfss	INTCON,TMR0IF		;test for tmr0 as service cause
	goto	End_HPIService		; no -- step to next service

;insert required tmr0 actions here
	CALL	timerekleptetese		; TIMEREK KEZELÉSE focimke  (termeszetesen TIMEREK KEZELÉSE szakaszt létrehozni a main-ben)
	
	bcf	INTCON,TMR0IF	;reset tmr0 interrupt service flag
End_HPIService	
	movff	BSR_TEMP,BSR	;restore saved registers
	movff	WREG,WREG_TEMP
	movff	STATUS_TEMP,STATUS
	retfie	FAST

;******************************************************************************

Main

	banksel	ADCON1
	MOVLW 0x07		; Configure A/D
	MOVWF ADCON1		; for digital inputs

	banksel    TRISD
	MOVLW	B'00000000'	;clrf TRISD  még jobb
	MOVWF	TRISD
	MOVLW	B'00000001'	;
	MOVWF	TRISA
	MOVLW	B'00000001'	;
	MOVWF	TRISB
	CLRF	TRISC

	BCF	RCON,IPEN	; bit7 : Interrupt Priority Enable bit    0 = Disable priority levels on interrupts

;	banksel	INTCON               ; select INTCON bank
	movlw	b'11100000'	;7.:enable interrupts  6.:PEIE/GIEL: Peripheral Interrupt Enable bit =1    5.:TMR0IE: TMR0 Overflow Interrupt Enable bit =1   4.:INT0IE: INT0 External Interrupt Enable bit(gondolom RB0) =0      3.: RBIE: RB Port Change Interrupt Enable bit =0    2,1,0.: TMR0 INT0 RB flag-ek
	movwf	INTCON

	movlw	b'11000101'	;7.:enable T0  6.:set for 8 bit 5.:internal clock  3.: prescaling assigned   2,1,0.: elooszto
	movwf	T0CON

;------------------------------------
;indulási delay   idonként indulás után kapcsoló nyomásra RD2 led elaludt aztán semmire nem reagált
	banksel	PORTD
	clrf	PORTD
	BSF	PORTD,7			; lássuk elindult a progi
	banksel	T1ERTEK
	MOVLW	d'255'			;  ******************************************************
	MOVWF	T1ERTEK			;  indulási delay beállítás
	MOVLW	d'255'			;  szerepe: újra indulásnál áramvisszajöveteli egyenetlenségnél csak akkor jul el az további szakaszokig amikor stabilan közel ?1s óta van áram.
	MOVWF	T2ERTEK			;  
	CALL	DELAY			;  ******************************************************
;------------------------------------


;------------------------------------
; USART (Asynchronous mode) beallitas

;configure pins RC6/TX/CK and RC7/RX/DT  as the Universal Synchronous Asynchronous Receiver Transmitter
	BSF	RCSTA,SPEN
	BCF	TRISC,6		; TX kimenet
	BSF	TRISC,7		; RX bemenet

;Transmit Status and Control Register beallitasa
	MOVLW	B'00100100'	; 7.: -     6.: 8-bit transmission   5.: Transmit enabled    4.: Asynchronous mode   3.: -      2.: High Baud Rate     1.: Transmit Shift Register Status (ez flag szeru, csak olvasom 1=empty 0=full)    0.: 9th bit of Transmit Data (9bites adatkuldesnel irom, 9bites adatfogadasnal olvasom)
	MOVWF	TXSTA

;Receive Status and Control Register beallitasa
	MOVLW	B'10010000'	; 7.: SPEN (configures RX/DT and TX/CK pins as serial port pins)     6.: 8-bit reception     5.: -     4.: Continuous Receive Enable     3.: Disables address detection, all bytes are received, and ninth bit can be used as parity bit (??????!!!!!!!ebben nem vagyok biztos hogy jol allitottam be)      2.: Framing Error (csak olvashato)      1.: Overrun Error (csak olvashato)      0.: 9th bit of Received Data 
	MOVWF	RCSTA

; Baud Rate Generator SPeed beallitasa
	MOVLW	D'25'
	MOVWF	SPBRG

; TXREG register is loaded with data in software >> atkerul a Transmit (serial) shift register (TSR) -be
; TRMT (TXSTA<1>) shows the status of the TSR register. poll this bit in order to determine if the TSR register is empty (gondolom amikor ez empty lehet a TXREG-be ujabb adatot tolteni

; read PIR1,RCIF >> ha 1 (transfer is complete) >> read RCSTA register to determine if any error occurred during reception:
;	Overrun bit (RCSTA,OERR) has to be cleared in software, amugy nem lesz tobb adatatvitel (csak olvashato, torlese: RCSTA,CREN is cleared(Disables receiver) and then set(Enables receiver))
;	RCSTA,FERR sztem csak egy tajekoztato, hogy volt-e framing error (csak olvashato, sztem nem kell foglalkozni vele)
;kiolvasas az RCREG registerbol (double buffered register, can be read twice to retrieve the two bytes in the FIFO)
;------------------------------------------------------------------------------------------------------------------


	BANKSEL	PORTD_ELOBYTE
	movlw	b'00000100'
	movwf	PORTD_ELOBYTE

	CLRF	KAPCSOLO_PORTA0_TIMER_ALLAPOT	; a KAPCSOLO_PORTA0_KEZELES -ben használt timer alapállapotba helyezése
	CALL	RESET_KAPCSOLO_PORTA0_TIMER		; a KAPCSOLO_PORTA0_KEZELES -ben használt timer alapállapotba helyezése

	bsf	INTCON,TMR0IE	;listen to timer 0 interrupts
	bsf	INTCON2,TMR0IP	;assign tmr0 to High priority interrupt.   TMR0IP: TMR0 Overflow Interrupt Priority bit    1 = High priority   0 = Low priority
	bsf	INTCON,GIE	;turn on the interrupts


;##############################################################################
;##############################################################################
;#####################                        #################################
;#####################         L O O P        #################################
;#####################                        #################################
;##############################################################################
;##############################################################################
LOOP
	;----- PORTA0 teendok ------
PORTA0_FIGYELES
	BTFSC	PORTA,0
	GOTO	PORTA0_FOLYAMAT_FIGYELES
	banksel	KAPCSOLO_PORTA0_TIMER_ALLAPOT
	BSF 	KAPCSOLO_PORTA0_TIMER_ALLAPOT,0
PORTA0_FOLYAMAT_FIGYELES
	banksel	KAPCSOLO_PORTA0_TIMER_ALLAPOT
	BTFSC	KAPCSOLO_PORTA0_TIMER_ALLAPOT,0
	CALL	KAPCSOLO_PORTA0_FOLYAMATOK

;------------------------
	MOVFF	PORTD_ELOBYTE,PORTD
;-----------------
;  USART adatfogadas

	BTFSS	PIR1,RCIF		; volt completed adatfogadas? 5.bit
	GOTO	LOOP_VEGE		; nem volt (USART receive buffer is empty)
					; volt (The USART receive buffer, RCREG, is full (cleared when RCREG is read))
	BTFSC	RCSTA,OERR		; volt Overrun Error?
	GOTO	OVRRUN_ERROR_TORTENT	; volt
					; nem volt
	BTFSC	RCSTA,FERR		; volt Framing Error?
	GOTO	FRAMING_ERROR_TORTENT	; volt
					; nem volt
	MOVFF	RCREG,PORTD_ELOBYTE	; kiolvasasa az erkezett byte-nak
	GOTO	LOOP_VEGE

OVRRUN_ERROR_TORTENT
	MOVLW	B'00001111'
	MOVWF	PORTD_ELOBYTE
	BCF	RCSTA,CREN		;Overrun bit (RCSTA,OERR 4.bit) torlese: Disables receiver and then Enables receiver
	BSF	RCSTA,CREN
	GOTO	LOOP_VEGE

FRAMING_ERROR_TORTENT
	MOVLW	B'11110000'
	MOVwF	PORTD_ELOBYTE
	GOTO	LOOP_VEGE
;------------------------
LOOP_VEGE
	goto	LOOP


;##############################################################################
;##############################################################################
;######################                                ########################
;######################  KAPCSOLO  _PORTA0_  KEZELES   ########################
;######################                                ########################
;##############################################################################
;##############################################################################

KAPCSOLO_PORTA0_FOLYAMATOK				; hasznalt TIMER:  KAPCSOLO_PORTA0_TIMER
	banksel	KAPCSOLO_PORTA0_TIMER_ALLAPOT
	BTFSC	KAPCSOLO_PORTA0_TIMER_ALLAPOT,1	; volt mar hosszu megnyomas?
	GOTO	hosszumegnyomas_utan		; volt
	MOVLW	D'12'				; nem volt    pergesmentesites leteltet vizsgaljuk	####### 0,15s ########
	SUBWF	KAPCSOLO_PORTA0_TIMER_1,0		; < 0,15sec?           d=0 miatt a W-be kerül (ne módosítsa a file tartalmát)
	BTFSS	STATUS,C
	RETURN					; KAPCSOLO_PORTA0_TIMER_1 <  a 0,15sec-hez beallitott erteknel (0,15s nem jart még le)
	MOVLW	D'64'				; KAPCSOLO_PORTA0_TIMER_1 >= a 0,15sec-hez beallitott erteknel (0,15s lejart)	###### 1s #####
	banksel	KAPCSOLO_PORTA0_TIMER_1
	SUBWF	KAPCSOLO_PORTA0_TIMER_1,0		; < 1sec?             d=0 miatt a W-be kerül (ne módosítsa a file tartalmát)
	BTFSC	STATUS,C
	GOTO	hosszumegnyomas_tortent		; hosszu megnyomas tortent
	BTFSS	PORTA,0				; meg nem telt le az 1sec >> vizsgaljuk el lett-e engedve a kapcsolo
	RETURN					; meg mindig megnyomva

    ; rovid megnyomas tortent
	banksel	KAPCSOLO_PORTA0_TIMER_ALLAPOT
	CLRF	KAPCSOLO_PORTA0_TIMER_ALLAPOT	; leallitjuk a KAPCSOLO_PORTA0_TIMER  -t	toroljuk az osszes jelzo bitet   (vegeztunk az idozitessel)
	CALL	RESET_KAPCSOLO_PORTA0_TIMER		; Timert alapallapotba tesszuk
	CALL	KAPCSOLO_PORTA0_ROVID_MEGNYOMAS	; Rovid megnyomas teendok
	RETURN

hosszumegnyomas_tortent
	banksel	KAPCSOLO_PORTA0_TIMER_ALLAPOT
	BSF	KAPCSOLO_PORTA0_TIMER_ALLAPOT,1	; hosszu megnyomast jelzo bitet beallitjuk
	CALL	KAPCSOLO_PORTA0_HOSSZU_MEGNYOMAS	; hosszu megnyomas teendok		
	RETURN

hosszumegnyomas_utan				; hosszu megnyomas utan ugrott a loopbol a kapcsolo folyamathoz
	BTFSS	PORTA,0				; el lett mar engedve a kapcsolo a hosszu megnyomas utan
	RETURN					; meg mindig megnyomva
	banksel	KAPCSOLO_PORTA0_TIMER_ALLAPOT
	BTFSC	KAPCSOLO_PORTA0_TIMER_ALLAPOT,2	; el lett engedve     eloszor jott ide? (hosszu megnyomas utan eloszor elengedett kapcsolo?)
	GOTO	elengedesi_pergesmentesites	; nem eloszor jott ide >> ki kell kerulni a timer nullazast
	CALL	RESET_KAPCSOLO_PORTA0_TIMER		; eloszor jott ide >> nullazzuk a timer szamolo byte-okat kapcsolo elengedes perges mentesitesehez (timer eddig is futott, most is novelgeti oket de 0-rol) 
	BSF	KAPCSOLO_PORTA0_TIMER_ALLAPOT,2	; jelezzuk megtortent a timer nullazas az elengedes perges mentesitesehez (legkozelebb atugorja a timer resetet, csak azt nezi eltelt-e a pergesmentesitesi ido)

elengedesi_pergesmentesites
	MOVLW	D'12'				;  ####### 0,15s ########
	SUBWF	KAPCSOLO_PORTA0_TIMER_1,0		; < 0,15sec?            d=0 miatt a W-be kerül (ne módosítsa a file tartalmát)
	BTFSS	STATUS,C
	RETURN					; KAPCSOLO_PORTA0_TIMER_1 <  a 0,15sec-hez beallitott erteknel     azaz  KAPCSOLO_PORTA0_TIMER nem jart még le	
	banksel	KAPCSOLO_PORTA0_TIMER_ALLAPOT
	CLRF	KAPCSOLO_PORTA0_TIMER_ALLAPOT	; KAPCSOLO_PORTA0_TIMER_1 >= a 0,15sec-hez beallitott erteknel     azaz  KAPCSOLO_PORTA0_TIMER lejart          leallitjuk a KAPCSOLO_PORTA0_TIMER-t    toroljuk az osszes jelzo bitet   (vegeztunk az idozitessel)
	CALL	RESET_KAPCSOLO_PORTA0_TIMER		; Timert alapallapotba tesszuk			
	RETURN

;-------------------------------------------------------
KAPCSOLO_PORTA0_ROVID_MEGNYOMAS			; rovid megnyomas teendoi
	BSF	PORTC,5				; adatküldés engedélyezése
	RLNCF	PORTD_ELOBYTE,1
	BTFSS	TXSTA,TRMT
	RETURN					; TSR teli van nem lehet/szabad a TXREG registerbe adatot tolteni
	MOVFF	PORTD_ELOBYTE,TXREG		; TSR ures lehet adatot kuldeni
	BCF	PORTC,5				; adatküldés tiltása
	RETURN

KAPCSOLO_PORTA0_HOSSZU_MEGNYOMAS		; hosszu megnyomas teendoi
	NOP
	RETURN
;-------------------------------------------------------	




;##############################################################################
;##############################################################################
;###########################                       ############################
;###########################     t i m e r e k     ############################
;###########################                       ############################
;##############################################################################
;##############################################################################

timerekleptetese
;_________________________________________________________________________________________
KAPCSOLO_PORTA0_TIMER					; a KAPCSOLO_PORTA0_KEZELES -ben használt timer
	BANKSEL	KAPCSOLO_PORTA0_TIMER_ALLAPOT
	BTFSS	KAPCSOLO_PORTA0_TIMER_ALLAPOT,0 	;használatban?
	GOTO	KAPCSOLO_PORTA0_TIMER_VEGE
	INCF	KAPCSOLO_PORTA0_TIMER_1,1		;minden TMR megszakitasra no
KAPCSOLO_PORTA0_TIMER_VEGE
;_________________________________________________________________________________________
; további timerek változóinak rutinjait ide
;_________________________________________________________________________________________
	RETURN
;_________________________________________________________________________________________
			; használt timerek reset subrutinjai
RESET_KAPCSOLO_PORTA0_TIMER
	CLRF	KAPCSOLO_PORTA0_TIMER_1		;Reset TIMER szamolo byte-ok
	RETURN
;_________________________________________________________________________________________
	; további timerek reset subrutinjait ide
;_________________________________________________________________________________________

;##############################################################################
;##############################################################################
;#####################                                 ########################
;#####################        FELÁLLÁS KÉSLELTETO      ########################
;#####################                                 ########################
;##############################################################################
;##############################################################################

DELAY					;Delay labelje
	banksel	T1ERTEK
	MOVFF	T1ERTEK,T1
DEL
	MOVFF	T2ERTEK,T2
DEL1
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	DECFSZ	T2,1			;Ha már nulla, akkor ugyanez eljátszódik a T2-vel
	GOTO	DEL1
	DECFSZ	T1,1			;Majd a T1-el is
	GOTO	DEL
	RETURN				;Visszatér a DELAY szubrutinból





;******************************************************************************
;End of program

		END



























