; Author : Гринев Сергей (for_dgf@mail.ru)
.include "m328pdef.inc"
;****************************************************	Карта входов и выходов
; Порт B							
; PB0(icp)		in	!Mode переключатель - 2
; PB1(osc1)		in	!Mode переключатель - 1
; PB2(ss)		in	!Mode переключатель - 0
; PB3(mosi)		in	!Цифровой вход 
; PB4(miso)		in	!Цифровой вход 
; PB5(sck)		out	!Вспомогательный светодиод на Ардуино
;*******************************************************************************
; Порт D 
; PD0(rxd)			!UART обмен  
; PD1(txd)			!UART обмен  
; PD2(int0)		in	!Вход датчика DH1	
; PD3(int1)		in	!Вход датчика DH2 (отключен)						
; PD4(t0)		in	!Свободен
; PD5(t1)		in	!Соединить с PD6 
; PD6(ain0)		out	!Соединить с PD5 
; PD7(ain1)		in	!Mode переключатель 3
;*******************************************************************************
; Порт C	
; PC0(adc0)		out	!Сигнал зажигания выход
; PC1(adc1)		in	!Свободен
; PC2(adc2)		in	!Свободен
; PC3(adc3)		in	!Свободен
; PC4(adc4/scl)		in	!
; PC5(adc5/sda)		in	!
;     adc6		in	!Канал АЦП выбора таблицы или Канал АЦП корректора
;     adc7		in	!Канал АЦП выбора таблицы или Канал АЦП корректора

#define	VersionName "1Ц.XT.ДХ (ДИ с переходником) "	;Одноцилиндровый двигатель.

#define _Betta 		10.0				;Угловое расстояние от ВМТ до метки Delta. 
#define	_Delta		22.0				;Угловой размер метка Delta
#define	_UOZMax		30.0				;Максимальный угол опережения зажигания (=<LBetta+LDelta-3)
#define	_UOZMin		_Betta				;Минимальный угол опережения зажигания (>=LBetta)
#define	_Alfa		0.1				;Угловое расстояние отключения сигнала зажигания после метки Delta

#define	_StopTime	2.0				;Время (сек) детектирования режима СТОП
#define	_Manual		5.0				;Угловая апертура ручного корректора УОЗ на +/- (не более половины Delta)
							;Ручной корректор отключается при ADCCanCorSelectr = 0. 
							;Середина кода АЦП соотвествует сдвигу 0 градусов
#define	_Load		3.0                             ;Угловая апертура корректора нагрузки в "-" (не более Delta)

.equ	Base		= 360				;Угол-база в градусах 
.equ	Fn		= 8				;Частота тактовых импульсов, поступающих на таймер Т1

.equ	TblCount	= 8				;Количество таблиц УОЗ  2N (N=1, 2, 4, 8, 16, 32). Номер активной таблицы 
							;переключается напряжением на входе канала АЦП ADCCanTblSelectr. 
							;При ADCCanTblSelectr = 0 номер таблицы выбирается  максимальным из доступных.
.equ	ADCBufferSize	= 8 				;Длина кольцевых буферов каналов АЦП (2, 4, 8, 16, 32)
.equ	LoadBufferSize	= 32 				;Длина кольцевого буфера корректора нагрузки (32, 64, 128)

.equ	ADCCanTblSelectr= 0				;Номер канала мультиплексора датчика ДАД/ДПЗД (выбор активной таблицы)
.equ	ADCCanCorSelectr= 0				;Номер канала мультиплексора ручного корректора УОЗ
.equ	ADCCanA		= 0                             ;Номер канала A пользователя. ADCCanA =0 – канал отключен.
.equ	ADCCanB		= 0                             ;Номер канала Б пользователя.  ADCCanB =0 – канал отключен.

.equ	ProtectClk	= 6				;Интервал дискретизации протокола защиты от пульсаций  в мкс
.equ	ProtectCount 	= 2				;Количество повторных чтений протоколом защиты с интервалом ProtectClk после первого 
							;изменения линии датчика. Значение может быть в пределах 1-7.
.equ	CmdLineBit	= 0				;Номер бита сигнала управления 
.equ	StartDeltaCode	= 0b00001010			;Код начала метки Delta на цилиндре
.equ	StopDeltaCode 	= 0b00000101			;Код завершения метки Delta на цилиндре

.include "core.inc"					;Подключение Ядра (сегмент кода, сегмент данных)          

.dseg
.org EndCoreDseg
.CSEG

.org EndCoreCSeg

reset:  sbi	DDRC,CmdLineBit				;Назначение линии PC0(adc0) контролера для работы на выход
	cbi	PORTC,CmdLineBit			;Деактивировать выходную линию
	SetLEDCtrl  2       				;Светодиод на Arduino отражает состояние основного входного датчика

	load	A,CoreSetup				;Начальное значение 0b000000X0 (Все включено),
							;где X=ADCDisableBit устанавливает Сore при анализе параметров 

;!!!То, что отключено тут включить DIP нельзя. DIP могут только отключить то, что включено тут
;___________________76543210				;ADCCanTblSelectr, ADCCanCorSelectr, ADCCanA, ADCCanB
	ori	A,0b10111000				;Настройка параметров Ядра
 	store	CoreSetup,A
;Инверсная логика: 0 - включен, 1 - отключен
;7 - Отключен датчик DH2 
;6 - Отключено усреднение по двум отсчетам Т1
;5 - Отключен вызов события ServiceA 			
;4 - Отключен вызов события ServiceB 			
;3 - Отключен корректор для коммутатора ХХ.37.34
;2 - Отключен корректор нагрузки
;1 - Отключен АЦП
;0 - Отключен UART 

