; Author : Гринев Сергей (for_dgf@mail.ru)
.include "m328pdef.inc"
;****************************************************	Карта входов и выходов
; Порт B							
; PB0(icp)		in	!Mode переключатель - 2 (Dip2) Если бит равен 0, то переключатель таблиц отключен
; PB1(osc1)		in	!Mode переключатель - 1 (Dip1) Если бит равен 0, то  корректор нагрузки отключается
; PB2(ss)		in	!Mode переключатель - 0 (Dip0) Если бит равен 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	!Cигнал сброса входного RS триггера
; PD5(t1)		in	!Соединить с PD6 
; PD6(ain0)		out	!Соединить с PD5 
; PD7(ain1)		in	!Mode переключатель 3 (Dip3) Если бит равен 0, то Ручной корректор УОЗ отключен	
;*******************************************************************************
; Порт 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	_EngineInfo 		"Нет информации"	
;#define	_Base			360		;Угол-база в градусах 			
;#define	_Delta			30		;Угловой размер метки Delta
;#define	_Betta			0		;Угловое расстояние от ВМТ до метки Delta
;#define	_UOZMax	 		_Betta +_Delta-1;Максимальный угол опережения зажигания	
;#define	_UOZMin	 		_Betta		;Минимальный угол опережения зажигания	
;#define	_Alfa			0.5             ;Угловое расстояние отключения сигнала зажигания после метки Delta
;#define	_Fn			8		;Частота тактовых импульсов, поступающих на таймер Т1
;#define	_Load			0		;Угловая апертура корректора нагрузки в "-", град.
;#define	_LoadStartSelectr	31		;Номер начального диапазона работы корректора нагрузки	
;#define	_LoadBufferSize  	64		;Длина кольцевого буфера корректора нагрузки
;#define	_ProtectClk  		6		;Интервал дискретизации протокола защиты от пуль-саций  в мкс
;#define	_ProtectCount		2		;Количество повторных чтений протоколом защиты с интервалом 
							;ProtectClk после первого изменения линии датчика	
;#define	_ADCBufferSize		8		;Длина буферов АЦП
;#define	_StopTime		1		;Временной интервал для расчета времени установле-ния режима СТОП, сек.	
;#define	_Manual			0		;Константа для ручного корректора, град.	
;#define	_ADCCanCorSelectr	0		;Номер канала АЦП Ручного корректора УОЗ
;#define	_TblCount		1		;Количество таблиц УОЗ
;#define	_ADCCanTblSelectr	0		;Номер канала АЦП выбора активной таблицы УОЗ
;#define	_DefaultTbl		_TblCount	;Номер активной таблицы в случае отключенного канала АЦП _ADCCanTblSelectr
;#define	_ADCCanA		0		;Номер канала АЦП свободного канала
;#define	_ADCCanB		0		;Номер канала АЦП свободного канала
;
;Параметры, которые не установлены по умолчанию 
;#define	_3734Enable				;Режим работы с коммутатором XX.37.34 (скважность сигнала управления 3)
							;В случае его включения следует указать _Alfa=Base/3 - !!работаю над автоматизацией
;#define	_DoInvertADCCorSelectr			;Инверсия кода АЦП канала _ADCCanCorSelectr код = (255-код)
;#define	_DoInvertADCTblSelectr			;Инверсия кода АЦП канала _ADCCanTblSelectr код = (255-код)
;#define	_DoAverage				;Усреднение по двум отсчетам оценки скорости вращения
;#define	_DH2Disable				;Принудительное отключение входа датчика DH2 - PD3(int1)
;#define	_DH1Disable				;Принудительное отключение входа датчика DH1 - PD2(int0)
;********************************  СОКРАЩЕННЫЙ НАБОР ПАРАМЕТРОВ 

#define	_EngineInfo "1Ц.ДХ"	
#define	_Delta		  22.6				;Угловой размер метки Delta 
#define _Betta 		  10.0				;Угловое расстояние от ВМТ до метки Delta. 
#define	_UOZMax	 	  30.6				;Максимальный угол опережения зажигания	
                                                        ;Минимальный угол определен по умолчанию
#define	_Alfa		  0.1				;Угловое расстояние отключения сигнала зажигания после метки Delta

#define	_Fn		  8				;Частота тактовых импульсов, поступающих на таймер Т1

#define _DoAverage 					;Включено усреднение по двум отсчетам оценки скорости вращения

