;LZ4GV	04-2004
;PIC16F628


list		p=16F628
#include	<p16F628.inc>

__CONFIG	_BODEN_ON & _CP_OFF & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT


			;PORTA
RA0	EQU	0	;RA0
RA1	EQU	1	;RA1
RA2	EQU	2	;RA2
RA3	EQU	3	;RA3
RA4	EQU	4	;RA4
RA5	EQU	5	;RA5
RA6	EQU	6	;RA6
RA7	EQU	7	;RA7

			;PORTB
RB0	EQU	0	;RB0
RB1	EQU	1	;RB1
RB2	EQU	2	;RB2
RB3	EQU	3	;RB3
RB4	EQU	4	;RB4
RB5	EQU	5	;RB5
RB6	EQU	6	;RB6
RB7	EQU	7	;RB7

	;	EQU	0x20

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,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,CCP1X	;Bit 1
	BCF	CCP1CON,CCP1Y	;Bit 0




	GOTO	MAIN
;**********  Край  *************
;

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
;

SET_PWM				;Reset Pulse Width Modulation	
	BSF	STATUS,RP0	;Select 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			;
;

SET_TMR0
	BSF	STATUS,RP0	;Select Bank1.
	MOVWF	OPTION_REG	;
	BSF	OPTION_REG,NOT_RBPU ;'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	;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
;

;********************************

START
	MOVLW	B'00000111'	;Comparator off.
	MOVWF	CMCON

	CLRF	PORTA
	CLRF	PORTB

	CLRF	INTCON		;Забрана за прекъване.

	BSF	STATUS,RP0	;Bank1

	MOVLW	B'00000000'	;
	MOVWF	TRISA		;PortA
	MOVLW	B'11111111'	;
	MOVWF	TRISB		;PortB

	BSF	PCON,OSCF	;4MHz IntRC.

	MOVLW	B'11000000'	;
	MOVWF	VRCON

	BCF	STATUS,RP0	;Bank0

	MOVLW	B'00000111'	;Fosc/4/256	4MHz = 0,256mS
	CALL	SET_TMR0

	CALL	SET_TMR1

	;CALL	SET_PWM		;Enable PWM & Reset

	GOTO	BEGIN

END
