'*****************************
'* Name    : САУВЗ.bas       *
'* Author  : RazdolbaqiT     *
'* MCU     : PIC12F675       *
'* OSC     : Internal        *
'*****************************

'@ DEVICE PIC12F675,INTOSC 'Set oscillator - internal  
_intosc 
DEFINE OSC 4           ' Internal Freq. 4 MHz

TACHO       var GPIO.0
SIG     	var GPIO.1   'Сигнал
SERV      	var GPIO.2   'Сервопривод
TERM		var GPIO.4   'Термореле NC
SETB        VAR GPIO.5   'запись

HPULSE   VAR WORD        
LPULSE   VAR WORD        
PERIOD   VAR WORD        'Период САУВЗ
PERIOD1  VAR WORD        'Период Клапана
STORED   VAR WORD        'Память оборотов САУВЗ
STORED1  VAR WORD        'Память Оборотов Клапана

TRISIO = %011000                           
ANSEL  = 0                
CMCON  = %00000111

'-----------------Выбор Режима-------------------
main:

IF SETB = 0 THEN
SERV = 0
SIG = 0
Pause 3000
SETB = 1
Pause 2 
goto main
ENDIF

IF TERM = 0 THEN        'Режим САУВЗ
SERV = 1                'Если Sig = 1, то ВЗ от-
SIG = 1                 'крывается.              
goto main1
ENDIF

IF TERM = 1 THEN        'Режим упр.Клапаном
SERV = 0                'Если Sig = 1, то клапан
SIG = 0                 'открывается
pause 25 
goto main2
ENDIF
'Если Serv = 1, то работает сервопривод
'Если Serv = 0, то сервопривод отключен 
goto main       

'--------------------CАУВЗ-----------------------
main1:                    
READ 0, STORED.Byte0
READ 1, STORED.Byte1

pulsin TACHO, 0, LPULSE
pulsin TACHO, 1, HPULSE
PERIOD = LPULSE+HPULSE

IF TERM = 1 THEN        'Переход на Упр.Клапаном
SERV = 1     'Полное открытие ВЗ перед переход в
SIG = 0      'режим. Паузу следует задать равной 
PAUSE 10000  'времени открытия ВЗ из крайнего по
SERV = 0     'ложения при напряжении около 9.8В.
SIG = 0
goto main2   
ENDIF

IF PERIOD < STORED + STORED/125 and PERIOD > STORED - STORED/125 THEN
SERV = 0     'Отключение привода при достижении
SIG = 0      'прогревочных оборотов двигателя.
pause 10
GOTO main1
ENDIF

IF SETB = 0 THEN        'Запись прогрев. оборотов
WRITE 0, PERIOD.Byte0   'которые удерживает САУВЗ
WRITE 1, PERIOD.Byte1
Pause 100
SETB = 1
ENDIF

IF PERIOD = 0 THEN
SERV = 1
SIG = 1
GOTO main1
ENDIF


IF PERIOD > STORED THEN
SERV = 1     'Закрытие ВЗ при недостатке оборотов
SIG = 1      'двигателя.
GOTO main1
ENDIF

IF PERIOD < STORED THEN
SERV = 1     'Открытие ВЗ при превышении оборотов
SIG = 0      'двигателя.
GOTO main1
ENDIF

IF TERM = 0 THEN 
Pause 100
goto main1
ENDIF

GOTO main1

'--------------Управление Клапаном---------------
main2:
SERV = 0                    
READ 2, STORED1.Byte0
READ 3, STORED1.Byte1

pulsin TACHO, 0, LPULSE
pulsin TACHO, 1, HPULSE
PERIOD1 = LPULSE+HPULSE

IF SETB = 0 THEN        'Запись оборотов клапана.
WRITE 2, PERIOD1.Byte0  
WRITE 3, PERIOD1.Byte1
Pause 100
SETB = 1
ENDIF

IF TERM = 0 THEN 
Pause 1500
goto dumaem
ENDIF

IF PERIOD1 = 0 THEN
SERV = 0      'Пока двигатель заглушен, клапан
SIG = 0       'закрыт
GOTO main2
ENDIF

