	#include <p18f1320.inc>
	LIST P=18f1320, F=INHX32
	CONFIG 	OSC=INTIO2				;Belső oszcillátor
	CONFIG	WDT=OFF					;watchdog off
	CONFIG	LVP=OFF					;low voltage programming off
	CONFIG	PWRT=ON					;power-up timer on
	radix dec
	
;***********************************************

	CBLOCK 	0x020
		pwm_duty
		pwm_loop
		Timer1
		Timer2
		Timer3
		Temp
		Temp2
		State
		Batchk
		Batst
		Ntcchk
		Ntcst
		Tmrdb
		Dlytemp
	ENDC

;***********************************************

Led1		equ 0	;RB0, 8-as láb, PORTB0 	Digitális kimenet!
Led2		equ 1	;RB1, 9-es láb, PORTB1 	Digitális kimenet!
Led3		equ 4	;RB4, 10-es láb, PORTB4	Digitális kimenet!
Led4		equ 5	;RB5, 11-es láb, PORTB5	Digitális kimenet!
Led5		equ 2	;RB2, 17-es láb, PORTB2	Digitális kimenet!
Led6		equ 3	;RB3, 18-as láb, PORTB3	Digitális kimenet!
Led7		equ	3	;RA3, 7-es láb, PORTA3	Digitális kimenet!
NTC			equ 0	;RA0, 1-es láb, AN0		Analóg bemenet!!!
Battery		equ 1	;RA1, 2-es láb, AN1		Analóg bemenet!!!
Switch1		equ 2	;RA2, 6-os láb, PORTA2  Digitális bemenet! 
Switch2		equ 4	;RA4, 3-as láb, PORTA4	Digitális bemenet!

Bat10		equ	184						;10% =10,4V		100%-nál!		
Bat20		equ	189						;20% =10,6V		10%-ként= 3perc!
Bat30		equ	192						;30% =10,8V
Bat40		equ	194						;40% =11,0V
Bat50		equ	196						;50% =11,2V
Bat60		equ	198						;60% =11,4V
Bat70		equ	200						;70% =11,6V
Bat80		equ	202						;80% =11,8V
Bat90		equ	203						;90% =12,0V
Bat100		equ	204						;100%=12,2V

Bat10_7		equ	181						;10% =10,8V		75%-nál!
Bat20_7		equ	188						;20% =11,27V	10%-ként= 5,5perc!
Bat30_7		equ	192						;30% =11,48V
Bat40_7		equ	195						;40% =11,68V
Bat50_7		equ	197						;50% =11,8V
Bat60_7		equ	200						;60% =11,96V
Bat70_7		equ	202						;70% =12,07V
Bat80_7		equ	203						;80% =12,16V
Bat90_7		equ	205						;90% =12,25V
Bat100_7	equ	207						;100%=12,35V

Bat10_5		equ	172						;10% =10,28V	50%-nál!
Bat20_5		equ	181						;20% =10,82V	10%-ként= 8perc!
Bat30_5		equ	187						;30% =11,21V
Bat40_5		equ	192						;40% =11,50V
Bat50_5		equ	195						;50% =11,67V
Bat60_5		equ	198						;60% =11,82V
Bat70_5		equ	200						;70% =11,95V
Bat80_5		equ	202						;80% =12,07V
Bat90_5		equ	204						;90% =12,18V
Bat100_5	equ	206						;100%=12,28V

Ntc25		equ	50						;25 fok=0,9V
Ntc40		equ	75						;40 fok=1,47V
Ntc50		equ	96						;50 fok=1,9V
Ntc60		equ	119						;60 fok=2,34V
Ntc70		equ	139						;70 fok=2,75V
Ntc80		equ	164						;80 fok=3,24V
Ntc90		equ	174						;90 fok=3,44V
Ntc100		equ	192						;100 fok=3,79V		

P100		equ	255
P75			equ	158
P50			equ	137	
P25			equ 77	

