#DEFINE AKTUALIS_DATUM 	"20090923"
#DEFINE AKTUALIS_VALTOZAT "0.00"

; -----------------------------------------------------------------------

    #include <p18f14k22.inc>

; -----------------------------------------------------------------------

    __CONFIG _CONFIG1H, _FOSC_IRC_1H & _FCMEN_OFF_1H & _PLLEN_ON_1H & _PCLKEN_OFF_1H & _IESO_OFF_1H 
    __CONFIG _CONFIG2L, _PWRTEN_ON_2L & _BORV_19_2L & _BOREN_SBORDIS_2L 
    __CONFIG _CONFIG2H, _WDTEN_OFF_2H & _WDTPS_1_2H 
    __CONFIG _CONFIG3H, _MCLRE_OFF_3H & _HFOFST_OFF_3H
    __CONFIG _CONFIG4L, _LVP_OFF_4L & _XINST_OFF_4L & _BBSIZ_ON_4L & _STVREN_ON_4L
    __CONFIG _CONFIG5L, _CP0_ON_5L & _CP1_ON_5L
    __CONFIG _CONFIG5H, _CPB_ON_5H & _CPD_OFF_5H
    __CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L
    __CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
    __CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L
    __CONFIG _CONFIG7H, _EBTRB_OFF_7H

;---------------------------------------------------------------------------------------
;OSCILLATOR FREQUENCY
#define OSCILLATOR	D'64000000'
#define ADCONV_DONE	0
;-----------------------------------------------------------------------------------------

;---------------------------------------------------------------------------------------
	
;---------------------------------------------------------------------------------------
INT_VAR 	UDATA 0x00000000

w_saved      		RES 1   ; variable used for context saving (for low-priority interrupts only)
status_saved 		RES 1   ; variable used for context saving (for low-priority interrupts only)
bsr_saved    		RES 1   ; variable used for context saving (for low-priority interrupts only)

result_h		RES 1
result_l		RES 1

summ_h			RES 1
summ_l			RES 1

avg_h			RES 1
avg_l			RES 1

calc_01			RES 1
calc_02			RES 1

flags			RES 1

;----------------------------------------------------------------------------------------------
STARTUP CODE 0x0000
	nop                       ; needed for ICD2 debugging
	nop                         ; needed for ICD2 debugging
	bra    START               ; menj a start kódra
	
;******************************************************************
;INTERRUPT SERVICE ROUTINE
;******************************************************************
;******************************************************************
; high priority interrupt vector
HIGH_INT_VECTOR CODE 0x0008
	

	retfie	FAST


;****************************************************************
;****************************************************************
PROG	CODE ; 0x00030

;****************************************************************
;INITIALIZATION OF THE PORTS AND TIMERS	

PWM_MODULE_ON
	
	movlw 	0xFF			; 	PWM kimenet idoalapja ( kb 8 kHz )
	movwf 	PR2
	
	movlw 	0x004			;  Timer 2 bekapcsolasa
	movwf 	T2CON

	movlw 	b'00111100'			; 	PWM uzemmod inditasa
	movwf 	CCP1CON

	movlw 	0x7F
	movwf 	CCPR1L

	movlw	b'00000011'
	movwf	PSTRCON

	return

FAST_RC

	bsf	OSCCON,6	;INTERNAL OSCILLATOR SELECTION
	bsf	OSCCON,5
	bsf	OSCCON,4

	return

AD_CONV_COMPLETE				;ADC INTERRUPT

	bcf	PIR1,ADIF			;ADIF FLAG IS CLEARED FOR NEXT INTERRUPT

	movlw	b'00100101'			;Channel9 is selected for next conversion
	movwf	ADCON0

	movf	ADRESH,W			;READ AD CONVERSION RESULT
	movwf	result_h
	movf	ADRESL,W
	movwf	result_l
	
	bsf	ADCON0, GO				;then start a new conversion

	bcf	STATUS,C
	rlcf	result_l,f
	rlcf	result_h,f

	rlcf	result_l,f
	rlcf	result_h,f

	rlcf	result_l,f
	rlcf	result_h,f

	rlcf	result_l,f
	rlcf	result_h,f

	rlcf	result_l,f
	rlcf	result_h,f

	bsf	flags,ADCONV_DONE

	return

