;Forrasztóállomás III. (PIC18F26K80)
;Készítette: én
;2011.07.03.

;------------------------------------------------------------
	list	P=18F26K80
#include	"P18F26K80.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      ;
;              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






;Programverzió:
#define	verzió_egészek	d'2'
#define	verzió_tizedek	d'1'
#define	verzió_századok	d'0'

#define	dátum_év1000	d'2'
#define	dátum_év100		d'0'
#define	dátum_év10		d'1'
#define	dátum_év1		d'1'

#define	dátum_hónap10	d'0'
#define	dátum_hónap1	d'5'

#define	dátum_nap10		d'1'
#define	dátum_nap1		d'5'

;***************************************************************************************
TablSize EQU .160
LastIndex EQU TablSize-1

#define	lcd_RS		LATA,5
#define	lcd_EN		LATA,7
#define lcd_b4		LATA,6
#define lcd_b5		LATC,0
#define lcd_b6		LATC,1
#define lcd_b7		LATB,4
#define	lcd_kontraszt	LATA,7
#define	lcd_háttér		LATB,5

#define	RELÉ			LATC,3
#define	GOMB			PORTB,2
#define	Mozgás_szenzor	LATB,3
#define	FET				LATC,2

#define	ENKÓDER_A		PORTB,1
#define	ENKÓDER_B		PORTC,6
#define	ENKÓDER_Z		PORTB,0

#define	GIE_temp		ÜZEMMÓD2, 1

;***************************************************************************************

    UDATA_ACS
	TEMP					res	8
	digit1					res	1
	digit2					res	1
	digit3					res	1
	digit4					res	1
	digit5					res	1
	digit6					res	1
	digit7					res	1
	digit8					res	1

	W_TEMP					res 1
	STATUS_TEMP				res 1
	SZAM1_felso				res 1
	SZAM1_also				res 1

	FESZÜLTSÉG				res 2
	ÁRAM					res 2
	TELJESÍTMÉNY			res 2

	ENKÓDER_STÁTUSZ			res	1
	Z_számláló				res	1

	PWM_állandó				res	2	;(10000-szeres!)
	P_végkitérés			res	2

	offset_idő_számláló		res	1

	AN_0_offset				res	2
	AN_1_offset				res	2

	ezresek					res 1
	szazasok				res 1
	tizesek					res 1
	egyesek					res 1

	vonalkijelzés1			res	2
	vonalkijelzés2			res	1
	vonalkijelzés3			res	1
	vonalkijelzés4			res	1
	vonalkijelzés5			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 -> bemenetek (0->BE1=Ube BE2=Ibe, 1->BE1=Ibe BE2=Ube) (BE1=AN1=nem inv. bemenet) (BE2=AN0=inv. bemenet)
			;						1. bitje -> maximum: 40V/400V (0=40V, 1=400V)
			;						2. bitje -> maximum: 4A/40A (0=4A, 1=40A)
			;						3. bitje -> mintavétel: 0=még nem jött el az ideje, 1=lejárt a mintavételi idő
			;						4. bitje -> mért ellenállás (0=Ohm, 1=kOhm)
			;						5. bitje -> feszültség-kijelzés blokkolás (0=nem, 1=igen)
			;						6. bitje -> áram-kijelzés blokkolás (0=nem, 1=igen)
			;						7. bitje -> teljesítmény-kijelzés blokkolás (0=nem, 1=igen)
	ÜZEMMÓD2				res 1
			;Az "ÜZEMMÓD2" regiszter 0. bitje -> ellenállás-kijelzés blokkolás (0=nem, 1=igen)
			;						 1. bitje -> GIE_temp bit
			;						 2. bitje -> offset-mérés szükséges? (0=nem, 1=igen)
	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->P_végkitérés
;	2.bájt->P_végkitérés+1
;	4.bájt->MAX_ÁRAM
;	5.bájt->MAX_ÁRAM+1
;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
	MOVWF	W_TEMP			;W REGISZTER ELTÁROLÁSA
	SWAPF	STATUS,W		
	MOVWF 	STATUS_TEMP		;STATUS REGISZTER ELTÁROLÁSA

	btfsc	PIR1, TMR2IF	;TMR2 megszakítás ellenőrzése
	bra		TMR2_megszakítás
	btfsc	INTCON3, INT1IF
	bra		Megszak_enkóder_A
	btfsc	INTCON3, INT0IF
	bra		Megszak_enkóder_Z
	goto	megszakitas_kilepes


