;LZ4GV   01-2004
;Ver. 18

	list		p=12F675	; list directive to define processor
	#include	<p12F675.inc>	; processor specific variable definitions

	__CONFIG	_INTRC_OSC_NOCLKOUT & _PWRTE_ON & _CP_OFF & _CPD_OFF & _BODEN_ON & _MCLRE_OFF & _WDT_OFF

#define	_GP0		GPIO,0
#define	_GP1		GPIO,1
#define	_GP2		GPIO,2
#define	_GP3		GPIO,3
#define	_GP4		GPIO,4
#define	_GP5		GPIO,5

;		EQU	0x20


W_TEMP		EQU	0x55	;Bank 1
STATUS_TEMP	EQU	0x56
PCLATH_TEMP	EQU	0x57
OPTIONMEM	EQU	0x58	;= 0xD8
TMR0MEM		EQU	0x59
TMR1LMEM	EQU	0x5A
TMR1HMEM	EQU	0x5B
PCLMEM		EQU	0x5C
ACQT		EQU	0x5D
REEADR		EQU	0x5E
REEDATA		EQU	0x5F

TMR0IF		EQU	T0IF

	ORG	0x0000
	GOTO	START

	ORG	0x0004		;Interrupt vector location
	MOVWF   W_TEMP		;Запомня последното състояние на текущите регистри (W register).
	MOVF	STATUS,W	;Move STATUS register into W register
	MOVWF	STATUS_TEMP	;Save off contents of STATUS register
	MOVF	PCLATH,W	;Move PCLATH register into W register
	MOVWF	PCLATH_TEMP	;Save off contents of PCLATH register

	BCF	STATUS,RP0	;Bank0
	;;;
	;;;
	GOTO	END_INTERRUPT	;-->

END_INTERRUPT			;Възтановява състоянието на текущите регистри.
	MOVF    PCLATH_TEMP,W	;Retrieve copy of PCLATH register
	MOVWF	PCLATH		;Restore pre-isr PCLATH register contents
	MOVF    STATUS_TEMP,W	;Retrieve copy of STATUS register
	MOVWF	STATUS		;Restore pre-isr STATUS register contents
	SWAPF   W_TEMP,F	;Restore pre-isr W register contents
	SWAPF   W_TEMP,W	;-//-
	RETFIE			;Return From Interrupt / Enable Global Interrupts
;
BEGIN

;**********  Начало  ***********
MAIN
	MOVLW	.46		;
	SUBWF	ADRESH,W	;ADRESH > W	C=1
	BTFSC	STATUS,C	;ADRESH = W	C=1
	GOTO			;ADRESH < W	C=0
	GOTO			;

;;;
	CLRF	TMR1L		;Нулира Timer1.
	MOVWF	TMR1HMEM	;
	COMF	TMR1HMEM,W	;
	MOVWF	TMR1H		;
	BCF	PIR1,TMR1IF	;1-overflowed
;;;

	CLRF	TMR0
	BCF	INTCON,T0IF	;1-overflowed

;*******	Край	********

;**********************************************************************
WRITE				;In:F(REEADR,REEDATA)
	BSF     STATUS,RP0	;Page 1
	MOVF	REEADR,W
	MOVWF	EEADR
	MOVF	REEDATA,W
	MOVWF	EEDATA

	BCF	INTCON,GIE
	BSF     EECON1,WREN
	movlw   0x55
	movwf   EECON2
	movlw   0xAA
	movwf   EECON2
	BSF     EECON1,WR	;initiate write	
WRITE1
	BTFSC   EECON1,WR       ;write complete?
	GOTO    WRITE1
	;BSF	INTCON,GIE
	BCF     EECON1,WREN	;disable write
	BCF     STATUS,RP0	;Page 0
	RETURN
;

READE				;In:F(REEADR)	Out:F(REEDATA),W
	BSF     STATUS,RP0	;Page 1
	MOVF	REEADR,W
	MOVWF	EEADR
	
	BSF     EECON1,RD	;do a read
READE1				;
	BTFSC   EECON1,RD	;rd done?
	GOTO    READE1		;no then loop

	MOVF	EEDATA,W
	MOVWF	REEDATA
	BCF     STATUS,RP0	;Page 0
	RETURN
;

				;Analog-to-Digital Converter
READC_GP0			;Out: F(ADRESH)
	BCF	ADCON0,ADFM	;bit 9 8 7 6 5 4 3 2 x x
	BCF	ADCON0,VCFG	;Voltage Reference	0-Vdd	1-Vref pin
	BCF	ADCON0,CHS1	;Analog Channel Select bits
	BCF	ADCON0,CHS0	;
	GOTO	READC

