;Входы-выходы #define SYNCIN GPI0,1 #define ANAIN GPI0,0 #define OUTPUT GPI0,2 #define LEDOUT GPI0,5 list p=12c508a #include _CONFIG _CP_OFF & _WDT_ON & _IntRC_OSC & _MCLRE_OFF ;Маленькая пауза - один цмкл равен 5 мкс(+2 мкс на установку) LOPAUSE MACRO A LOCAL Label1 movlw A movwf temp label1 nop nop decfsz temp,1 goto label1 ENDM ;Переменные ALL_VAR UDATA temp RES 1 temp2 RES 1 lastgpio RES 1 ;Предыдущее состояние входов #define ALLOWCHECK mystate, 1 #define POWERON mystate, 0 mystate RES 1 ;Состояние frcnt RES 1 ;Счетчик фронтов MAIN CODE 0x00 movwf OSCCAL ;Таймер должен переполняться за время, большее 10мс ;Т.е. берем делитель, равный 64. Таймер будет переполняться 61раз/сек ;Конфигурация порта OPTION_REG movlw b'11000101' option ;Конфигурация порта ввода-вывода movlw b'00000011' tris 6 movlw b'00011100' movwf GPI0 bcf POWERON bcf ALLOWCHECK maincycle clrwdt ;Проверяем запуск от сети movf GPIo,0 movwf temp2 xorwf lastgpio,0 movwf temp movf temp2,0 movwf lastgpio btfss temp,1 goto notfront ;Да, пришел фронт сетевого напряжения. Сбрасываем таймер clrf TMR0 bcf ALLOWCHECK ;Пауза в 500мск LOPAUSE .100 ;Проверяем, надо ли включать симистор, если надо - включаем btfsc POWERON goto poweron ;Выключен - проверяем счетчик фронтов btfss lastgpio,1 goto notpoweron incf front,1 btfss front,2 goto notpoweron ;Если питание выключено - пауза в 1/3 периода LOPAUSE .250 LOPAUSE .250 LOPAUSE .250 bsf LEDOUT ;Подсвечиваем светодиод clrf front poweron bsf ALLOWCHECK movlw b'11100011' andwf GPI0,1 notpoweron ;Пауза в 500мкс LOPAUSE .200 ;Сбрасываем схему запуска movlw b'00011100' iorwf GPI0,1 ;Продолжение цикла-проверка таймера,если фронт положителен notfront btfss lastgpio,1 ;Проверка положительности фронта goto notchecktimer ;Проверка таймера ;Если нужно проверять при максимальном напряжении, то это через ;5 мс после фронта. В единицах таймера - 79 movlw .110 subwf TMR0,0 btfss STATUS,C goto notcheck ;Проверка (если проверка возможна) btfss ALLOWCHECK goto notcheck bcf ALLOWCHECK bcf LEDOUT ;Подсвечиваем светодиод btfsc ANAIN ;Здесь - проверка!!! goto offpower bsf POWERON bsf LEDOUT goto notcheck offpower bcf POWERON bcf LEDOUT clrf front notcheck notchecktimer goto maincycle END