;LZ4GV	08-2005
;Ver. 8

	list		p=12F683		; list directive to define processor
	#include	<p12F683.inc>	; processor specific variable definitions

;Program Configuration Register 
	__CONFIG	_INTRC_OSC_NOCLKOUT & _CP_OFF & _CPD_OFF & _BOD_ON  & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _IESO_OFF & _FCMEN_OFF
;		        _INTRC_OSC_CLKOUT     _CP_ON    _CPD_ON    _BOD_OFF   _MCLRE_ON    _PWRTE_OFF  _WDT_ON    _IESO_ON    _FCMEN_ON
;		        _LP_OSC                                    _BOD_NSLEEP
;		        _XT_OSC                                    _BOD_SBODEN
;                       _HS_OSC
;                       _EC_OSC
;                       _EXTRC_OSC_NOCLKOUT
;                       _EXTRC_OSC_CLKOUT

OSCTUNE_MNL	EQU	.0	;Central frequency	min .16 - .31  0  .1 - .15 max

#define	GPIO0		GPIO,0
#define	GPIO1		GPIO,1
#define	GPIO2		GPIO,2
#define	GPIO3		GPIO,3
#define	GPIO4		GPIO,4
#define	GPIO5		GPIO,5
#define	GPIO5IO		TRISIO,5

				;0x20 to 0x6F	Bank 0
#define	STATBIT		0x20,0

FSRMEM		EQU	0x70	;
PCLMEM		EQU	0x71	;
ACQT		EQU	0x72	;
TMR0MEM		EQU	0x73	;
TMR1LMEM	EQU	0x74	;
TMR1HMEM	EQU	0x75	;

				;0x70 to 0x7F	Bank 0,1
INTCONMEM	EQU	0x7A	;Bank 0,1
REEADR		EQU	0x7B	;Bank 0,1
REEDATA		EQU	0x7C	;Bank 0,1
W_TEMP		EQU	0x7D	;Bank 0,1
STATUS_TEMP	EQU	0x7E	;Bank 0,1
PCLATH_TEMP	EQU	0x7F	;Bank 0,1

OPTIONMEM	EQU	0xA0	;Bank 1
;		EQU	0xBF	;End Bank1

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	.4		; x 1/(Fosc/4/128) =
	MOVWF	TMR0MEM		;
	COMF	TMR0MEM,W	;
	MOVWF	TMR0		;
	BCF	INTCON,T0IF	;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,DC1B1	;Bit 1
	BCF	CCP1CON,DC1B0	;Bit 0


;	CALL	READC_GP4	;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
;**********  Край  *************


;**********************************************************************
WRITE				;In:F(REEADR,REEDATA)
	BSF     STATUS,RP0	;Bank 1
	MOVF	REEADR,W
	MOVWF	EEADR
	MOVF	REEDATA,W
	MOVWF	EEDAT

	BCF	INTCONMEM,GIE	;
	BTFSC	INTCON,GIE	;Запазва състоянието.
	BSF	INTCONMEM,GIE	;
	BCF	INTCON,GIE	;Забранява всички прекъсвания.

	BSF     EECON1,WREN	;enable write
	movlw   0x55		;
	movwf   EECON2		;
	movlw   0xAA		;
	movwf   EECON2		;
	BSF     EECON1,WR	;initiate write	
	BTFSC   EECON1,WR       ;write complete?
	GOTO    $-1		;
	BCF     EECON1,WREN	;disable write

	BTFSC	INTCONMEM,GIE	;Възтановява прекъсванията ако са позволени.
	BSF	INTCON,GIE	;

	BCF     STATUS,RP0	;Bank 0
	RETURN
;

READE				;In:F(REEADR)	Out:F(REEDATA),W
	BSF     STATUS,RP0	;Bank 1
	MOVF	REEADR,W
	MOVWF	EEADR
	
	BSF     EECON1,RD	;do a read
	BTFSC   EECON1,RD	;rd done?
	GOTO    $-1		;no then loop

	MOVF	EEDAT,W
	MOVWF	REEDATA
	BCF     STATUS,RP0	;Bank 0
	RETURN
;
				;Analog-to-Digital Converter