;***************************************************************************************
;TMR2 okozta megszakítás lekezelése:
TMR2_megszakítás
	bsf		INTCON3, INT0IE	;enkóder 'Z' (INT0) megszakítás engedélyezése
	btfsc	ENKÓDER_Z
	bra		mkm1
	movlw	d'255'
	cpfseq	Z_számláló
	incf	Z_számláló	;ha az enkóder be van nyomva és a Z számláló nem érte még el a 255-öt, akkor inkrementáljuk!

mkm1
	bsf		ÜZEMMÓD, 3
	decfsz	offset_idő_számláló
	bra		megszakitas_kilepes
	bsf		ÜZEMMÓD2, 2
	movlw	d'100'
	movwf	offset_idő_számláló




;***************************************************************************************
;Enkóder lekezelése (gomblenyomás) a megszakításban:
Megszak_enkóder_Z
;Ha a megszakítás azért történt, mert Z alacsony szintre váltott (lenyomtuk a gombbot):
	btfsc	INTCON2, INTEDG0	;úgy történt a 'Z' megszakítás, hogy az érzékelés lefutó élre van állítva? (ha igen akkor ugrik!)
	bra		enkm1
	btfsc	ENKÓDER_Z
	bra		megszakitas_kilepes
	call	delay100us
	btfsc	ENKÓDER_Z
	bra		megszakitas_kilepes
	call	delay100us
	btfsc	ENKÓDER_Z
	bra		megszakitas_kilepes

	bsf		INTCON2, INTEDG0	;megszakítást Z-n felfutó élre állítjuk!
	clrf	Z_számláló
	bra		megszakitas_kilepes

;Ha a megszakítás azért történt, mert Z magas szintre váltott (felengedtük a gombbot):
enkm1
	btfss	ENKÓDER_Z
	bra		megszakitas_kilepes
	call	delay10ms
	btfss	ENKÓDER_Z
	bra		megszakitas_kilepes
	call	delay10ms
	btfss	ENKÓDER_Z
	bra		megszakitas_kilepes

	bcf		INTCON2, INTEDG0	;megszakítást Z-n lefutó élre állítjuk!
	movlw	d'3'
	cpfslt	Z_számláló		;Z_számláló regiszter tartalma kisebb mint 3? (ha igen akkor ugrik!)
	bra		hosszú_lenyomás			;hosszú gomb-nyomvatartás történt!
	bra		rövid_lenyomás			;rövid gomblenyomás történt!

;--------------------------------------------------------------------------

rövid_lenyomás
hosszú_lenyomás
bra		megszakitas_kilepes


;-------------------------------------------------------------------------------

;Enkóder lekezelése (tekerés) a megszakításban:
Megszak_enkóder_A
	btfsc	INTCON2, INTEDG1	;úgy történt a 'A' megszakítás, hogy az érzékelés lefutó élre van állítva? (ha igen akkor ugrik!)
	bra		tekerés_felfutóél
tekerés_lefutóél
;Ha a megszakítás azért történt, mert A alacsony szintre váltott:
	btfsc	ENKÓDER_A
	bra		megszakitas_kilepes
	call	delay100us
	btfsc	ENKÓDER_A
	bra		megszakitas_kilepes
	call	delay100us
	btfsc	ENKÓDER_A
	bra		megszakitas_kilepes

	bsf		INTCON2, INTEDG1	;megszakítást A-n felfutó élre állítjuk!

	btfsc	ENKÓDER_Z			;enkóder be van nyomva? (ha igen akkor ugrik!)
	bra		kis_tekerés_lf		;ha az enkóder nincs benyomva
	bcf		INTCON3, INT0IE		;enkóder 'Z' (INT0) megszakítás tiltása! (azért, hogy a felengedés után egy kis ideig még ne érzékeljen Z-t)
	bcf		INTCON2, INTEDG0	;megszakítást Z-n lefutó élre állítjuk! (azért, hogy az enkóder tekerés utáni felengedése ne generáljon megszakítást)
	bra		nagy_tekerés_lf		;ha az enkóder be van nyomba
kis_tekerés_lf
	btfss	ENKÓDER_B			;B magas szintű? (ha igen akkor ugrik!)
	bra		kis_tekerés_balra	;ha B alacsony szintű
	bra		kis_tekerés_jobbra	;ha B magas szintű
nagy_tekerés_lf
	btfss	ENKÓDER_B			;B magas szintű? (ha igen akkor ugrik!)
	bra		nagy_tekerés_balra	;ha B alacsony szintű
	bra		nagy_tekerés_jobbra	;ha B magas szintű

;-----------------------------------------------

