;Ablakemelő modul (PIC18F25K80)
;Készítette: én
;2011.09.26.

;------------------------------------------------------------
	list	P=18F25K80
#include	"P18F25K80.INC"


;              config CPUDIV = NOCLKDIV
;              config USBDIV = OFF
;              config FOSC   = HS
;              config PLLEN  = ON
              config FCMEN  = OFF
              config IESO   = OFF
;              config PWRTEN = OFF
              config BOREN  = OFF
;              config BORV   = 30
              config WDTEN  = OFF
              config WDTPS  = 32768
              config MCLRE  = OFF      ;ez mos legyen inább ON!
;              config HFOFST = OFF
              config STVREN = ON
;              config LVP    = OFF
              config XINST  = OFF
;              config BBSIZ  = OFF
              config CP0    = OFF	;kódvédelem
              config CP1    = OFF	;kódvédelem
              config CPB    = OFF	;kódvédelem
              config WRT0   = OFF
              config WRT1   = OFF
              config WRTB   = OFF
              config WRTC   = OFF
              config EBTR0  = OFF
              config EBTR1  = OFF
              config EBTRB  = OFF 
;		config	OSC = INTIO67
;		config	OSC = HSPLL
;		config	WDT = OFF



	config	RETEN	=	OFF		;stabkocka(?) kikapcs
	config	FOSC	=	INTIO2	;belső oszcillátor
	config	PLLCFG	=	OFF		;PLL kikapcsolva


;***************************************************************************************

TablSize EQU .160
LastIndex EQU TablSize-1

#define	GYÚJTÁS					PORTB,0
#define KPZ_ZÁRÁS				PORTB,1
#define	GOMB_VEZETŐOLDAL_FEL	PORTB,5
#define	GOMB_VEZETŐOLDAL_LE		PORTB,4
#define	GOMB_UTASOLDAL_FEL		PORTC,4
#define	GOMB_UTASOLDAL_LE		PORTC,5
#define	RELÉ_VEZETŐOLDAL_FEL	LATC,1
#define	RELÉ_VEZETŐOLDAL_LE		LATC,0
#define	RELÉ_UTASOLDAL_FEL		LATC,2
#define	RELÉ_UTASOLDAL_LE		LATC,3

#define	GIE_temp				ÜZEMMÓD,0

;***************************************************************************************

    UDATA_ACS

	STATUS_TEMP				res	1
	W_TEMP					res	1

	delay0					res 1
	delay1					res 1
	delay2					res 1
	delay3					res 1
	megszak_időzítés1		res	1
	reg1					res 1
	ÜZEMMÓD					res 1
			;Az "ÜZEMMÓD" regiszter 0. bitje -> GIE_temp bit
	minta_számláló			res 1
	elvetett_minta_számláló	res 1
	összeg					res	3
	osztó					res	2
	maradék					res 2
	osztandó_eredmény		res 4
	regiszter1				res	4	;a matematikai rutinok során használt segéd regiszter
	szorzó1					res	2
	szorzó2					res	2
	szorzat_eredmény		res 4

	UDATA
	minta_tábla				res TablSize		;minták tárolására használt 160 bájt
#define	utolsó_elem	minta_tábla+LastIndex

;*************** EEPROM ******************
;EEPROM tartalma:
;	0.bájt->
;	1.bájt->
;	2.bájt->
;	4.bájt->
;	5.bájt->
org  0xF00000
ch_tb12 de h'00',h'F4', h'01', h'00', h'A0', h'0F'	;EEPROM feltöltése

;****************** VEKTOROK **************************	
RST CODE 0x0000
	goto	START1		;melyik program fusson?
HI_VEC	CODE 0x0008		;megszakítási cím
    goto	hi_isr
LO_VEC	CODE 0x0018
    goto	hi_isr


;**************** MEGSZAKÍTÁSOK ***********************
PGM	CODE
lo_isr
	retfie

hi_isr
	;W és STATUS regiszterek tartalmának elmentése:
	MOVWF	W_TEMP			;W REGISZTER ELTÁROLÁSA
	SWAPF	STATUS,W		
	MOVWF 	STATUS_TEMP		;STATUS REGISZTER ELTÁROLÁSA

	;Annak kitalálása, hogy mi okozta a megszakítást:
	btfsc	PIR4, CCP3IF		;CCP3 megszakítás ellenőrzése (10ms)
	bra		Megszakítás_10ms
	btfsc	INTCON, INT0IF		;INT0 megszakítás ellenőrzése (gyújtás)
	bra		Megszakítás_gyújtás
	btfsc	INTCON3, INT1IF		;INT1 megszakítás ellenőrzése (KPZ zárás)
	bra		Megszakítás_KPZ_zárás
	goto	Megszakítás_kilépés

