;---------------------------------------------------- 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
Примечание:
|