	 list      p=PIC16F628A
     #include  P16F628A.inc ;	; 4.000 MHz
	__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON& _XT_OSC  &_LVP_OFF&_MCLRE_OFF
	errorlevel -302
#define test_	
#define	SI	flags,0	;указател дали сме детектирали синхро импулс

	CBLOCK 0x20
	flags
	cnt		;брояч 
	buff_in:14	;буфер за стойностите от захвата
	tmr1_buf:2	;временна променлива за стойността на TMR1
	tmp_var
	out
	endc

	org 0x0000
start 
	nop 
	goto main
	nop

main
	bcf		STATUS, RP1
	bsf	  	 STATUS, RP0
	movlw		b'11111110'	;RA:0 e изход за осмата команда от RB:3
	movwf		TRISA
	movlw		b'00001000'
	movwf		TRISB		;всички изходи RB:3 вход заради CCP
	movlw		b'10100111'	; Предделитель 1:256, 
			;TMR0 от външен източник
	movwf		OPTION_REG
	bcf		STATUS, RP0
	movlw   	b'00000111'
    	movwf   	CMCON        ; компараторите - изключени
	movlw 		b'00000100'		;захващане - всеки падащ фронт
	movwf		CCP1CON
	movlw 		b'00000001'		;без прескалер, internal clock = 1MHz
	movwf		T1CON	

	
	bcf		PORTA,0
	clrf		PORTB

	bcf		SI
main_loop
	clrf		cnt	;започваме от нула
	call		get_pulse	;получаване на импулс
	movlw		0x0c
	subwf		buff_in,w	;дали в началото на буфера имаме синхро импулс
	btfss		STATUS,Z
	goto		main_loop-3	;не - цикъл с нулиране на детектиран синхро импулс
	btfsc		SI		;имаме ли сме получен синхро импулс
	call		buff_to_B	; да - обработваме получената информация
	bsf		SI		;вдигаме флага за получен синхро импулс

get_next
	incf		cnt,f	;продължаваме нататък
	call		get_pulse
	movlw		0x09
	subwf		cnt,w		;получили ли сме 10	импулса
	btfss		STATUS,Z	
	goto		get_next		;не - получаваме следващ импулс
	goto		main_loop		; да - ще чакаме синхро импулс


get_pulse
#ifdef	test
 bsf	PIR1,CCP1IF
#endif
	btfss		PIR1,CCP1IF
	goto		get_pulse
	clrf		TMR1L		;нулиране таймера за да не смятаме като изоглавени
	clrf		TMR1H		; при захват в CCPR1H:L имаме продължителността на импулса
	bcf		PIR1,CCP1IF
	movlw		0x01
	xorwf		CCP1CON,f	;промяна на захвата - падащ/възходящ фронт
			; в CCPR1H:CCPR1L	е стойността на захвата

	bcf		STATUS,C
	rlf		cnt,w
	addlw		buff_in
	movwf		FSR
	movf		CCPR1H,w
	movwf		INDF		;запазваме в buff_in [cnt*2]
	incf		FSR,f
	movf		CCPR1L,w
	movwf		INDF		;запазваме в buff_in [cnt*2]
	return


;обработва получената информация и я предава на изходите
buff_to_B
	movlw		0x08
	movwf		tmp_var
	movlw		0x04
	addlw		buff_in
	movwf		FSR		;от къде ще четем buff_in[4] - пропускаме синхро импулса и синхро паузата

buff_to_B_loop
	bcf		STATUS,C
	btfsc		INDF,2
	bsf		STATUS,C
	rrf		out,f		;в зависимост от получената информация 1 или 0
			; ако сме получили 0х02ХХ се приема за 0 0х04ХХ се приема за 1
			; в outсе съдържа входящата информация
	incf		FSR,f
	incf		FSR,f
	decfsz		tmp_var,f
	goto		buff_to_B_loop

	comf		out,f		;налага се едно инвертиране на информацията

	btfss		out,3		;заради заетостта на PORTB,3 информацията за него
	bcf		PORTA,0	;се насочва към PORTA,0
	btfsc		out,3
	bsf		PORTA,0

	movf		out,w
	movwf		PORTB		;прехвърляне на получената информация към PORTB
	return

;EEPROM данни
	ORG 0X2100


	end