;******************************************************
Megszakítás_gyújtás
goto$


Megszakítás_KPZ_zárás
goto$


Megszakítás_10ms
goto$



;******************************************************
Megszakítás_kilépés
	swapf	STATUS_TEMP,W	
	movf 	STATUS			;Az elmentett STATUS regiszter visszaállítása
	swapf	W_TEMP,F
	swapf	W_TEMP,W		;Az elmentett W regiszter visszaállítása
	bsf		INTCON, GIE		;Globális megszakítás engedélyezése!
	RETFIE
;************** MEGSZAKÍTÁS VÉGE *******************
	



;-------------------------------------------------------------------------------
;----------------------START1---------------------------------------------------
;-------------------------------------------------------------------------------
START1
	call	PIC_INICIALIZÁLÁS
	bsf		INTCON, GIE			;globális megszakítás engedélyezés




;--------------------------------------------------------------------------------------
;------------------------------ FŐ PROGRAMCIKLUS VÉGE ---------------------------------
;--------------------------------------------------------------------------------------
	

	goto	$



;-------------------------------------------------------------------------
;------------SZUBRUTINOK--------------------------------------------------
;-------------------------------------------------------------------------

PIC_INICIALIZÁLÁS
;	Órajel beállítása:
	movlw	b'01011110' 	;4MHz-es belső órajel
	movwf	OSCCON
	bcf		OSCTUNE, PLLEN	;PLL kikapcsolása
;***********************************
;	I/O lábak beállítása:
	movlw	b'11111111'		
	movwf	TRISB			;PORTB minden lába bemenet lesz
	movlw	b'00000000'
	movwf	TRISC			;PORTC minden lába kimenet lesz
	clrf	LATC			;PORTC minden lába L szintű legyen!
	banksel	ANCON0
	bsf		ANCON0, ANSEL0	;RA0 analóg láb lesz
	bsf		ANCON0, ANSEL1	;RA1 analóg láb lesz
	bcf		ANCON0, ANSEL2	;RA2 digitális láb lesz
	bcf		ANCON0, ANSEL3	;RA3 digitális láb lesz
	bcf		ANCON0, ANSEL4	;RA5 digitális láb lesz
	bcf		ANCON1, ANSEL8	;RB1 digitális láb lesz
	bcf		ANCON1, ANSEL9	;RB4 digitális láb lesz
	bcf		ANCON1, ANSEL10	;RB0 digitális láb lesz
;**********************************
;	TMR1 konfigurációja:
	movlw	b'00000011'	;Fosc/4, 16 bites mód, számláló bekapcsolva
	movwf	T1CON
;***********************************
;	CCP modul konfigurációja:
	movlw	b'00001011'
	banksel	CCP3CON
	movwf	CCP3CON			;CCP3 modul compare módban működik TMR nullázással
	bcf		CCPTMRS, C3TSEL	;CCP3 órajele a TMR1 legyen!
	;Időzítés beállítása:
	movlw	h'27'
	banksel	CCPR3H
	movwf	CCPR3H
	movlw	h'10'
	banksel	CCPR3L
	movwf	CCPR3L	;10000-re állítjuk a CCP3 modult, azaz 10ms-onként történjen megszakítás!
;***********************************
;	A/D konfigurációja:
	movlw	b'00000001'
	movwf	ADCON0			;AN0 lesz használva, engedélyezve
	movlw	b'00100000'	
	movwf	ADCON1			;belső 2,048V-os referenciaforrás
	movlw	b'10001101'
	movwf	ADCON2			;eredmény jobbra igazítása, 2TAD, Fosc/16
;**********************************
;	Megszakítások konfigurációja:
	clrf	INTCON
	bsf		INTCON, INT0IE		;INT0 megszakítás engedélyezése
	bsf		INTCON3, INT1IE		;INT1 megszakítás engedélyezése
	bsf		INTCON2, INTEDG0	;INT0 megszakítás felfutó élre történjen
	bsf		INTCON2, INTEDG1	;INT1 megszakítás felfutó élre történjen
	bsf		PIE4, CCP3IE		;CCP3 megszakítás-engedélyezése
	bsf		INTCON, PEIE		;periféria-megszakítás engedélyezve
	RETURN

;----------------------------------------------------------------------------------------

;#include	"Ablakemelo modul szubrutinok.inc"






	goto	$
	END