READC_GP0			;Out: F(ADRESH,ADRESL)
	BCF	ADCON0,ADFM	;0- X X X X X X X X / x x 0 0 0 0 0 0
	BCF	ADCON0,VCFG	;0- Vdd    1- Vref pin
	BCF	ADCON0,CHS1	;Select A/D Input Chennel: GP0
	BCF	ADCON0,CHS0	;
	GOTO	READC		;

READC_GP1			;Out: F(ADRESH,ADRESL)
	BCF	ADCON0,ADFM	;0- X X X X X X X X / x x 0 0 0 0 0 0
	BCF	ADCON0,VCFG	;0- Vdd    (1- Vref pin)
	BCF	ADCON0,CHS1	;Select A/D Input Chennel: GP1
	BSF	ADCON0,CHS0	;
	GOTO	READC		;

READC_GP2			;Out: F(ADRESH,ADRESL)
	BCF	ADCON0,ADFM	;0- X X X X X X X X / x x 0 0 0 0 0 0
	BCF	ADCON0,VCFG	;0- Vdd    1- Vref pin
	BSF	ADCON0,CHS1	;Select A/D Input Chennel: GP2
	BCF	ADCON0,CHS0	;
	GOTO	READC		;

READC_GP4			;Out: F(ADRESH,ADRESL)
	BCF	ADCON0,ADFM	;0- X X X X X X X X / x x 0 0 0 0 0 0
	BCF	ADCON0,VCFG	;0- Vdd    1- Vref pin
	BSF	ADCON0,CHS1	;Select A/D Input Chennel: GP4
	BSF	ADCON0,CHS0	;
	GOTO	READC		;

READC
	BSF	ADCON0,ADON	;1 = A/D converter module is operating
	MOVLW	.9		;
	MOVWF	ACQT		;Acquisition Time 20uS. Fosc=4MHz
	DECFSZ	ACQT,F		;-
	GOTO	$-1		;-^

	BSF	ADCON0,GO	;Start Convertion
	BTFSC	ADCON0,GO	;-
	GOTO	$-1		;-^
	BCF	ADCON0,ADON	;0 = A/D converter is shut_off
	RETURN			;
;

SET_ADC
	BSF	STATUS,RP0	;Bank1
				;I/O Configuration: 1 - Analog Input	0 - Digital I/O
	BCF	ANSEL,ANS0	;GP0
	BCF	ANSEL,ANS1	;GP1/Vref
	BCF	ANSEL,ANS2	;GP2
	BCF	ANSEL,ANS3	;GP4

	BSF	ANSEL,ADCS2	;Select A/D Conversion Clock 16xTosc = 4uS at 4MHz!!!
	BCF	ANSEL,ADCS1	;-//-
	BSF	ANSEL,ADCS0	;-//-

	BCF	STATUS,RP0	;Bank0
	RETURN
;

SET_OSC				;Oscillator configuration.
	BSF	STATUS,RP0	;Bank
	MOVWF	OSCCON		;Internal Oscillator Frequency Select bits
				;8MHz	4MHz	2MHz	1MHz	500KHz	250KHz	125KHz	31,25KHz
	;BSF	OSCCON,IRCF2	;1	1	1	1	0	0	0	0
	;BSF	OSCCON,IRCF1	;1	1	0	0	1	1	0	0
	;BCF	OSCCON,IRCF0	;1	0	1	0	1	0	1	0

	BCF	OSCCON,SCS	;0- Oscillator Mode Defined By h'2007'
				;1- Internal oscillator is used for system clock

	MOVLW	OSCTUNE_MNL	;Central frequency
	MOVWF	OSCTUNE		;
	BCF	STATUS,RP0	;Bank0
	RETURN			;
;

SET_TMR0
	BSF	STATUS,RP0	;Bank1
	BCF	OPTION_REG,T0CS	;Clock Source: 0- Internal	1- GP2/T0CKI pin
	BTFSC	OPTION_REG,T0CS	;
	BCF	OPTION_REG,T0SE	;0- Increment on low-to-high transition on GP2/T0CKI pin	1- low-to-high

	BCF	OPTION_REG,PSA	;0- Prescaler is assigned to the Timer0 module	1- Prescaler is assigned to the WDT
	BTFSC	OPTION_REG,PSA	;
	GOTO	SET_TMR0_1	;-->

	MOVF	OPTION_REG,W	;
	ANDLW	B'11111000'	;Нулира само PS2 PS1 PS0
	;IORLW	B'00000000'	;Fosc/4/2	4MHz =>   2uS
	;IORLW	B'00000001'	;Fosc/4/4
	;IORLW	B'00000010'	;Fosc/4/8
	;IORLW	B'00000011'	;Fosc/4/16
	;IORLW	B'00000100'	;Fosc/4/32
	;IORLW	B'00000101'	;Fosc/4/64
	;IORLW	B'00000110'	;Fosc/4/128
	IORLW	B'00000111'	;Fosc/4/256	4MHz => 256uS
	MOVWF	OPTION_REG	;

