; брелок-нетеряйка
; GP0 - питание усилителя (в дежурном режиме - "1", в режиме ответа - "0") 
; GP2 - питание усилителя (в дежурном режиме - "0", в режиме ответа - частота) 
; GP1 - вход сигнала


	list p=12f629

            #include <P12F629.INC>

            __CONFIG  00184H       ; Бит защиты выключен
                                   ; Сброс по снижению напр.питания ЗАПРЕЩЕН
                                   ; Используется внутренний сброс, вывод
                                   ; RA5/MCLR работает как вход
                                   ; Таймер включения питания РАБОТАЕТ
                                   ; WDT (СОБАКА) выключен 
                                   ; Работает внутренний генератор
 
;---------------------------------------------------------------
;----------------------------------------------------------
; регистры общего назначения
 cblock	20h
 
 TEMP
 TEMP1
 TEMP2
 TEMP3
  
 endc

;начало исполняемого кода
	;ORG     00h
  	GOTO    START


;вектор прерывания
	ORG		04h
	GOTO	PER

; начало программы
  	;ORG     010h



INIT	
	
	BSF 	STATUS, RP0	 	; банк 1

	CALL	3FFh			; калибруем внутр. генератор
	MOVFW	OSCCAL	


	MOVLW	B'10000000'		; настройка OPTION
	MOVWF	OPTION_REG		; подтягивающие резисторы отключены
	MOVLW	B'10001000'
	MOVWF	INTCON			; разрешаем глобальные прерывания и прерывания от портов

	MOVLW	B'00000000'
	MOVWF	PIE1			; запрещаем прер. по периполн. таймера TMR1


	MOVLW   B'00000010'		; порты 1 - на вход, остальные - на выход
 	MOVWF   TRISIO

	CLRF	VRCON 			; ВЫКЛЮЧИТЬ И.О.Н.

	
	BCF 	STATUS, RP0	 	; банк 0
	MOVLW	B'00000000'		; 
	MOVWF	T1CON 			; выкл. ТМR1


	MOVLW   B'00000111'
	MOVWF	CMCON			; выключить компараторы
	CLRF	PIR1 			; сброс всех прерываний

	clrf    GPIO       		; Сбросим порт
       
	
	return




; ВХОД В ПРЕРЫВАНИЕ ОТ ПОРТОВ
PER

	MOVF	GPIO,0
	BCF		INTCON,0		; сбросим флаг прерывания от портов

	RETFIE			





START	

	call 	INIT



START_

	

	BSF		GPIO,0			; УСТ. В "1"
	BCF		GPIO,2			; УСТ. В "0"

	BSF 	STATUS, RP0	 	; банк 1
	bsf		IOCB,1			; вкл. прервывание от GP1
	BCF 	STATUS, RP0	 	; банк 0

;******************ОЖИДАНИЕ******************

	SLEEP
	NOP


;********************ОТВЕТ*******************
    
	BSF 	STATUS, RP0	 	; банк 1
	bcf		IOCB,1			; выкл. прервывание от GP1
	BCF 	STATUS, RP0	 	; банк 0

	
	BCF		GPIO,0			; УСТ. В "0"


;**********ЦИКЛ ПОВТОРА - 10 РАЗ***********

	MOVLW	.10
	MOVWF	TEMP3

;**********СИГНАЛ 5000 Гц (200 mS)***********


	MOVLW	.9
	MOVWF	TEMP1

	MOVLW	.10
	MOVWF	TEMP2




	MOVLW	.30
	MOVWF	TEMP

	DECFSZ	TEMP
	GOTO	$-1

	BTFSS	GPIO,2    		; ЕСЛИ ПОРТ В "0"
	GOTO	$+2

	GOTO	$+3	

	BSF		GPIO,2			; УСТ. В "1"

	GOTO	$+2

	BCF		GPIO,2			; УСТ. В "0"	




	DECFSZ	TEMP2
	GOTO	$-.11
	DECFSZ	TEMP1
	GOTO	$-.13

;******************************************
;*************ПАУЗА (100 mS)***************

	MOVLW	.200
	MOVWF	TEMP1

	MOVLW	.170
	MOVWF	TEMP2

	DECFSZ	TEMP2
	GOTO	$-1

	DECFSZ	TEMP1
	GOTO	$-5

;******************************************

	DECFSZ	TEMP3
	GOTO	$-.27

	NOP


	GOTO	START_




	END