;Если есть DIP переключатели, то следующий блок может отключать включенные ранее функции- 
	sbis	PinD,7					;Если DIP переключатель замкнут на землю, то UART отключен
	sbi	CoreSetup,UARTDisableBit	
	load	A,ECoreSetup
	sbis	PinB,0					;Если DIP переключатель замкнут на землю, то ручной корректор отключен
	cbr	A,(1<<ADCCanCorSelectr)
	sbis	PinB,1					;Если DIP переключатель замкнут на землю, то переключатель таблиц отключен
	cbr	A,(1<<ADCCanTblSelectr)
	store	ECoreSetup,A
	andi	A,0xF0		
        brne	reset1                                  ;Автоматическое отключение АЦП в случае отключения всех каналов	
	sbi	CoreSetup,ADCDisableBit
reset1:	sbis	PINB,2					;При замыкании на землю корректор нагрузки отключается
	sbi	CoreSetup,LoadDisableBit                   
	ret						;Возврат в вызывающую программу

;Основная программа (вызывается Ядром постоянно)
loop:	ret                                             ;Возврат в вызывающую программу

Actions:cpi	Events,StartDeltaCode			;Сравнение регистра Событий с признаком начала метки на DH1
	brne	C_VMT					;Если не равны, то проверка следующего кода
	sbrc	Selectr,7 				;Если обороты выше табличных то сразу зажигание
	sbi	PORTC,CmdLineBit	
	StartDelta                                      ;Макрос отметки времени (начало виртуального импульса Delta)
	sbrc	Selectr,7				;Если обороты выше табличных то угол максимален
	sts	UOZCurrent,zerro
	sbrc	Selectr,7                               ;Если обороты выше табличных то угол максимален
	sts	UOZCurrent+1,zerro
	ret

Service:
	cbi	PORTC,CmdLineBit			;Отключить сигнал зажигания принудительно в начале виртуального импульса Delta
ServiceA:
ServiceB:
C_exit:	
	ret        					;Возврат в вызывающую программу

C_VMT:	cpi	Events,StopDeltaCode			;Сравнение регистра Событий с признаком окончания метки на DH1
	brne	C_exit					;Если не равны, то выход из подпрограммы
	sbi	PORTC,CmdLineBit			;Включить сигнал зажигания принудительно на конце метки DELTA
	StopDelta                                       ;Макрос отметки времени (окончание виртуального импульса Delta)
	ret						;Возврат в вызывающую программу

UOZMinError:
Ignition:	
	sbi	PORTC,CmdLineBit			;Включить сигнал зажигания 
	ret						;Возврат в вызывающую программу


;****************************************************** Заполнение базовых таблиц из разметочной таблицы
FillIndex: 
	FTW	0xFFFF					;764  1/мин
	FTW	0xD956					;900  1/мин
	FTW	0xC39A					;1000  1/мин
	FTW	0xB1D2					;1100  1/мин
	FTW	0xA300					;1200  1/мин
	FTW	0x9677					;1300  1/мин
	FTW	0x8BB7					;1400  1/мин
	FTW	0x8267					;1500  1/мин
	FTW	0x7A40					;1600  1/мин
	FTW	0x730F					;1700  1/мин
	FTW	0x6CAB					;1800  1/мин
	FTW	0x66F3					;1900  1/мин
	FTW	0x61CD					;2000  1/мин
	FTW	0x58E9					;2200  1/мин
	FTW	0x5180					;2400  1/мин
	FTW	0x4B3B					;2600  1/мин
	FTW	0x45DC					;2800  1/мин
	FTW	0x4133					;3000  1/мин
	FTW	0x3D20					;3200  1/мин
	FTW	0x3988					;3400  1/мин
	FTW	0x3655					;3600  1/мин
	FTW	0x3379					;3800  1/мин
	FTW	0x30E7					;4000  1/мин
	FTW	0x2E92					;4200  1/мин
	FTW	0x2C74					;4400  1/мин
	FTW	0x2A86					;4600  1/мин
	FTW	0x28C0					;4800  1/мин
	FTW	0x271F					;5000  1/мин
	FTW	0x2390					;5500  1/мин
	FTW	0x209A					;6000  1/мин
	FTW	0x1E18					;6500  1/мин
	FTW	0x1BF1					;7000  1/мин
	ret

FillTable: 
	FTB	0xFA					;10  град.
	FTB	0xFA					;10  град.
	FTB	0xFA					;10  град.
	FTB	0xFA					;10  град.
	FTB	0xFA					;10  град.
	FTB	0xF7					;10,3  град.
	FTB	0xF3					;10,6  град.
	FTB	0xF1					;10,8  град.
	FTB	0xEF					;11  град.
	FTB	0xEB					;11,3  град.
	FTB	0xE4					;11,97  град.
	FTB	0xD3					;13,41  град.
	FTB	0xC3					;14,87  град.
	FTB	0xA1					;17,82  град.
	FTB	0x69					;22,73  град.
	FTB	0x5B					;24  град.
	FTB	0x4A					;25,52  град.
	FTB	0x44					;26  град.
	FTB	0x3C					;26,68  град.
	FTB	0x3C					;26,75  град.
	FTB	0x37					;27,2  град.
	FTB	0x31					;27,68  град.
	FTB	0x2C					;28,16  град.
	FTB	0x2B					;28,24  град.
	FTB	0x2B					;28,25  град.
	FTB	0x22					;29  град.
	FTB	0x17					;30  град.
	FTB	0x17					;30  град.
	FTB	0x17					;30  град.
	FTB	0x17					;30  град.
	FTB	0x17					;30  град.
	FTB	0x17					;30  град.
	ret
	