Источник бесперебойного питания


Назад  

Вперед


;----------------------------------------------------
; UPS.ASM
; Program for Blaster Control Board (INTROMARIN-C).
;----------------------------------------------------
 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
         

Примечание:
С 25.06.99 в программу добавлен перезапуск программы по WDT в случае сбоя. Не забудьте при записи программы в микроконтроллер разрешить работу WDT. Нетрудно видеть, что программа выполняется в цикле 100 мкс с синхронизацией по таймеру. В тело этого, самого быстрого, цикла вставлен сброс WDT (команда CLRWDT). Делитель, подключенный к WDT, установлен на коэффициент деления 1. При таких установках, в случае сбоя программы, перезапуск должен произойти через 18 мс.

 


Главная | Новости | Программы | Электроника | Музыка | Flash | Разное | Ссылки | О себе | Файлы | Форум


SamaraTop Rambler's Top100Rambler's Top100

© DeadMazay 99 - 03