;----------------------------------------------------
;  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