IF PERIOD1 = STORED1 THEN
SERV = 0     'Пока обороты равны заданным, клапан
SIG = 0      'закрыт.
GOTO main2
ENDIF

IF PERIOD1 > STORED1 THEN
SERV = 0     'Пока обороты ниже заданных, клапан
SIG = 0      'закрыт.
pause 5
GOTO main2
ENDIF

IF PERIOD1 < STORED1 THEN
SERV = 0     'Когда обороты выше заданных, клапан
SIG = 1      'открыт.
GOTO main2
ENDIF

IF TERM = 1 THEN 
Pause 100
goto main2
ENDIF

GOTO main2

'-----------Режим записи оборотов САУВЗ----------
'-----------------особые условия:----------------
'---------первый запуск или прогретый ДВС--------
main3:

SERV = 0     
SIG = 0    

READ 0, STORED.Byte0
READ 1, STORED.Byte1

pulsin TACHO, 0, LPULSE
pulsin TACHO, 1, HPULSE
PERIOD = LPULSE+HPULSE

IF SETB = 0 THEN        'Короткое нажате кнопки
Pause 1400              'SET 
SETB = 1
pause 2
goto dumaem1            'Запись прогрев. оборотов
ENDIF                   'которые удерживает САУВЗ

IF TERM = 1 THEN
GOTO main3
ENDIF

IF TERM = 0 THEN        'Зажатие кнопки TERM или
Pause 1500              'присоединение холодного
goto dumaem2        'термореле выводит из реж                                    
ENDIF

GOTO main3 

'---------------Задержки датчиков----------------
'VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
dumaem:
if TERM = 0 THEN                                            
goto main1
ENDIF
if TERM = 1 THEN                                            
goto main3
ENDIF

'VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
dumaem1:
IF SETB = 1 THEN
WRITE 0, PERIOD.Byte0
WRITE 1, PERIOD.Byte1
SETB = 1
GOTO main3
ENDIF
 
IF SETB = 0 THEN        'Зажатие кнопки SET
GOTO main               'выводит из режима
ENDIF   

'VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
dumaem2:
IF TERM = 0 THEN 
goto main
ENDIF

IF TERM = 1 THEN
GOTO main3
ENDIF

'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
END

'Для перехода в особый режим, следует провести
'следующие действия:
'1. Отключить зажигание, снять контакты термореле
'2. Включить зажигание (без запуска двигателя).
'3. Коротко нажать кнопку TEMP на плате САУВЗ.
'+Для настройки оборотов на прогретом двигателя
'4а. Произвести запуск двигателя.
'5а. Довести обороты двигателя до желаемых
'6а. Удерживая обороты, коротко нажать SET
'    спустя 3 секунды опустить обороты
'7а. Для выхода из режима зажать Set на 2 секунды
'+Для настройки ПРИ ПЕРВОМ ЗАПУСКЕ (лучше вдвоём)
' и ХОЛОДНОМ ДВИГАТЕЛЕ (когда запуск без подсоса
' невозможен).
'4б. Снять разъём привода, привести ВЗ вручную на
'    3/4 закрытого положения.
'5б. Произвести запуск двигателя, при необходи-
'    мости подгазовывать.
'6б. Привести вручную ВЗ к желаемым оборотам.
'7б. Коротко нажать кнопку SET, не снижать обо-
'    роты в течении 3-х секунд.
'8б. Зажать кнопку SET на 2 секунды, для выхода
'    из режима
'9б Заглушить ДВС,подключить термодатчик и привод
'   Произвести запуск двигателя
' ВЫХОД ИЗ РЕЖИМА ПРОИСХОДИТ ПРИ ЗАЖАТИИ КНОПКИ
' ЗАПИСИ, ИЛИ ПРИ ОТКЛЮЧЕНИИ ЗАЖИГАНИЯ, ИЛИ ПРИ 
' ПОДКЛЮЧЕНИЯ "ХОЛОДНОГО" ТЕРМОРЕЛЕ, ИЛИ ПРИ ЗА
' ЖАТИИ КНОПКИ TERM.!!!