;***********************************************
;	pwm DutyCyle értékek
;	0	=4.75v			100%=1.50v= 185		
;	10	=4.59v			 80%=2.23v= 152		
;	20	=4.43v			 60%=2.80v= 123		
;	30	=4.27v			 40%=3.15v= 101		
;	40	=4.12v			 20%=3.80v= 60
;	50	=3.96v			
;	60 	=3.80v			 75%= 145	2,4V
;	70	=3.64v			 50%= 117	2,95V
;	80	=3.48v
;	90	=3.32v
;	100	=3.16v
;	110	=3.00v
;	120	=2.85v
;	130	=2.69v
;	140	=2.48v	
;	150	=2.26v
;	160	=2.05v
;	170	=1.84v
;	180	=1.62v
;	190	=1.41v
;	200	=1.20v
;	210	=0.98v
;	220	=0.76v
;	230 =0.54v
;	240	=0.33v
;	250	=0.11v
;	255 =0.01v

;	NTC összefüggések 5v tápról
;	25c=100k	0,90V	 50 A/D
;	40c=53k		1,47V	 75 A/D	
;	50c=36k		1,90V	 96 A/D
;	60c=25k		2,34V	119 A/D
;	70c=18k		2,75V	139 A/D
;	80c=12k		3,24V	164 A/D
;	90c=10k		3,44V	174 A/D
;	100=7k		3,79V	192 A/D

;	Akkumlátor analóg bemenet 1/3-as fesz. osztóval.
;	Kritikus feszültség = 10,5V => 3,5V bemeneti jel => 161 (ADRESH, balra igazítva)
;	100%=4,05V (12,2V) = 204 A/D érték 
;	0,1V = 5,05 A/D érték,    12 Voltra => 1V = 16,73 A/D érték
;	
;***********************************************
	org		0X0000
	bra 	INIT
	org		0X0008						;Hi int vektor			
	bra		hi_int
	org		0X0018						;Low int vektor
	bra		low_int	
		
INIT	movlw	B'01110000'				;frekvencia 8Mhz
		iorwf	OSCCON
		bsf		RCON, IPEN				;prioritásos megszakítások engedélyezve
		movlw	B'10100000'				;belső megszakítások engedélyezve, TMR0 INT engedélyezve, többi tiltva
		movwf	INTCON					
		bsf		PIE1, ADIE				;A/D megszakítás engedélyezve
		bsf		IPR1, ADIP				;A/D int. High priority
		bcf		INTCON2, RBPU			;felhúzó ellenállások be
		bsf		INTCON2, TMR0IP			;TMR0 INT high priority
		movlw	B'01111100'				;csak AN0 és AN1 analóg, a többi digitális
		movwf	ADCON1	
		movlw	B'00100110'				;A/D clock 1/64 Fosc, 8TAD töltődési idő
		movwf	ADCON2	
		
		movlw	B'10010100'				;T0 be, 16 bit, belső órajel, előosztó be, 1:32 (így pont 1mp az ütem)
		movwf	T0CON
					
		clrf	TRISB					;PORTB lábak kimenetek
		bcf		TRISA,Led7
		bsf		TRISA,Switch1			;PORTA2 (RA2) bemenet
		bsf		TRISA,Switch2			;PORTA4 (RA4) bemenet
		bsf		TRISA, Battery	
		bsf		TRISA, NTC				
		call	leds_off
		call	delay
		call	sw_on
		
		setf	Batst					;Battery status '11111111' =100%
		clrf	Batchk
		clrf	Ntcchk
		clrf	Ntcst					;NTC status '00000000' = 20 fok vagy kevesebb
		clrf	Tmrdb					;Timer0 INT számláló 0-ba
		
		bsf		T0CON, TMR0ON			;Timer indít
		bcf		INTCON, GIE				;TESZT!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		bra		pwmloop					;A végtelen pwm ciklus indítása
										