SET_TMR0_1
	BCF	STATUS,RP0		;Bank0
	RETURN
;

SET_WPU
	BSF	STATUS,RP0	;Bank1
	BCF	OPTION_REG,NOT_GPPU ;0- Pull-ups Enable    1- Pull-ups Disabled

				;0- Pull-up disabled	1- Pull-up enabled
	BSF	WPU,0		;GP0
	BSF	WPU,1		;GP1
	BSF	WPU,2		;GP2
	BSF	WPU,4		;GP4
	BSF	WPU,5		;GP5

	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	;LP Oscillator is shut off.
	BCF	T1CON,NOT_T1SYNC ;Asinchronous Operration
	BCF	T1CON,TMR1CS	;Internal Clock Fosc/4	4MHz = 8uS

	BCF	T1CON,T1GE	;0- Timer1 is on    1- Timer1 is on if Timer1 gate is not active
	BCF	T1CON,T1GINV	;0- Timer1 gate is not inverted    1- Timer1 gate is inverted

	BSF	T1CON,TMR1ON	;Timer1 On bit.
	RETURN
;

SET_PWM				;Reset Pulse Width Modulation
	BSF	STATUS,RP0	;Bank1
	MOVLW	0xFF		;
	MOVWF	PR2		;Period register.

	BCF	TRISIO,2	;GP2 Output!
	BCF	STATUS,RP0	;Bank0

	CLRF	CCPR1L		;Bit 9 - 2
	BCF	CCP1CON,DC1B1	;Bit 1
	BCF	CCP1CON,DC1B0	;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 Active High.
	MOVWF	CCP1CON		;
	RETURN
;

SET_COMPM
	MOVLW	B'00000111'	;I/O Operating Modes.
	MOVWF	CMCON0		;
	BCF	CMCON0,CIS	;Input Switch Bit.
	CLRF	CMCON1

	;CALL	SET_CVREF	;Enable Comparator Voltage Reference Module
	RETURN			;

SET_CVREF
	BSF	STATUS,RP0	;Bank1
	MOVLW	B'00000000'
	MOVWF	VRCON		;
	BSF	VRCON,VRR	;Range
	BSF	VRCON,VREN	;Module Enable Bit.
	BCF	STATUS,RP0	;Bank0
	RETURN
;

SET_INT
	CLRF	INTCON		;Забрана за прекъване.
	;BCF	OPTION_REG,INTEDG ;'1' -Rising RB0 Interrupt
	RETURN
;
;**********************************************************************

;*******Първоначална настройка на микроконтролера**********************
START
	BCF	STATUS,RP0	;Bank0
	CLRF	GPIO		;Нулира порта.

	CALL	SET_INT		;

	;MOVLW	B'01110000'	;Internal oscillator	8MHz
	MOVLW	B'01100000'	;Internal oscillator	4MHz
	;MOVLW	B'01010000'	;Internal oscillator	2MHz
	;MOVLW	B'01000000'	;Internal oscillator	1MHz
	;MOVLW	B'00110000'	;Internal oscillator	500KHz
	;MOVLW	B'00100000'	;Internal oscillator	250MHz
	;MOVLW	B'00010000'	;Internal oscillator	125MHz
	;MOVLW	B'00000000'	;Internal oscillator	31,25KHz
	CALL	SET_OSC		;Oscillator configuration!

	CALL	SET_ADC		;ADC configuration !!!

	;CALL	SET_WPU		;Enable Pull-up

	CALL	SET_TMR0

	CALL	SET_TMR1

	CALL	SET_COMPM	;Comparator Module !!!

	BSF	STATUS,RP0	;Select Bank1.
	MOVLW	B'00111111'	;
	MOVWF	TRISIO		;I/O Port
	BCF	STATUS,RP0	;Select Bank0.

	;CALL	SET_PWM		;Enable PWM & Reset - RB3

	GOTO	BEGIN

END