;Ниже закомментированы строки, которые следует включить если нужно переключение таблиц
#define	_TblCount	  8				;Количество таблиц УОЗ
#define _ADCCanTblSelectr 6				;Номер канала АЦП выбора активной таблицы УОЗ
#define _DefaultTbl	  5				;Номер активной таблицы в случае отключенного канала АЦП _ADCCanTblSelectr
;#define _DoInvertADCTblSelectr				;Инверсия кода АЦП канала _ADCCanTblSelectr код = (255-код)


;Управление корректром нагрузки
#define	_Load             5.0                           
;Угловая апертура корректора нагрузки в "-" (не более 10 грд.) Надо подбирать.
#define _LoadStartSelectr 24       			
;Номер начального диапазона работы корректора нагрузки 31..0
;Смотри столбец D Главной разметочной таблицы.Так при  _LoadStartSelectr 24
;корректор нагрузки будет включаться только при оборотах выше 1500 оборотов
;В таблице отмечено розовым цветом
#define _LoadBufferSize   32
;Длина кольцевого буфера корректора нагрузки (32, 64, 128) определет инертность
;Если в процессе испытаний нужно будет более сильную интерность, то могу снять ограничение


;Ниже закомментированы строки, которые следует включить если нужен ручной корректор УОЗ
;#define _Manual		10		
;#define _ADCCanCorSelectr	7
;#define _DoInvertADCCorSelectr



;!!Настройка для моторной части
;*********************************************************************************************
#define	_DH2Disable					;Принудительное отключение входа датчика DH2 - PD3(int1)

#define _Event0         0b00001010			;Определена реакция на код начала метки Delta на цилиндре
#define _Event1         0b00000101			;Определена реакция на код завершения  метки на цилиндре

.equ	CmdLineBit	= 0				;Номер бита сигнала управления 
.equ	ResetLineBit	= 4                             ;Номер бита сигнала сброса входного RS триггера

.include "core.inc"					;Подключение Ядра (сегмент кода, сегмент данных)          
.dseg
.org EndCoreDseg

.CSEG

.org EndCoreCSeg

reset:  sbi	DDRC,CmdLineBit				;Назначение линии PC0(adc0) контролера для работы на выход
	cbi	PORTC,CmdLineBit			;Деактивировать выходную линию
	sbi	DDRD,ResetLineBit                       ;Назначение линии PD4(t0) контролера для работы на выход
	cbi	PORTD,ResetLineBit			;Включить сигнал сброса входного RS триггера
;Настройка параметров Ядра
;**********************************************************************************************
;______________________76543210				
	SetCoreSetup 0b000000000                         
;7 - Служебный флаг  - при настройке может иметь произвольное значение
;6 - Служебный флаг  - при настройке может иметь произвольное значение
;5 - Служебный флаг  - при настройке может иметь произвольное значение   
;4 - Служебный флаг  - при настройке может иметь произвольное значение
;3 - Режим работы корректора нагрузки на оборотах выше табличных (0 корректор будет продолжать работу при высоких оборотах)
;2 - Корректор нагрузки (Инверсная логика: 0 - включен, 1 - отключен)
;1 - АЦП		(Инверсная логика: 0 - включен, 1 - отключен)
;0 - UART 		(Инверсная логика: 0 - включен, 1 - отключен)
;**********************************************************************************************
;Коррекция параметров Ядра c помощью DIP переключателей или EEPROM аналогов DIP (выбрать только одну строчку)
;        SetOptions LED,2                               ;Установка только режима работы светодиода - CPU D2(PD2)
;        SetOptions DIP,2                               ;Использование DIP переключателей и установка режима работы светодиода
        SetOptions EEPROM,0x3FF	 		;Использование EEPROM аналогов DIP переключателей, включая режим работы светодиода

	sbi	PORTD,ResetLineBit			;Выключить сигнал сброса входного RS триггера
	ret
;SetOptions ___,2  !0 - Выключен     !4 - CPU A3(PC3)  !8 - Остановка       !12- Флаг  Ign1
;                  !1 - Delta        !5 - CPU A2(PC2)  !9 - Низкие обороты  !13- Флаг  Ign2
;                  !2 - CPU D2(PD2)  !6 - CPU A1(PC1)  !10- УОЗ макс.       !14- UARTCtrl
;                  !3 - CPU D3(PD3)  !7 - CPU A0(PC0)  !11- УОЗ мин.        !15- Включен
;**********************************************************************************************
Event0:							;Начало виртуального импульса Delta
	StartDelta                                      ;Макрос отметки времени (начало виртуального импульса Delta)
	ret

