;*********************************************************************************************** ; Provod.asm Программа искателя скрытой проводки ;*********************************************************************************************** ; GP0 - индикация включения и работы прибора ; GP1 - кнопка управления питанием прибора ; GP2 - вход частоты 50 Гц ; GP4, 5 - zummer ;*********************************************************************************************** ; И.Н. Шевченко (RW1ZK) ; г.Заозерск Мурманской обл. ;*********************************************************************************************** list p=12F629 ; #include ; errorlevel -302 ; __CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT ;*********************************************************************************************** ; Блок переменных, используемых в программе ;*********************************************************************************************** CBLOCK 20H ; Count ; Temp ; Temp_1 ; Temp_2 ; Temp_3 ; ENDC ; ;*********************************************************************************************** LED EQU 0 ; GP0 - индикация BUT EQU 1 ; GP1 - кнопка управления ;*********************************************************************************************** ORG 0x0000 ; Начальный адрес ;*********************************************************************************************** call 3FFH ; Считать калибровочную константу bsf STATUS, RP0 ; 1-й банк movwf OSCCAL ; Загрузить в OSCCAL bcf STATUS, RP0 ; 0-й банк clrf GPIO ; Очистить вых. защёлки GPIO movlw .7 ; Компаратор movwf CMCON ; выключен bsf STATUS, RP0 ; 1-й банк clrf VRCON ; Отключить ИОН movlw b'00001110' ; GP1-3 на вход movwf TRISIO ; остальные на выход movlw b'00101000' ; GP2 - внешн. сигнал movwf OPTION_REG ; TMR0 1/2, преддел. перед WDT movlw b'00000110' ; Включить подтягивающие movwf WPU ; резисторы на GP1, GP2 movlw b'00000010' ; Разрешение прерываний movwf IOCB ; по GP1 bcf STATUS, RP0 ; 0-й банк ;*********************************************************************************************** ; П/п сообщения о включении рабочего режима ; (выдача 3-х световых и звуковых сигнала) и ; перехода в режим экономии питания (sleep) до момента нажатия кнопки SB1 ;*********************************************************************************************** movlw .3 ; Счётчик количества movwf Count ; периодов входного сигнала. ST_NEW bcf GPIO, LED ; call DELAY ; bsf GPIO, LED ; 3 раза movlw .160 ; мигаем movwf Temp ; и ST_ZUM bsf GPIO, 4 ; пищим. bcf GPIO, 5 ; call DELAY_2 ; decfsz Temp, f ; goto ZUM_N ; goto NEXT ; ZUM_N bcf GPIO, 4 ; bsf GPIO, 5 ; call DELAY_2 ; goto ST_ZUM ; NEXT decfsz Count, f ; goto ST_NEW ; goto SLEEP_ ; «Спать» до момента нажатия кнопки SB1 ;*********************************************************************************************** ; Проверка наличия частоты 50 Гц ;*********************************************************************************************** NEW bsf GPIO, LED ; Вкл. светодиод clrf TMR0 ; Очистить TMR0 movlw .219 ; Пауза 100 мс movwf Temp_1 ; movlw .130 ; При частоте 50 Гц movwf Temp_2 ; за это время movlw .1 ; TMR0 насчитает movwf Temp_3 ; 5 импульсов call DELAY_1 ; movf TMR0, w ; xorlw .5 ; Получили 5 импульсов? btfss STATUS, Z ; Нет. Выход из goto END_? ; рабочего режима? ;*********************************************************************************************** ; Звуковая и световая индикация наличия частоты 50 гц ;*********************************************************************************************** bcf GPIO, LED ; Выкл. светодиод movlw .160 ; Да, movwf Temp ; это ZUM_1 bsf GPIO, 4 ; соответствует bcf GPIO, 5 ; частоте call DELAY_2 ; 50 Гц decfsz Temp, f ; goto ZUM_2 ; goto END_? ; ZUM_2 bcf GPIO, 4 ; bsf GPIO, 5 ; мигаем call DELAY_2 ; и goto ZUM_1 ; пищим.. ;*********************************************************************************************** ; Включение/выключение (режим энергосбережения – sleep) ;*********************************************************************************************** END_? btfsc GPIO, BUT ; Кнопка SB1 нажата? goto NEW ; Нет, работаем... call WAIT ; Кнопка SB1 отпущена? SLEEP_ clrf GPIO ; Рубим периферию bsf STATUS, RP0 ; 1-й банк bcf TRISIO, 2 ; GP2 на выход bcf STATUS, RP0 ; 0-й банк bsf INTCON, GPIE ; Разрешение прерываний по входу GP bcf INTCON, GPIF ; Сброс флага прерывания и sleep ; спать! bcf INTCON, GPIE ; Запрет прерываний по входу GP bsf STATUS, RP0 ; 1-й банк bsf TRISIO, 2 ; GP2 на вход bcf STATUS, RP0 ; 0-й банк call WAIT ; Кнопка SB1 отпущена? goto NEW ; Заново... ;*********************************************************************************************** WAIT btfss GPIO, BUT ; Кнопка SB1 отпущена? goto WAIT ; Нет, ждём call DELAY ; Пауза 300 мс return ; ;*********************************************************************************************** ; П/п задержек ;*********************************************************************************************** DELAY movlw .153 ; Пауза 300 мс movwf Temp_1 ; movlw .134 ; movwf Temp_2 ; movlw .2 ; movwf Temp_3 ; DELAY_1 decfsz Temp_1, f ; goto DELAY_1 ; decfsz Temp_2, f ; goto DELAY_1 ; decfsz Temp_3, f ; goto DELAY_1 ; return ; ;*********************************************************************************************** DELAY_2 movlw .247 ; Задержка 744 мкс для формирования movwf Temp_1 ; сигнала звукоизлучателя DELAY_3 decfsz Temp_1, f ; goto DELAY_3 ; return ; ;*********************************************************************************************** END ;