Назад |
;---------------------------------------------------- LIST p=16F84 ; PIC16F84 is the target processor #include p16f84.inc ;#define PROC16C71 ; variables definition ; регистры T EQU 10H ; счетчик периода макс=200 LEN EQU 11H ; длит. активн. состояния макс=100 PP EQU 12H ; счетчик полупериода BAT EQU 13H ; признак работы от батарей FRONT EQU 14H ; признак переднего фронта синхронизации SIN_OK EQU 15H ; признак синхронизации SHORT EQU 16H ; кратковременный буфер FLAG_F EQU 17H ; флаг фронта синхронизации PWcnt EQU 18H ; счетчик длит. сетевого питания SINcnt EQU 19H ; счетчик периода сетевого питания t EQU 20H ; внутренний счетчик периода BATime EQU 21H ; time EQU 22H ; счетчик 20мс макс=5.12сек zumm EQU 23H ; признак включения зуммера ; константы period EQU .165 ; период len EQU .80 ; биты порта A OS EQU 2 ; вход ОС преобразователя LOWBAT EQU 3 ; вход LOW BATTERY ; EQU 4 ; вход ; биты порта B SINH EQU 0 ; вход синхронизации PWGOOD EQU 1 ; вход POWER_GOOD ; EQU 2 ; выход RELAY EQU 3 ; выход управление реле BASE0 EQU 4 ; выход база транзистора BASE1 EQU 5 ; выход база транзистора ; EQU 6 ; выход ZUMM EQU 7 ; выход зуммер GOTO Start ;------------------------------------------; ; MAIN ; ;------------------------------------------; ORG 200 ; Начальные установки Start: ; Начальные установки ; Initialize PORTA by BCF STATUS, RP0 CLRF PORTA BSF STATUS, RP0 MOVLW 0x1f ; Set RA0-RA4 as inputs MOVWF TRISA #ifdef PROC16C71 MOVLW 0x00 ; Set RA0-RA4 as analog MOVWF ADCON1 #endif ; Initialize PORTB by BCF STATUS, RP0 CLRF PORTB BSF STATUS, RP0 MOVLW 0x03 ; Set RB0,Rb1 as inputs, all other as output MOVWF TRISB ; TIMER INTERRUPT ENABLE BSF STATUS, RP0 MOVLW 0xA0 MOVWF INTCON ; SET_TIMER BSF STATUS, RP0 ; запрограммировать таймер ; NEW !!!! WDT movlw 0x58 movwf OPTION_REG ; источник внутренний, ; подключить делитель к WDT, ; коэффициент делителя 1 ; NEW !!! WDT BCF STATUS, RP0 BCF INTCON, T0IF ; сбросить флаг ;MOVF period ; MOVLW period MOVWF TMR0 ; PRESET REGISTERS BCF STATUS, RP0 MOVLW .199 MOVWF T MOVLW .80 MOVWF LEN BSF BAT, 0 CLRF FRONT CLRF BATime CLRF time CLRF zumm ; Самотестирование ;BCF PORTB, 3 ;CALL ZUMM ;CALL ZUMM ;CALL ZUMM ;BSF PORTB, 3 ; ОЖИДАНИЕ ПРЕРЫВАНИЯ GOTO $ ;------------------------------------------; ; Обработка прерываний ; ;------------------------------------------; ORG 4 ;__interrupt{ ;------------------------------__SET_TIMER ------------------ BCF STATUS, RP0 btfss TMR0, 0 ; коррекция goto $+1 BCF INTCON, T0IF ; сбросить флаг MOVLW period ; как константу MOVWF TMR0 ;------------------------------------------------------------- INCF T, 1 ; НАРАЩИВАНИЕ СЧЕТЧИКА ПЕРИОДА MOVF T, 0 SUBLW .199 BTFSS STATUS, C CLRF T ; СБРОС СЧЕТЧИКА ПЕРИОДА ;------------------------------------------------------------- INCF t, 1 MOVF T, 1 ; СБРОС ВНУТРЕННЕГО СЧ. ПЕРИОДА BTFSC STATUS, Z CLRF t ;------------------------------------------------------------- clrwdt ; !!!! NEW WDT !!!! ;------------------------------------------------------------- ;__if(t==0)||(t==99) { PP++ MOVF t, 0 SUBLW .0 BTFSS STATUS, Z GOTO INT1 CLRF PP ; СБРОС ПРИЗНАКА ПОЛУПЕРИОДА MOVLW len ; ПЕРЕУСТАНОВКА LEN MOVWF LEN GOTO INT2 INT1: MOVF t, 0 SUBLW .99 BTFSS STATUS, Z GOTO INT2 BSF PP, 0 ; УСТАНОВКА ПРИЗНАКА ПОЛУПЕРИОДА MOVLW len ; ПЕРЕУСТАНОВКА LEN MOVWF LEN INT2: MOVF LEN, 1 ; ДЕКРЕМЕНТ LEN BTFSS STATUS, Z DECF LEN, 1 ;__} ;******************* ПРИНЯТИЕ РЕШЕНИЙ ************************ ;-------------------------- ПЕРЕХОД НА БАТАРЕИ --------------- BTFSC PORTB, PWGOOD GOTO POWER BSF BAT, 0 CLRF PWcnt CLRF SIN_OK POWER: ;-------------------------- ПЕРЕХОД НА СЕТЬ ------------------ BTFSS PORTB, PWGOOD GOTO DESIGN BTFSS PWcnt, 7 GOTO DESIGN BTFSS SIN_OK, 0 GOTO DESIGN CLRF BAT DESIGN: ;************************************************************* ;-------------------------- ВКЛЮЧИТЬ РЕЛЕ -------------------- BTFSC BAT, 0 BCF PORTB, RELAY BTFSS BAT, 0 BSF PORTB, RELAY ;-------------------------- УПРАВЛЕНИЕ ТРАНЗИСТОРАМИ ------- ;__if(BAT==1){ BTFSS BAT, 0 GOTO INT4 ;__if(LEN!=0){ MOVF LEN, 1 BTFSC STATUS, Z GOTO INT4 ;__if(PP==0){ BTFSC PP, 0 GOTO INT3 BSF PORTB, BASE0 BCF PORTB, BASE1 GOTO INT5 INT3: BCF PORTB, BASE0 BSF PORTB, BASE1 GOTO INT5 ;__} ;__} ;__else{} INT4: BCF PORTB, BASE0 BCF PORTB, BASE1 INT5: ;__} ;------------------------- СИГНАЛ ПРИ ПРОПАДАНИИ СЕТИ -------- MOVF t, 0 BTFSS STATUS, Z GOTO Z1 INCF time, 1 INCF BATime, 1 BTFSC BAT, 0 GOTO Z2 CLRF BATime BCF zumm, 0 GOTO Z1 Z2: MOVF BATime, 0 ; if(BATime>64) BATime=64 SUBLW .255 BTFSS STATUS, Z GOTO $+5 MOVLW .254 MOVWF BATime BCF zumm, 0 GOTO $+2 BSF zumm, 0 ; ВКЛЮЧИТЬ ЗУММЕР Z1: ;------------------------- ЗУММЕР ---------------------------- BTFSS zumm, 0 GOTO NOZUMM BTFSS time, 5 GOTO NOZUMM BTFSC t, 1 BSF PORTB, 7 BTFSS t, 1 NOZUMM: BCF PORTB, 7 ;------------- ПРОВЕРКА НАЛИЧИЯ СЕТЕВОГО НАПРЯЖЕНИЯ ---------- ; if(T==0){ MOVF T, 0 BTFSS STATUS, Z GOTO NO_PW ; if(!PWGOOD) { BTFSS PORTB, PWGOOD CLRF PWcnt ;} INCF PWcnt, 1 ; if(PWcnt>128) PWcnt=128 { MOVF PWcnt, 0 SUBLW .128 BTFSC STATUS, C GOTO $+3 MOVLW .128 MOVWF PWcnt ;} ; } NO_PW: ;-------------------------- СИНХРОНИЗАЦИЯ ПО ФАЗЕ ---------- ; if(СЕТЕВОЕ НАПРЯЖЕНИЕ){ BTFSS PWcnt, 7 GOTO NO_SIN ; } INCF SINcnt, 1 ;_if(длина имп. > 0.5 мс){ BTFSS PORTB, SINH CLRF FRONT INCF FRONT, 1 MOVF FRONT, 0 SUBLW .5 BTFSS STATUS, Z GOTO INT6 ;_фронт обнаружен ; проверка периода сетевого напряжения MOVF SINcnt, 0 MOVWF SHORT CLRF SINcnt SUBLW .195 ; >195 BTFSC STATUS, C GOTO NO_SIN MOVF SHORT, 0 SUBLW .205 ; >205 BTFSS STATUS, C GOTO NO_SIN ; СОБСТВЕННО СИНХРОНИЗАЦИЯ MOVF T, 0 SUBLW .5 BTFSC STATUS, C GOTO SIN1 MOVF T, 0 SUBLW .194 BTFSS STATUS, C GOTO SIN1 MOVF T, 0 ADDLW 3 MOVWF T GOTO NO_SIN SIN1: MOVLW .199 MOVWF T BSF SIN_OK, 0 GOTO $+2 NO_SIN: CLRF SIN_OK ;__} INT6: RETFIE ;__} END Примечание:
|