; 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	!Свободен
; 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-1	;Номер активной таблицы в случае отключенного канала АЦП _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	_DoInputPullUp		     		;Подключать подтягивающие резисторы на входах (по умолчанию выкл.)	
	                                                ;При отключении подтяжки ине выключенной функции Желтая перемычка
							;возможны ложные срабатывания без внешнего доп. резистора на линии PINB.3
;#define        _YellowJumperDisable                    ;Программный выключатель Желтой перемычки
;#define        _HalfDuplexTimeOut   5.5                ;Включить режим поддержки полудуплекса со времением таймаута в мс      
							;По умолчанию FullDuplex без задержки
							;В режиме непрерывной трансляции то этот параметр игнорируется
;#define 	_DoTransmiteN1                          ;Любая из этих команд включает режим непрерывной трансляции 
;#define 	_DoTransmiteN0                          ;параметра или группы в формате [0x55,0xAA,0x55,Err,..параметры..]
;#define 	_DoTransmiteN                           ;на каждом обороте двигателя и при его остановке
;#define 	_DoTransmiteMDelta                      ;Err - признак ошибки наложения. Если Err=0 то пакеты идут подряд (оборот за оборотом)
;#define 	_DoTransmitePLoad                       ;В противном случае пакеты могут передаваться через один, два и т.д оборотов.
;#define 	_DoTransmiteUOZCurrent                  ;Это не ошибка, а в большей части предупреждение.
;#define 	_OUZBaudRate   9600 			;Скорость передачи UART при работе с OUZ (по умолчанию 9600)
							;Варианты - 9600, 19200, 38400, 57600, 115200. Иные значения меняются на 9600
;#define 	_ATBaudRate    115200          		;Скорость передачи в режиме непрерывной трансляции параметров (программа UOZ не работает) (по умолчанию 115200)
							;Варианты - 9600, 19200, 38400, 57600, 115200. Иные значения меняются на 9600

;#define	_CheckMaxRpm  10000                     ;Включить постоянную проверку на обороты выше предельных (10000)
							;Пропуск зажигания следует организовывать с помощью макроса SkipOnMaxRpm 
;********************************  СОКРАЩЕННЫЙ НАБОР ПАРАМЕТРОВ 

#define	_EngineInfo "LX300GY-A DS2 PRO - Двухимпульсный датчик"	
#define	_Delta		  45.0				;Угловой размер метки Delta 
#define _Betta 		  10.0				;Угловое расстояние от ВМТ до метки Delta. 

#define	_UOZMax	 	  32.0				;Максимальный угол опережения зажигания	
                                                        ;Минимальный угол определен по умолчанию
#define _DoAverage 					;Включено усреднение по двум отсчетам оценки скорости вращения

#define	_Fn		  18				;Частота тактовых импульсов, поступающих на таймер Т1

;Управление корректром нагрузки
#define	_Load             2.0                           
;Угловая апертура корректора нагрузки в "-" (не более 10 грд.) Надо подбирать.
#define _LoadStartSelectr 24       			
;Номер начального диапазона работы корректора нагрузки 31..0
;Смотри столбец D Главной разметочной таблицы.Так при  _LoadStartSelectr 24
;корректор нагрузки будет включаться только при оборотах выше 2000 оборотов
;В таблице отмечено розовым цветом
#define _LoadBufferSize   128 				
;Длина кольцевого буфера корректора нагрузки (32, 64, 128) определет инертность
;Если в процессе испытаний нужно будет более сильную интерность, то могу снять ограничение


;Ниже закомментированы строки, которые следует включить если нужен ручной корректор УОЗ
;#define _Manual		10		
;#define _ADCCanCorSelectr	6
;#define _DoInvertADCCorSelectr

;Ниже закомментированы строки, которые следует включить если нужно переключение таблиц
#define _TblCount		8
#define _ADCCanTblSelectr	7	
;#define _DoInvertADCTblSelectr
;#define _DefaultTbl		5	

;#define _CheckMaxRpm  10000                     	;Включить постоянную проверку на обороты выше предельных

#define _YellowJumperDisable                    

#define	_DoInputPullUp		     	

;#define _HalfDuplexTimeOut   5.5                ;Включить режим поддержки полудуплекса со времением таймаута в мс      

;#define _UOZBaudRate 38400

;#define _ATBaudRate    115200        		 ;Скорость передачи в режиме непрерывной трансляции параметров (программа UOZ не работает) (по умолчанию 115200)
;#define _DoTransmiteN1                          ;Любая из этих команд включает режим непрерывной трансляции 
;#define _DoTransmiteN0                          ;параметра или группы в формате [0x55,0xAA,0x55,Err,..параметры..]
;#define _DoTransmiteN                           ;на каждом обороте двигателя и при его остановке
;#define _DoTransmiteMDelta                      ;Err - признак ошибки наложения. Если Err=0 то пакеты идут подряд (оборот за оборотом)
;#define _DoTransmitePLoad                       ;В противном случае пакеты могут передаваться через один, два и т.д оборотов.
;#define _DoTransmiteUOZCurrent                  ;Это не ошибка, а в большей части предупреждение.

;!!Настройка для моторной части
;*********************************************************************************************

#define _Event0       0b10111110			;Определена реакция на код начала метки Delta на цилиндре
#define _Event1       0b11101011			;Определена реакция на код завершения  метки на цилиндре



