;************************************************************ ; Программа для автоматического подьема 4-х стекол ; в автомобиле 15 июля 2001г. см. тетрадь N-3 стр 82 ; PIC16F84 используется в "XT" режиме, кварц 4 Mhz. ; Алгоритм:при появлении низкого уровня на вывод порта А4 ; включается реле 1 и ожидается приход низкого уровня ; на выводе порта А3 , проверятся несколько раз и если ; это не случайный импульс переходит к следующему стеклу ; каждое реле удерживается не более 5 сек LIST p=16F84 ; 13-4cp|off=1. 3pwrt|on=1. 2wdt|on=1. 1-0osc|xt __CONFIG b'11111111110101' ; биты конфигурации include pic_mac.inc ;************************************************************ #define pusk PortA,4 ; вход импульса на закрытие стекол #define otboy PortA,3 ; вход импульса о падении напряжения ;************************************************************ z_01 equ d'003' ; задержка 0.1 sec z_03 equ d'010' ; задержка 0.3 sec (1sec=30) z_5 equ d'150' ; задержка 5 sec lay equ d'001' ; проверка ложных импульсов ;************************************************************ control equ 10h ; кол-во имп. в яме count_z equ 11h ; счетчик младшей задержки count_n equ 12h ; счетчик накопления ;************************************************************ org 0 ;************************************************************ Start: ; Main program bsf Status,RP0 ; cтраница 1 movlw b'00011111' ; RA0..RA4 inputs movwf TrisA ; movlw b'11110000' ; RB0..RB3 outputs movwf TrisB ; RB4..RB7 inputs clrwdt ; сброс WDT таймера movlw b'00000111' ; XT -> Prescaler -> Timer0, movwf OptionR ; 1:256 bcf Status,RP0 ; cтраница 0 ;************************************************************ perex: ; oжидаем конца переходных процессов clrwdt ; сброс WDT таймера btfsc otboy ; конец импульса отбоя ? goto perex ; нет ;************************************************************ base_cuc: ; основной цикл clrf PortB ; 0 во все порты clrwdt ; сброс WDT таймера btfsc pusk ; есть импульс на закрытие ? goto base_cuc ; продолжить ожидание call delay_03 ; задержка 0.3 секунды btfsc pusk ; импульс нe случайный ? goto base_cuc ; продолжить ожидание ; ------------------------------------------------------------ mvi PortB,0x01 ; закрыть окно 1 call wait ; ожидаем имп. или 5 сек mvi PortB,0x02 ; закрыть окно 2 call wait ; ожидаем имп. или 5 сек mvi PortB,0x04 ; закрыть окно 3 call wait ; ожидаем имп. или 5 сек mvi PortB,0x08 ; закрыть окно 4 call wait ; ожидаем имп. или 5 сек goto base_cuc ; продолжить ожидание ;************************************************************ wait: ; ожидаем прихода импульса и задерка 5 сек. clrwdt ; сброс WDT таймера btfsc otboy ; конец импульса отбоя ? goto wait ; нет ;------------------------------------------------------------ clrf Timer ; сбросить таймер clrf count_z ; сброс первого счетчика clrf count_n ; сброс счетчика накопления wait_cuc: ; clrwdt ; сброс WDT таймера btfss Timer,7 ; проверка разряда 7 goto wait_cuc ; бит 7=0 -> продолжаем цикл clrf Timer ; бит 7=1 -> сбросить таймер btfss otboy ; есть импульс отбоя ? goto follow ; нет incf count_n,f ; есть отбой, делаем cpi count_n,lay ; несколько проверок jz wait_ret ; выход follow: incf count_z,f ; прибавить значения 1 cpi count_z,z_5 ; достиг ? jnz wait_cuc ; повтор, ожидание wait_ret: ; задержка 0.3 секунды ;************************************************************** ; return ;************************************************************** delay_03: ; задержка 0.3 секунды clrf Timer ; сбросить таймер clrf count_z ; сброс первого счетчика delay_03_: ; clrwdt ; сброс WDT таймера btfss Timer,7 ; проверка разряда 7 goto delay_03_ ; бит 7=0 -> продолжаем цикл clrf Timer ; бит 7=1 -> сбросить таймер incf count_z,f ; прибавить значения cpi count_z,z_03; достиг ? jnz delay_03_ ; повтор, ожидание return ;************************************************************** ; " Copyright (C) 2001 Bogdanov Andrew " ;************************************************************** end