READC_GP1			;Out: F(ADRESH)
	BCF	ADCON0,ADFM	;bit 9 8 7 6 5 4 3 2 x x
	BCF	ADCON0,VCFG	;Voltage Reference	0-Vdd	1-Vref pin
	BCF	ADCON0,CHS1	;Analog Channel Select bits
	BSF	ADCON0,CHS0	;
	GOTO	READC

READC_GP2			;Out: F(ADRESH)
	BCF	ADCON0,ADFM	;bit 9 8 7 6 5 4 3 2 x x
	BCF	ADCON0,VCFG	;Voltage Reference	0-Vdd	1-Vref pin
	BSF	ADCON0,CHS1	;Analog Channel Select bits
	BCF	ADCON0,CHS0	;
	GOTO	READC

READC_GP4			;Out: F(ADRESH)
	BCF	ADCON0,ADFM	;bit 9 8 7 6 5 4 3 2 x x
	BCF	ADCON0,VCFG	;Voltage Reference	0-Vdd	1-Vref pin
	BSF	ADCON0,CHS1	;Analog Channel Select bits: AN3
	BSF	ADCON0,CHS0	;
	GOTO	READC

READC
	BSF	ADCON0,ADON	;1 = A/D converter module is operating
	MOVLW	.18		;Acquisition Time 40uS
	MOVWF	ACQT		;Fosc=4MHz
READ_ADC_A1			;
	DECFSZ	ACQT,F		;
	GOTO	READ_ADC_A1	;-^

	BSF	ADCON0,GO	;Start convertion ADC.

READ_ADC_A2			;Conversion Time 11 x 4uS = 44uS
	BTFSC	ADCON0,GO	;
	GOTO	READ_ADC_A2	;-^
	BCF	ADCON0,ADON	;0 = A/D converter is shut_off
	RETURN
;

SET_ADC
	BSF	STATUS,RP0	;
	MOVLW	B'01010000'	;Fosc/16	4MHz = 4uS
	MOVWF	ANSEL		;Digital I/O-'0'	Analog I/O-'1'
	BCF	ANSEL,ANS3	;GP4
	BCF	ANSEL,ANS2	;GP2
	BCF	ANSEL,ANS1	;GP1/Vref
	BCF	ANSEL,ANS0	;GP0
	BCF	STATUS,RP0	;
	RETURN
;

SET_TMR0
	BSF	STATUS,RP0	;
	MOVWF	OPTION_REG	;
	BSF	OPTION_REG,NOT_GPPU	;'1' - Pull-ups Disabled
	BSF	OPTION_REG,INTEDG	;'1' -Rising RB0 Interrupt
	BCF	OPTION_REG,T0CS	;
	BCF	OPTION_REG,T0SE	;
	BCF	OPTION_REG,PSA	;
	BCF	STATUS,RP0	;
	RETURN
;

SET_TMR1			;Timer1 Module:	Max period 8uS * 65536 = 524,288mS
	BCF	T1CON,TMR1GE	;
	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
;
;*******Първоначална настройка на микроконтролера**********************
START
	BCF	STATUS,RP1	;Bank0
	BCF	STATUS,RP0	;

	CLRF	GPIO

	CLRF	INTCON		;Забрана за прекъване.

	MOVLW	B'00000111'	;Comparator OFF.
	MOVWF	CMCON

	BSF	STATUS,RP0
	CALL	A3FFh
	MOVWF	OSCCAL		;

	CLRF	WPU		;Weak Pull-up Register.
	BCF	STATUS,RP0

	CALL	SET_ADC

	MOVLW	B'00000111'	;Fosc/4/256	4MHz = 0,256mS
	CALL	SET_TMR0

	CALL	SET_TMR1

	BSF	STATUS,RP0
	MOVLW	B'11001111'
	MOVWF	TRISIO		;Port
	BCF	STATUS,RP0

	GOTO	BEGIN
;**********************************************************************

	ORG	0x03FF
A3FFh				;Oscillator calibration.
	RETLW	0x80		;x0,x4,x8,xC

	END


;**********************************************************************
	ORG	0x0300		;
SIN_TABL			;In:W	Out:W
	MOVWF	PCLMEM		;W -> memory
	BCF	PCLMEM,7	;
	MOVLW	.3		;При ORG 0x300 to 0x3FF !!!
	MOVWF	PCLATH		;
	MOVF	PCLMEM,W	;memory -> W
	ADDWF	PCL,F		;
	RETLW   .133		;*0
	;--//--