.equ	CmdLineBit    = 0				;Номер бита сигнала управления 


.include "core.inc"					;Подключение Ядра (сегмент кода, сегмент данных)          
.dseg
.org EndCoreDseg

.CSEG

.org EndCoreCSeg

reset:  sbi	DDRC,CmdLineBit				;Назначение линии PC0(adc0) контролера для работы на выход
	cbi	PORTC,CmdLineBit			;Деактивировать выходную линию
;Настройка параметров Ядра
;**********************************************************************************************
;______________________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 переключателей, включая режим работы светодиода
 	sbr	EStatus,Ign1				;Пусть флаг пользователя будет флагом разрешения зажигания
	                                                ;Зажигание разрешено
	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: 
	SkipOnMaxRpm					;Не выполнять следующую инcтрукцию если обороты выше предельных
	sbi	PORTC,CmdLineBit			;Включить сигнал зажигания принудительно на конце метки DELTA
	StopDelta                                       ;Макрос отметки времени (окончание виртуального импульса Delta)
	ret						;Возврат в вызывающую программу


Service:cbi	PORTC,CmdLineBit			;Отключить сигнал зажигания принудительно в начале виртуального импульса Delta
	ret        					;Возврат в вызывающую программу

Ignition:
	SkipOnMaxRpm					;Не выполнять следующую инcтрукцию если обороты выше предельных
	sbi	PORTC,CmdLineBit			;Включить сигнал зажигания 
	ret						;Возврат в вызывающую программу

;****************************************************** Заполнение базовых таблиц из разметочной таблицы
FillIndex: 
	FTW	0xFFFF, 0x000000			;337  1/мин
	FTW	0x6BF0, 0x0001BB			;800  1/мин
	FTW	0x5659, 0x000BDC			;1000  1/мин
	FTW	0x47F5, 0x0011CA			;1200  1/мин
	FTW	0x3DAD, 0x0018E6			;1400  1/мин
	FTW	0x35F8, 0x002137			;1600  1/мин
	FTW	0x2FF9, 0x002AB2			;1800  1/мин
	FTW	0x2B2D, 0x00355E			;2000  1/мин
	FTW	0x2740, 0x004136			;2200  1/мин
	FTW	0x23FB, 0x004E4C			;2400  1/мин
	FTW	0x2136, 0x005C6F			;2600  1/мин
	FTW	0x1ED7, 0x006BF8			;2800  1/мин
	FTW	0x1CC8, 0x007C5B			;3000  1/мин
	FTW	0x1AFC, 0x008E78			;3200  1/мин
	FTW	0x1966, 0x00A16B			;3400  1/мин
	FTW	0x17FC, 0x00B50A			;3600  1/мин
	FTW	0x16B9, 0x00CAE6			;3800  1/мин
	FTW	0x1596, 0x00E136			;4000  1/мин
	FTW	0x148F, 0x00F930			;4200  1/мин
	FTW	0x13A0, 0x011236			;4400  1/мин
	FTW	0x12C5, 0x012B40			;4600  1/мин
	FTW	0x11FD, 0x0147AE			;4800  1/мин
	FTW	0x1145, 0x01642D			;5000  1/мин
	FTW	0x109B, 0x018182			;5200  1/мин
	FTW	0x0FFE, 0x01A16D			;5400  1/мин
	FTW	0x0F6B, 0x01BDD3			;5600  1/мин
	FTW	0x0EE3, 0x01E1E2			;5800  1/мин
	FTW	0x0E64, 0x020408			;6000  1/мин
	FTW	0x0D49, 0x00E793			;6500  1/мин
	FTW	0x0C56, 0x010DB2			;7000  1/мин
	FTW	0x0B83, 0x013699			;7500  1/мин
	FTW	0x0ACB, 0x01642D			;8000  1/мин
	ret

FillTable:
	FTB	0xFF					;10,18 град.
	FTB	0xFF					;10,18 град.
	FTB	0xFA					;11,05 град.
	FTB	0xF5					;11,93 град.
	FTB	0xEF					;12,99 град.
	FTB	0xE9					;14,04 град.
	FTB	0xE3					;15,10 град.
	FTB	0xD8					;17,03 град.
	FTB	0xCD					;18,96 град.
	FTB	0xC3					;20,72 град.
	FTB	0xBB					;22,13 град.
	FTB	0xB3					;23,54 град.
	FTB	0xAC					;24,77 град.
	FTB	0xA6					;25,82 град.
	FTB	0xA1					;26,70 град.
	FTB	0x9D					;27,40 град.
	FTB	0x9A					;27,93 град.
	FTB	0x99					;28,11 град.
	FTB	0x98					;28,28 град.
	FTB	0x97					;28,46 град.
	FTB	0x96					;28,63 град.
	FTB	0x95					;28,81 град.
	FTB	0x94					;28,98 град.
	FTB	0x93					;29,16 град.
	FTB	0x92					;29,34 град.
	FTB	0x91					;29,51 град.
	FTB	0x90					;29,69 град.
	FTB	0x90					;29,69 град.
	FTB	0x8F					;29,86 град.
	FTB	0x8E					;30,04 град.
	FTB	0x8E					;30,04 град.
	FTB	0x8E					;30,04 град.
	ret