;***************************************																
;Kapcsolók állásának meghatározása
sw_on	
		clrf	State
		btfss	PORTA, Switch1
		bsf		State, 0				;A State regiszter=0 ha egy gomb sincsen megnyomva
		btfss	PORTA, Switch2			;A State regiszter=1 ha csak Sw1 van megnyomva
		bsf		State, 1				;A State regiszter=2 ha csak Sw2 van megnyomva
										;A State regiszter=3 ha mindkét gomb meg van nyomva
				
sw_0	movlw	0
		cpfseq	State					;State=0?
		bra		sw_1
		movlw	P100
		movwf	pwm_duty
		return
		
sw_1	movlw	1
		cpfseq	State					;State=1?
		bra		sw_2
		movlw	P75
		movwf	pwm_duty
		return
		
sw_2	movlw	2
		cpfseq	State					;State=2?
		bra		sw_3
		movlw	P50
		movwf	pwm_duty
		return		
		
sw_3	movlw	P25
		movwf	pwm_duty
		return

;************************************		
pwmloop	clrf	Temp2
pwm2	call	pwm
		decfsz	Temp2
		bra		pwm2
		bra		pwmloop

pwm		clrf	pwm_loop
pwm1	addwf	pwm_duty,w
		btfss	STATUS, C
		call 	leds_off
		btfsc	STATUS, C
		call	leds_on
		
		decfsz	pwm_loop,f
		bra		pwm1
		return		

;************************************
leds_off							;Ledek kikapcsolása	
		bsf		LATA,Led7
		setf	LATB
		return		

;************************************
leds_on								;Ledek bekapcsolása	
		bcf		LATA,Led7
		clrf	LATB	
		return

;*************************************		
;Akkumlátor figyelés
bat_chk	call	leds_on
		movlw	B'00000101'				;referenciák Vdd és Vss, AN1, A/D on, idle
		movwf	ADCON0
		setf	Batchk					;Akku teszt lesz az A/D eredménye
		bsf		ADCON0, GO				;A/D indul
		return

battest	bcf		INTCON, GIE				;megszakitások ki
				
		clrf	Batchk					;jelzőbájt törlése
		setf	Batst
		
		movlw	Bat50					;W-be 50%-nak megfelelő érték
		subwf	ADRESH, W				;kivonjuk az A/D ereményt az 50%-ból
		btfsc	STATUS, N	
		bcf		Batst, 5				;Battery status = 'xx011111' = 50%
		
		movlw	Bat40					;W-be 40%-nak megfelelő érték
		subwf	ADRESH, W				;kivonjuk az A/D ereményt az 40%-ból
		btfsc	STATUS, N	
		bcf		Batst, 4				;Battery status = 'xx001111' = 40%
		
		movlw	Bat30					;W-be 30%-nak megfelelő érték
		subwf	ADRESH, W				;kivonjuk az A/D ereményt az 30%-ból
		btfsc	STATUS, N	
		bcf		Batst, 3				;Battery status = 'xx000111' = 30%
		
		movlw	Bat20					;W-be 20%-nak megfelelő érték
		subwf	ADRESH, W				;kivonjuk az A/D ereményt az 20%-ból
		btfsc	STATUS, N	
		bcf		Batst, 2				;Battery status = 'xx000011' = 20%
		
		movlw	Bat10					;W-be 10%-nak megfelelő érték
		subwf	ADRESH, W				;kivonjuk az A/D ereményt az 10%-ból
		btfsc	STATUS, N	
		bcf		Batst, 1				;Battery status = 'xx00001' = 10%
		
		bcf		PIR1, ADIF
		bsf		INTCON, GIE				;megszakitások be
		return
;***************************************
;NTC hőmérséklet figyelés
ntc_chk	movlw	B'00000001'				;referenciák Vdd és Vss, AN0, A/D on, idle
		movwf	ADCON0
		setf	Ntcchk					;NTC mérés lesz az A/D eredménye
		bsf		ADCON0, GO				;A/D indul
		return