Event1: sbi	PORTC,CmdLineBit			;Включить сигнал зажигания принудительно на конце метки DELTA
	StopDelta                                       ;Макрос отметки времени (окончание виртуального импульса Delta)
	ret						;Возврат в вызывающую программу


Service:cbi	PORTC,CmdLineBit			;Отключить сигнал зажигания принудительно в начале виртуального импульса Delta
	ret        					;Возврат в вызывающую программу

UOZMinError:
Ignition:	
	sbi	PORTC,CmdLineBit			;Включить сигнал зажигания 
	ret						;Возврат в вызывающую программу

;****************************************************** Заполнение базовых таблиц из разметочной таблицы
FillIndex: 
	FTW	0xFFFF, 0x000000			;762  1/мин
	FTW	0xD8F3, 0x00068E			;900  1/мин
	FTW	0xC341, 0x000BCD			;1000  1/мин
	FTW	0xB181, 0x000E6C			;1100  1/мин
	FTW	0xA2B6, 0x00114E			;1200  1/мин
	FTW	0x9632, 0x001474			;1300  1/мин
	FTW	0x8B78, 0x0017DE			;1400  1/мин
	FTW	0x822B, 0x001B86			;1500  1/мин
	FTW	0x7A09, 0x001F7A			;1600  1/мин
	FTW	0x72DB, 0x0023A8			;1700  1/мин
	FTW	0x6C7A, 0x002822			;1800  1/мин
	FTW	0x66C4, 0x002CD4			;1900  1/мин
	FTW	0x61A1, 0x0031D6			;2000  1/мин
	FTW	0x58C1, 0x001CD8			;2200  1/мин
	FTW	0x515B, 0x00229A			;2400  1/мин
	FTW	0x4B19, 0x0028E9			;2600  1/мин
	FTW	0x45BC, 0x002FBB			;2800  1/мин
	FTW	0x4116, 0x003713			;3000  1/мин
	FTW	0x3D04, 0x003EE5			;3200  1/мин
	FTW	0x396E, 0x004764			;3400  1/мин
	FTW	0x363D, 0x005037			;3600  1/мин
	FTW	0x3362, 0x0059A7			;3800  1/мин
	FTW	0x30D0, 0x006399			;4000  1/мин
	FTW	0x2E7D, 0x006E25			;4200  1/мин
	FTW	0x2C60, 0x007923			;4400  1/мин
	FTW	0x2A72, 0x0084AA			;4600  1/мин
	FTW	0x28AE, 0x0090FE			;4800  1/мин
	FTW	0x270D, 0x009D29			;5000  1/мин
	FTW	0x2380, 0x004819			;5500  1/мин
	FTW	0x1E0A, 0x002EE1			;6500  1/мин
	FTW	0x1A09, 0x003FF0			;7500  1/мин
	FTW	0x1868, 0x009D29			;8000  1/мин
	ret

FillTable:
	FTB	0xF0					;10,01 град.
	FTB	0xF0					;10,01 град.
	FTB	0xF0					;10,01 град.
	FTB	0xF0					;10,01 град.
	FTB	0xF0					;10,01 град.
	FTB	0xED					;10,29 град.
	FTB	0xEA					;10,57 град.
	FTB	0xE8					;10,76 град.
	FTB	0xE5					;11,04 град.
	FTB	0xE2					;11,32 град.
	FTB	0xDB					;11,98 град.
	FTB	0xCC					;13,40 град.
	FTB	0xBC					;14,90 град.
	FTB	0x9D					;17,82 град.
	FTB	0x6E					;22,24 град.
	FTB	0x57					;24,41 град.
	FTB	0x4B					;25,54 град.
	FTB	0x42					;26,39 град.
	FTB	0x3B					;27,05 град.
	FTB	0x33					;27,80 град.
	FTB	0x2C					;28,46 град.
	FTB	0x26					;29,02 град.
	FTB	0x22					;29,40 град.
	FTB	0x20					;29,59 град.
	FTB	0x1E					;29,78 град.
	FTB	0x1D					;29,87 град.
	FTB	0x1C					;29,96 град.
	FTB	0x1A					;30,15 град.
	FTB	0x18					;30,34 град.
	FTB	0x17					;30,43 град.
	FTB	0x15					;30,62 град.
	FTB	0x15					;30,62 град.
	ret
