;LZ4GV	01-2004

	list		p=16F819	; list directive to define processor
	#include	<p16F819.inc>	; processor specific variable definitions

__CONFIG	_INTRC_IO	& _PWRTE_ON & _BODEN_ON & _CCP1_RB3 & _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF & _WDT_OFF & _MCLR_OFF
;		_EXTRC_CLKOUT	  _PWRTE_OFF  _BODEN_OFF  _CCP1_RB2   _CP_ALL   _DEBUG_ON    _WRT_ENABLE_512   _CPD_ON    _LVP_ON    _WDT_ON    _MCLR_ON
;		_EXTRC_IO								     _WRT_ENABLE_1024
;		_INTRC_CLKOUT								     _WRT_ENABLE_1536
;		_EXTCLK
;		_HS_OSC
;		_XT_OSC
;		_LP_OSC

OSCTUNE_MNL	EQU	.0	;Central frequency	min .32 - .63  0  .1 - .31 max


#define	RA0		PORTA,0
#define	RA1		PORTA,1
#define	RA2		PORTA,2
#define	RA3		PORTA,3
#define	RA4		PORTA,4
#define	RA5		PORTA,5
#define	RA6		PORTA,6
#define	RA7		PORTA,7

#define	RB0		PORTB,0
#define	RB1		PORTB,1
#define	RB2		PORTB,2
#define	RB3		PORTB,3
#define	RB4		PORTB,4
#define	RB5		PORTB,5
#define	RB6		PORTB,6
#define	RB7		PORTB,7

#define	STATBIT		0x20,0

PCLMEM		EQU	0x74	;
OPTIONMEM	EQU	0x75	;
FSRMEM		EQU	0x76	;
ACQT		EQU	0x77	;
TMR0MEM		EQU	0x78	;
TMR1LMEM	EQU	0x79	;
TMR1HMEM	EQU	0x7A	;
INTCONMEM	EQU	0x7B	;0x70 to 0x7F	Bank 0,1,2,3
REEADR		EQU	0x7C	;-//-
REEDATA		EQU	0x7D	;-//-
W_TEMP		EQU	0x7E	;-//-
STATUS_TEMP	EQU	0x7F	;-//-


	ORG	0x0000
	GOTO	START
	ORG	0x0004
	GOTO	START

BEGIN

;**********  Начало  ***********
MAIN
	MOVLW	.4		;
	MOVWF	TMR0MEM		;
	COMF	TMR0MEM,W	;
	MOVWF	TMR0		;
	BCF	INTCON,TMR0IF	;Overflow TMR0


	CLRF	TMR1L		;
	MOVLW	.250		;
	MOVWF	TMR1HMEM	;
	COMF	TMR1HMEM,W	;
	MOVWF	TMR1H		;
	BCF	PIR1,TMR1IF	;Overflow TMR1


	MOVLW	.0		;Pulse Width Modulation
	MOVWF	CCPR1L		;Bit 9 - 2
	BCF	CCP1CON,CCP1X	;Bit 1
	BCF	CCP1CON,CCP1Y	;Bit 0


	CALL	READC_RA0	;Out:F(ADRESH)
	MOVLW	.100		;
	SUBWF	ADRESH,W	;ADRESH > W	C=1
	BTFSC	STATUS,C	;ADRESH = W	C=1
	GOTO			;ADRESH < W	C=0
	GOTO			;

	GOTO	MAIN
;**********  Край  *************

;**********************************************************************
READC_RA0			;Analog-to-Digital Converter	Out: F(ADRESH)
	BCF	ADCON0,CHS2	;Select A/D Input Chennel: RA0
	BCF	ADCON0,CHS1	;
	BCF	ADCON0,CHS0	;
	GOTO	READC		;

READC_RA1			;Out: F(ADRESH)
	BCF	ADCON0,CHS2	;Select A/D Input Chennel: RA1
	BCF	ADCON0,CHS1	;
	BSF	ADCON0,CHS0	;
	GOTO	READC		;