PWM_DUTY_UPDATE

	movf	CCP1CON,w
	andlw	b'11001111'
	movwf	calc_02
	rrncf	avg_l,w
	movwf	calc_01
	rrncf	calc_01,w
	andlw	b'00110000'
	iorwf	calc_02,w
	movwf	CCP1CON
	movf	avg_h,w
	movwf	CCPR1L

	return


UPDATE_DATA

	movf	avg_l,w
	subwf	summ_l,f
	btfss	STATUS,C
	decf	summ_h,f

	movf	avg_h,w
	subwf	summ_h,f

	movf	result_l,w
	addwf	summ_l,f
	btfsc	STATUS,C
	incf	summ_h,f

	movf	result_h,w
	addwf	summ_h,f

	bcf	STATUS,C
	
	rrcf	summ_h,w
	movwf	avg_h
	rrcf	summ_l,w
	movwf	avg_l	

	return

SIGNAL_UPDATE
	
	bcf	flags,ADCONV_DONE

	call	UPDATE_DATA
	call	PWM_DUTY_UPDATE
	
	bcf	LATC,3
	movf	summ_h,W
	sublw	.240
	btfss	STATUS,C
	bsf	LATC,3

	bcf	LATC,2
	movlw	.15
	subwf	summ_h,W
	btfss	STATUS,C
	bsf	LATC,2

	btg	LATC,0

	return

; ---------------------------------------------------------------------------

START

	call	FAST_RC
	
	clrf 	LATC

	clrf 	ANSEL
	clrf	ANSELH

	clrf	WPUA
	clrf	IOCA

	bsf	ANSEL,0		;AN0 CONFIGURED AS ANALOG INPUT
	bsf	ANSEL,1		;AN1 CONFIGURED AS ANALOG INPUT
	bsf 	ANSEL,2		;AN2 CONFIGURED AS ANALOG INPUT
	bsf 	ANSELH,0	;AN8 CONFIGURED AS ANALOG INPUT
	bsf	ANSELH,1	;AN9 CONFIGURED AS ANALOG INPUT	

	movlw	b'11000000'
	movwf	TRISC		;RC0-RC5 CONFIGURED AS OUTPUT, RC6-RC7 AS INPUT
	movlw	b'10000000'
	movwf	TRISB		;RB4-RB6 CONFIGURED AS OUTPUT, RB7 AS INPUT
	clrf	TRISA		
	comf	TRISA,F		;RA0-RA7 CONFIGURED AS INPUT

;******************************************************************
;INITIALIZE ADC REGISTERS
;******************************************************************

	movlw	0X25		;ADC ON
	movwf	ADCON0		;CHANNEL9 FOR CONVERSION - AN0
	
	movlw	b'00000000'	;POSITIVE Source is Vdd
	movwf	ADCON1		;NEGATIVE Source is Vss

	movlw	b'10000111'	;CONFIGURE ADCLOCK for ( Frc ) clock
	movwf	ADCON2

	bsf	ADCON0, GO

	bcf	flags,ADCONV_DONE

	call	PWM_MODULE_ON

	clrf	summ_h
	clrf	summ_l	
	clrf	avg_h
	clrf	avg_l
	
;******************************************************************
;MAIN LOOP, THE PROGRAM WILL BE LOOPING
;******************************************************************
MAIN_LOOP

	btfsc	PIR1,ADIF				;ADC CONVERSION COMPLETE?
	call	AD_CONV_COMPLETE			;YES - CONVERSON RESULT 'F - MOTOR FREQUENCY'

	btfsc	flags,ADCONV_DONE
	call	SIGNAL_UPDATE

	bra 	MAIN_LOOP

; ---------------------------------------------------------------------------------------------



DATA_EEPROM	CODE	0xf00000

	de	AKTUALIS_DATUM
	de	AKTUALIS_VALTOZAT

	END