tekerés_felfutóél
;Ha a megszakítás azért történt, mert A magas szintre váltott:
	btfss	ENKÓDER_A
	bra		megszakitas_kilepes
	call	delay100us
	btfss	ENKÓDER_A
	bra		megszakitas_kilepes
	call	delay100us
	btfss	ENKÓDER_A
	bra		megszakitas_kilepes

	bcf		INTCON2, INTEDG1	;megszakítást A-n lefutó élre állítjuk!

	btfsc	ENKÓDER_Z			;enkóder be van nyomva? (ha igen akkor ugrik!)
	bra		kis_tekerés_ff		;ha az enkóder nincs benyomva
	bcf		INTCON3, INT0IE		;enkóder 'Z' (INT0) megszakítás tiltása! (azért, hogy a felengedés után egy kis ideig még ne érzékeljen Z-t)
	bcf		INTCON2, INTEDG0	;megszakítást Z-n lefutó élre állítjuk! (azért, hogy az enkóder tekerés utáni felengedése ne generáljon megszakítást)
	bra		nagy_tekerés_ff		;ha az enkóder be van nyomba
kis_tekerés_ff
	btfss	ENKÓDER_B			;B magas szintű? (ha igen akkor ugrik!)
	bra		kis_tekerés_jobbra	;ha B alacsony szintű
	bra		kis_tekerés_balra	;ha B magas szintű
nagy_tekerés_ff
	btfss	ENKÓDER_B			;B magas szintű? (ha igen akkor ugrik!)
	bra		nagy_tekerés_jobbra	;ha B alacsony szintű
	bra		nagy_tekerés_balra	;ha B magas szintű

;-----------------------------------------------


kis_tekerés_balra
kis_tekerés_jobbra
nagy_tekerés_balra
nagy_tekerés_jobbra
bra		megszakitas_kilepes


;***************************************************************************************





megszakitas_kilepes
	SWAPF	STATUS_TEMP,W	
	MOVWF 	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
	bcf		INTCON, T0IF	;TMR0 megszakítás jelzőbitjét töröljük
	bcf		INTCON3, INT0IF	;enkóder 'Z' megszakítás jelzőbitjét töröljük
	bcf		INTCON3, INT1IF	;enkóder 'A' megszakítás jelzőbitjét töröljük
	BSF		INTCON, GIE		;ÁLTALÁNOS MEGSZAKÍTÁS ENGEDÉLYEZÉSE
	RETFIE
;************** MEGSZAKÍTÁS VÉGE *******************
	











;-------------------------------------------------------------------------------
;----------------------START1---------------------------------------------------
;-------------------------------------------------------------------------------
START1
	bcf		INTCON, GIE			;globális megszakítás tiltás
	call	PIC_INICIALIZÁLÁS
	bcf		INTCON, GIE			;globális megszakítás tiltás

bcf	lcd_háttér
bcf	lcd_kontraszt



	call	LCD_inicializálás
;	call	LCD_felh_karakt_betölt

	call	Köszönés_LCD
goto$
	call	delay1s
	call	LCD_törlés
	call	Név_LCD
	call	delay1s
	call	LCD_törlés
	call	Verziószám_LCD
	call	delay1s
	call	LCD_törlés
	call	Dátum_LCD
	call	LCD_törlés
	call	LCD_felh_karakt_betölt_2






;--------------------------------------------------------------------------------------
;------------------------------ FŐ PROGRAMCIKLUS VÉGE ---------------------------------
;--------------------------------------------------------------------------------------
	



	goto	$



;-------------------------------------------------------------------------
;------------ SZUBRUTINOK --------------------------------------------------
;-------------------------------------------------------------------------

PIC_INICIALIZÁLÁS
;	Órajel konfigurációja:
	movlw	b'01011100' 	;4MHz
	movwf	OSCCON
	bcf		OSCTUNE, PLLEN	;PLL kikapcsolása
;***********************************
;	I/O lábak beállítása:
	movlw	b'00001111'		
	movwf	TRISB			;RB0, RB1, RB2 és RB3 bemenet lesz
	bsf		OSCCON, SOSCEN	;
	movlw	b'01000000'
	movwf	TRISC			;RC6 bemenet lesz
	movlw	b'00011111'
	movwf	TRISA			;RA7, RA6 és RA5 kimenet lesz
	banksel	ANCON0
	bcf		ANCON0, ANSEL4	;RA5 digitális láb lesz
	banksel	ANCON1
	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
	banksel	WPUB
	movlw	b'00001111'
	movwf	WPUB		;RB0, RB1, RB2 és RB3 lábakra a felhúzóellenállások bekapcsolása
