movf t2h,w ; ср момента выдачи сигнала
subwf _tmr0h,w ; вычитаем из ср таймера
btfss _status,c ; проверяем флаг переноса
return ; ср таймера > ср момента выдачи
btfss _status,z ; проверяем флаг нуля
goto _ot2 ; ср таймера < ср момента выдачи
movf t2,w ; мр момента выдачи сигнала
subwf _tmr0,w ; вычитаем из мр таймера
btfss _status,c ; проверяем флаг переноса
return ; мр таймера > мр момента выдачи
_ot2 bsf _portb,outc ; выдаем сигнал
movlw b'10110101' ; сбрасываем флаги
andwf flag,f ; в регистре flag
bsf flag,4 ; ставим флаг выдачи сигнала
clrf t2 ; очистка регистров
clrf t2h ; хранения коррекции сигнала
Время выполнения блока 26 тактов.
make_ignition Подпрограмма коррекции принятого сигнала.
Длительность сигнала “зажигание” находится в регистровой паре (tay2h,tay2). Проверяется сигнал IDL, если он равен 0, то коррекции не производится и управление передается на метку no_make2.
Анализируется линия порта А, отвечающая за выбор алгоритма коррекции (0 - адаптивная коррекция, 1- коррекция из ПЗУ).
Если выбрана адаптивная ситема, то инкриментируется счетчик числа оборотов, и при прохождении счетчика через 256 увеличивается на единицу множитель угла опережения зажигания. Анализируется флаг детонации (бит 5 регистра flag), и если он равен единице, то множитель уменьшается на единицу ( угол опережения зажигания изменяется с шагом 1.40625 ° п.к.в.). Фрагмент программы:
btfss flag,5 ; проверяем флаг детонации
goto mign1 ; флаг не стоит - идем дальше
clrf count ; иначе сброс счетчика
decfsz delta,f ; уменьшаем УОЗ
goto mign2 ; если не ноль - идем на коррекцию УОЗ
goto no_make2 ; если ноль - идем на перезапись
mign1 movf delta,f ; проверяем множитель УОЗ
btfsc _status,z ; на равенство нулю
goto no_make2 ; переписываем значение длительности
incfsz count,f ; увеличиваем счетчик оборотов
incf delta,f ; если 256 оборотов - увеличиваем УОЗ
Если выбран алгоритм системы с коррекцией на основе констант из ПЗУ, то вычисляется значение интервала коррекции (подпрограмма make_adrk), считывается значение коррекции из внутренней EEPROM (подпрограмма read_EEPROM). Производится анализ считанного значения:
movlw b'01111111' ; проверяем
andwf tmp,w ; значащие биты коррекции
btfsc _status,z ; если нулевая коррекция
goto no_make2 ; просто переписываем старое значение
Для обоих алгоритмов вычисляем шаг коррекции (1.40625° п.к.в.) путем деления значения периода на 80h:
movf perh,w ; загружаем ср периода
movwf suml ; запись в рабочий регистр
rlf per,w ; сдвигаем влево мр и ср периода
rlf suml,f ; в suml 1,40625°п.к.в.
Проверяем знак считанного значения коррекции (старший бит). Если бит равен 1, следовательно коррекция отрицательная - уменьшаем длительность сигнала:
decrease2 bcf tmp,7 ; сброс бита знака коррекции
_md10 movf suml,w ; шаг коррекции
subwf tay2,f ; отнимаем от мр длительности
btfss _status,c ; перенос
decf tay2h,f ; уменьшаем ср
decfsz tmp,f ; уменьшаем счетчик
goto _md10 ; если не ноль - заново
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.