; 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)		out	!Cигнал сброса входного RS триггера
; 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.ДХ (ДИ с переходником) "	;Одноцилиндровый двигатель c датчиком Холла.

#define _Betta 		10.0				;Угловое расстояние от ВМТ до метки Delta. 
#define	_Delta		22.6				;Угловой размер метка Delta
#define	_UOZMax		30.6				;Максимальный угол опережения зажигания (=<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		5.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= 6				;Номер канала мультиплексора датчика ДАД/ДПЗД (выбор активной таблицы)
.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	ResetLineBit	= 4                             ;Номер бита сигнала сброса входного RS триггера
.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			;Деактивировать выходную линию
	sbi	DDRD,ResetLineBit                       ;Назначение линии PD4(t0) контролера для работы на выход
	cbi	PORTD,ResetLineBit			;Включить сигнал сброса входного RS триггера
;Настройка параметров Ядра
;**********************************************************************************************
	load	A,CoreSetup				;Начальное значение 0b000000X0 (Все включено),
							;где X=ADCDisableBit устанавливает Ядром при анализе параметров 
                                                        ;ADCCanTblSelectr, ADCCanCorSelectr, ADCCanA, ADCCanB
;___________________76543210				
	ori	A,0b10111000				
 	store	CoreSetup,A
;Инверсная логика: 0 - включен, 1 - отключен
;7 - Отключен датчик DH2 
;6 - Отключено усреднение по двум отсчетам Т1
;5 - Отключен вызов события ServiceA 			
;4 - Отключен вызов события ServiceB 			
;3 - Отключен корректор для коммутатора ХХ.37.34
;2 - Отключен корректор нагрузки
;1 - Отключен АЦП
;0 - Отключен UART 
;**********************************************************************************************

;Коррекция параметров Ядра  
;Кодирование управления светодиодом на линии PB5 и копирование DIP в регистр А
	CopyLEDandDIP A,2      				;Светодиод отражает состояние основного входного датчика
;0 - Выключен
;1 - Delta
;2 - CPU D2(PD2)					
;3 - CPU D3(PD3)
;4 - CPU A3(PC3)
;5 - CPU A2(PC2)
;6 - CPU A1(PC1)
;7 - CPU A0(PC0)
;8 - Остановка
;9 - Низкие обороты
;10- УОЗ макс.
;11- УОЗ мин.
;12- Флаг  Ign1
;13- Флаг  Ign2
;14- UARTCtrl
;15- Включен
	flds	B,0x3FF					;Загрузка регистра из EEPROM        
	sbic	PINB,4					;«Красная перемычка» при замыкании на землю регистр А
	mov	A,B                                     ;заполнится значениями DIP иначе из ячейки памяти EEPROM 0x3FF
	SetDIPandLEDCtrl A
	ret						;Возврат в вызывающую программу


;Основная программа (вызывается Ядром постоянно)
loop:	sbi	PORTD,ResetLineBit			;Выключить сигнал сброса входного RS триггера
	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					;762  1/мин
	FTW	0xD8F3					;900  1/мин
	FTW	0xC341					;1000  1/мин
	FTW	0xB181					;1100  1/мин
	FTW	0xA2B6					;1200  1/мин
	FTW	0x9632					;1300  1/мин
	FTW	0x8B78					;1400  1/мин
	FTW	0x822B					;1500  1/мин
	FTW	0x7A09					;1600  1/мин
	FTW	0x72DB					;1700  1/мин
	FTW	0x6C7A					;1800  1/мин
	FTW	0x66C4					;1900  1/мин
	FTW	0x61A1					;2000  1/мин
	FTW	0x58C1					;2200  1/мин
	FTW	0x515B					;2400  1/мин
	FTW	0x4B19					;2600  1/мин
	FTW	0x45BC					;2800  1/мин
	FTW	0x4116					;3000  1/мин
	FTW	0x3D04					;3200  1/мин
	FTW	0x396E					;3400  1/мин
	FTW	0x363D					;3600  1/мин
	FTW	0x3362					;3800  1/мин
	FTW	0x30D0					;4000  1/мин
	FTW	0x2E7D					;4200  1/мин
	FTW	0x2C60					;4400  1/мин
	FTW	0x2A72					;4600  1/мин
	FTW	0x28AE					;4800  1/мин
	FTW	0x270D					;5000  1/мин
	FTW	0x2380					;5500  1/мин
	FTW	0x208B					;6000  1/мин
	FTW	0x1E0A					;6500  1/мин
	FTW	0x1BE5					;7000  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	0xE9					;10,67 град.
	FTB	0xE6					;10,95 град.
	FTB	0xE3					;11,23 град.
	FTB	0xDF					;11,61 град.
	FTB	0xD7					;12,36 град.
	FTB	0xCF					;13,11 град.
	FTB	0xBD					;14,81 град.
	FTB	0xA7					;16,88 град.
	FTB	0x8D					;19,33 град.
	FTB	0x6F					;22,15 град.
	FTB	0x5C					;23,94 град.
	FTB	0x48					;25,82 град.
	FTB	0x3E					;26,76 град.
	FTB	0x33					;27,80 град.
	FTB	0x32					;27,89 град.
	FTB	0x2F					;28,18 град.
	FTB	0x2D					;28,36 град.
	FTB	0x2B					;28,55 град.
	FTB	0x27					;28,93 град.
	FTB	0x24					;29,21 град.
	FTB	0x21					;29,49 град.
	FTB	0x1D					;29,87 град.
	FTB	0x19					;30,25 град.
	FTB	0x15					;30,62 град.
	FTB	0x15					;30,62 град.
	ret