;***********************************
;	PWM konfigurációja:
	bsf		ODCON,CCP2OD
	bsf		ODCON,CCP4OD
	bsf		ODCON,CCP5OD

	movlw	b'00001100'	;PWM mód
	banksel	CCP2CON
	movwf	CCP2CON		;RC2-es láb PWM módban működik
	banksel	CCP4CON
	movwf	CCP4CON		;RC7-es láb PWM módban működik
	banksel	CCP5CON
	movwf	CCP5CON		;RB5-ös láb PWM módban működik

	banksel	CCPTMRS
	bsf		CCPTMRS, C2TSEL		;CCP2 órajele a TMR4 legyen!
	bsf		CCPTMRS, C4TSEL		;CCP4 órajele a TMR4 legyen!
	bsf		CCPTMRS, C5TSEL		;CCP5 órajele a TMR4 legyen!
	movlw	b'00000100'	;1:1-es utóosztó, számláló engedélyezve, 1:1-es előosztó
	banksel	T4CON
	movwf	T4CON
	movlw	d'255'
	banksel	PR4
	movwf	PR4

	movlw	b'00000000'
	banksel	CCPR2L
	movwf	CCPR2L			;kitöltési tényező 10.-2. bitjei
	banksel	CCP2CON
	bcf		CCP2CON, DC2B1	;kitöltési tényező 1. bitje
	bcf		CCP2CON, DC2B0	;kitöltési tényező 0. bitje

	movlw	b'00100000'
	banksel	CCPR4L
	movwf	CCPR4L			;kitöltési tényező 10.-2. bitjei
	banksel	CCP4CON
	bcf		CCP4CON, DC4B1	;kitöltési tényező 1. bitje
	bcf		CCP4CON, DC4B0	;kitöltési tényező 0. bitje

	movlw	b'00000000'
	banksel	CCPR5L
	movwf	CCPR5L			;kitöltési tényező 10.-2. bitjei
	banksel	CCP5CON
	bcf		CCP5CON, DC5B1	;kitöltési tényező 1. bitje
	bcf		CCP5CON, DC5B0	;kitöltési tényező 0. bitje

	banksel	ÜZEMMÓD

;***********************************
;	A/D konfigurációja:
	movlw	b'00000001'
	movwf	ADCON0			;AN0 lesz használva, engedélyezve
	movlw	b'00101011'	
	movwf	ADCON1			;belső 2,048V-os referencia, VREF- és az analóg negatív bemenet az AN2
	movlw	b'10010000'
	movwf	ADCON2			;eredmény jobbra igazítása, 4TAD, Fosc/2
	movlw	b'00001111'
	movwf	ANCON0			;AN0, AN1, AN2 és AN3 analóg láb lesz, a többi digitális
	movlw	b'00000000'
	movwf	ANCON1			;a többi digitális láb
;**********************************
;	TMR2 konfigurációja:
	movlw	b'01111111'	;1:16-os utóosztó, számláló engedélyezve, 1:16-os előosztó
	banksel	T2CON
	movwf	T2CON
	movlw	d'125'	;pontosan 32ms-onként csordul túl
	banksel	PR2
	movwf	PR2
;**********************************
;	Megszakítások konfigurációja
	clrf	INTCON
	bsf		INTCON, INT0IE		;INT0 megszakítás-engedélyezése
	bsf		INTCON3, INT0IE		;INT1 megszakítás-engedélyezése
	bsf		INTCON3, INT1IE		;INT2 megszakítás-engedélyezése
	bsf		INTCON3, INT3IE		;INT3 megszakítás-engedélyezése
	bsf		INTCON3, INT1IP		;INT1 megszakítás magas prioritású legyen
	bsf		INTCON3, INT2IP		;INT2 megszakítás magas prioritású legyen
	bsf		INTCON2, INT3IP		;INT3 megszakítás magas prioritású legyen
	bcf		INTCON2, INTEDG0	;INT0 megszakítás lefutó élre történjen
	bcf		INTCON2, INTEDG0	;INT2 megszakítás lefutó élre történjen
	bcf		INTCON2, INTEDG1	;INT2 megszakítás lefutó élre történjen
	bcf		INTCON2, INTEDG3	;INT3 megszakítás lefutó élre történjen
	bsf		PIE1, TMR2IE		;timer2 túlcsordulás-megszakítás engedélyezése
	bsf		INTCON, PEIE		;periféria-megszakítás engedélyezve
	bsf		INTCON, GIE			;globális megszakítás engedélyezés
	RETURN

;----------------------------------------------------------------------------------------

#include	"Forrasztoallomas III szubrutinok.inc"



	goto	$
	END