READC_RA2			;Out: F(ADRESH)
	BCF	ADCON0,CHS2	;Select A/D Input Chennel: RA2
	BSF	ADCON0,CHS1	;
	BCF	ADCON0,CHS0	;
	GOTO	READC		;

READC_RA3			;Out: F(ADRESH)
	BCF	ADCON0,CHS2	;Select A/D Input Chennel: RA3
	BSF	ADCON0,CHS1	;
	BSF	ADCON0,CHS0	;
	GOTO	READC		;

READC_RA4			;Out: F(ADRESH)
	BSF	ADCON0,CHS2	;Select A/D Input Chennel: RA4
	BCF	ADCON0,CHS1	;
	BCF	ADCON0,CHS0	;
	GOTO	READC		;

READC
	BSF	ADCON0,ADON	;1 = A/D converter module is operating
	MOVLW	.18		;Fosc=4MHz
	MOVWF	ACQT		;Acquisition Time 40uS.
READC_AC			;
	DECFSZ	ACQT,F		;
	GOTO	READC_AC	;-^

	BSF	ADCON0,GO	;Start Convertion
READC_CH			;
	BTFSC	ADCON0,GO	;
	GOTO	READC_CH	;-^
	BCF	ADCON0,ADON	;0 = A/D converter is shut_off
	RETURN			;
;

WRITE				;In:F(REEADR,REEDATA)
	BSF	STATUS,RP1	;
	BCF	STATUS,RP0	;Bank2
	MOVF	REEADR,W	;
	MOVWF	EEADR

	MOVF	REEDATA,W
	MOVWF	EEDATA

	BSF	STATUS,RP1	;
	BSF	STATUS,RP0	;Bank3

	BCF	EECON1,EEPGD	;0 - Accesses data memory EEPROM

	BCF	INTCONMEM,GIE	;
	BTFSC	INTCON,GIE	;
	BSF	INTCONMEM,GIE	;
	BCF	INTCON,GIE	;

	BSF	EECON1,WREN	;1 - Allows write cycles
	MOVLW	0x55		;
	MOVWF	EECON2		;
	MOVLW	0xAA		;
	MOVWF	EECON2		;
	BSF	EECON1,WR	;1 - initiates a write cycles
WRITE_CH			;
	BTFSC	EECON1,WR       ;0 - Write cycles to the EEPROM is complete
	GOTO	WRITE_CH	;-^
	
	BTFSC	INTCONMEM,GIE	;
	BSF	INTCON,GIE	;

	BCF	EECON1,WREN	;disable write
	BCF	STATUS,RP1	;
	BCF	STATUS,RP0	;Bank0
	RETURN
;

READE				;In:F(REEADR)
	BSF	STATUS,RP1	;
	BCF	STATUS,RP0	;Bank2
	MOVF	REEADR,W	;Out:F(REEDATA),W
	MOVWF	EEADR

	BSF	STATUS,RP1	;
	BSF	STATUS,RP0	;Bank3

	BCF	EECON1,EEPGD	;0 - Accesses data memory EEPROM

	BSF	EECON1,RD	;1 - initiates an EEPOM read
READE_CH
	BTFSC	EECON1,RD	;rd done?
	GOTO	READE_CH	;no then loop

	BSF	STATUS,RP1	;
	BCF	STATUS,RP0	;Bank2
	MOVF	EEDATA,W
	MOVWF	REEDATA

	BCF	STATUS,RP1	;
	BCF	STATUS,RP0	;Bank0

	RETURN			;
;

SET_OSC				;Oscillator configuration.
	BSF	STATUS,RP0	;Bank1
	MOVWF	OSCCON		;
	MOVLW	OSCTUNE_MNL	;Central frequency
	MOVWF	OSCTUNE		;
	BCF	STATUS,RP0	;Bank0
	RETURN			;
;