ntctest	bcf		INTCON, GIE				;megszakitások tiltva
		bcf		PIR1, ADIF
		clrf	Ntcchk					;jelzőbájt törlése
		clrf	Ntcst
		
		movf	ADRESH,W				;W-be a mért érték
		subwf	Ntc25, W				;kivonjuk a 25 fokot 
		btfsc	STATUS, N	
		bsf		Ntcst, 0				;NTC status = '00000001' = 25 fok
	
		movf	ADRESH,W				;W-be a mért érték
		subwf	Ntc40, W				;kivonjuk a 40 fokot 
		btfsc	STATUS, N	
		bsf		Ntcst, 1				;NTC status = '00000011' = 40 fok
		
		movf	ADRESH,W				;W-be a mért érték
		subwf	Ntc50, W				;kivonjuk az 50 fokot 
		btfsc	STATUS, N	
		bsf		Ntcst, 2				;NTC status = '00000111' = 50 fok
		
		movf	ADRESH,W				;W-be a mért érték
		subwf	Ntc60, W				;kivonjuk a 60 fokot 
		btfsc	STATUS, N	
		bsf		Ntcst, 3				;NTC status = '00001111' = 60 fok
		
		movf	ADRESH,W				;W-be a mért érték
		subwf	Ntc70, W				;kivonjuk a 70 fokot 
		btfsc	STATUS, N	
		bsf		Ntcst, 4				;NTC status = '00011111' = 70 fok
		
		movf	ADRESH,W				;W-be a mért érték
		subwf	Ntc80, W				;kivonjuk a 80 fokot 
		btfsc	STATUS, N	
		bsf		Ntcst, 5				;NTC status = '00111111' = 80 fok
		
c80		btfss	Ntcst, 5
		bra		c70
		movlw	70
		movwf	pwm_duty
		bra		ntc_end	
		
c70		btfss	Ntcst, 4
		bra		c60
		movlw	100
		movwf	pwm_duty
		bra		ntc_end	
		
c60		btfss	Ntcst, 3
		bra		c50
		movlw	160
		movwf	pwm_duty
		bra		ntc_end							
		
c50		btfss	Ntcst, 2
		bra		c40
		movlw	195
		movwf	pwm_duty
		bra		ntc_end		

c40		btfss	Ntcst, 1
		bra		c0
		movlw	220
		movwf	pwm_duty
		bra		ntc_end			
		
c0		call	sw_on
		
ntc_end	bsf		INTCON, GIE				;megszakitások be
		return
;***************************************
;High megszakítások kezelése
hi_int	btfsc	INTCON, TMR0IF			;TMR0 okozta a megszakítást?
		call	tmr0int
		btfsc	Batchk,0
		call	battest
		btfsc	Ntcchk,0
		call	ntctest
		retfie
	
;***************************************		
;Low megszakítások kezelése
low_int	retfie

;***************************************
;Timer0 megszakítás lekezelése
tmr0int	bcf		INTCON, TMR0IF			;töröljük a flaget
		incf	Tmrdb					;számláló +1
		movlw	30						;30 mp
		subwf	Tmrdb, W
		btfss	STATUS, Z
		return

;ha megvolt a kellő várakozás akkor belép ide:	
		bcf		T0CON, TMR0ON			;Timer Stop
		clrf	Tmrdb
		bcf		INTCON, TMR0IE			;Timer megszakítás tiltva
		bsf		INTCON, GIE				;újra engedjük a megszakításokat
		call	bat_chk					;Akku teszt indul
		btfsc	Batchk,0				;lement már a batt_check?	
		bra		$-2
		call	ntc_chk					;hőmérséklet ellenőrzés
		btfsc	Ntcchk,0				;lement már a hőm. teszt?
		bra		$-2
		bsf		INTCON, TMR0IE			;Timer megszakítás engedélyezve
		bsf		T0CON, TMR0ON			;Timer indít
		return
;****************************************
;Késleltetés
delay	clrf	Timer1
		clrf	Timer2
				
delay1  decfsz  Timer1,1                 ; késleltetö szubrutin
        bra     delay1
        decfsz  Timer2,1
        bra     delay1
        return	

;******************************************


		end