SET_ADC
	BSF	STATUS,RP0	;Bank1
	MOVWF	ADCON1		;
	BCF	ADCON1,ADFM	;X X X X X X X X / x x
	BSF	ADCON1,ADCS2	;Select A/D Conversion Clock 16xTosc = 4uS at 4MHz!!!
	BCF	STATUS,RP0	;Bank0
	BCF	ADCON0,ADCS1	;Select A/D Conversion Clock
	BSF	ADCON0,ADCS0	;-//-
	RETURN
;

SET_TMR0
	BSF	STATUS,RP0	;Bank1
	MOVWF	OPTION_REG	;
	BSF	OPTION_REG,NOT_RBPU ;'1' - Pull-ups Disabled
	BSF	OPTION_REG,INTEDG ;'1' -Rising RB0 Interrupt
	BCF	STATUS,RP0	;Bank0
	RETURN
;

SET_TMR1			;Timer1 Module:	Max period 8uS * 65536 = 524,288mS
	BSF	T1CON,T1CKPS1	;Timer prescaler /1 - 0   /2 - 0   /4 - 1   /8 - 1
	BSF	T1CON,T1CKPS0	;Timer prescaler      0        1        0        1
	BCF	T1CON,T1OSCEN	;Oscillator is shut off.
	BCF	T1CON,NOT_T1SYNC ;Asinchronous Operration
	BCF	T1CON,TMR1CS	;Internal Clock Fosc/4	4MHz = 8uS
	BSF	T1CON,TMR1ON	;Timer1 On bit.
	RETURN
;

SET_PWM				;Reset Pulse Width Modulation
	BSF	STATUS,RP0	;Bank1
	BCF	TRISB,3		;RB3 Output!
	MOVLW	0xFF		;
	MOVWF	PR2		;Period register.
	BCF	STATUS,RP0	;Bank0

	CLRF	CCPR1L		;Bit 9 - 2
	BCF	CCP1CON,CCP1X	;Bit 1
	BCF	CCP1CON,CCP1Y	;Bit 0

	BCF	T2CON,T2CKPS1	;Timer prescaler 1 - 0   4 - 0   16 - 1
	BCF	T2CON,T2CKPS0	;Timer prescaler     0       1        X

	BSF	T2CON,TMR2ON	;Timer2 is ON.

	MOVLW	B'00001100'	;PWM mode.
	MOVWF	CCP1CON		;
	RETURN
;

;*******Първоначална настройка на микроконтролера**********************
START
	BANKSEL	PORTA
	CLRF	PORTA
	CLRF	PORTB

	CLRF	INTCON		;Забрана за прекъване.

	;MOVLW	B'01110000'	;Internal oscillator	8MHz
	MOVLW	B'01100000'	;Internal oscillator	4MHz
	;MOVLW	B'00000000'	;Internal oscillator	31,25KHz
	CALL	SET_OSC		;Oscillator configuration!

	MOVLW	B'00000110'	;All Digital I/O !!!
	;MOVLW	B'00001110'	;Analog Input RA0
	;MOVLW	B'00000101'	;Analog Input RA0,RA1,Vref+(RA3)
	;MOVLW	B'00000100'	;Analog Input RA0,RA1,RA3
	;MOVLW	B'00000000'	;Analog Input RA0,RA1,RA2,RA3,RA4
	CALL	SET_ADC		;Analog & Digital I/O configuration!

	MOVLW	B'00000111'	;Fosc/4/256	4MHz = 0,256mS
	CALL	SET_TMR0

	CALL	SET_TMR1

	CALL	SET_PWM		;Enable PWM & Reset

	BSF	STATUS,RP0	;Select Bank1.
	MOVLW	B'00000000'	;
	MOVWF	TRISA		;PortA
	MOVLW	B'11111111'	;
	MOVWF	TRISB		;PortB
	BCF	STATUS,RP0	;Select Bank0.

	GOTO	BEGIN

END