make_adrk Подпрограмма предназначена для вычисления значения текущего интервала коррекции частоты вращения. Используя 16-ти разрядное значение текущего периода, находящееся в регистровой паре (perh,per) и записанных в пару (adrk,tmp), производится деление этого значения на 64 (40h), путем двух сдвигов влево регистровой пары. Требуемое значение теперь находится в регистре adrk. Далее это значение сравнивается с константой 20h, и, если оно меньше, то это значение есть адрес текущего интервала коррекции. Если нет, то производится дальнейшее деление значения в регистре adrk на 16. Для этого обнуляется младшая тетрада регистра и командой SWAPF производится перестановка тетрад. Полученное значение есть значение адреса интервала коррекции (период деленный на 1024). Длительность работы подпрограммы при частоте вращения до 2288 об/мин – 17 тактов, свыше – 11 тактов.
_rtcc_int Подпрограмма обработки прерывания, возникающего от внутреннего 8и разрядного таймера-счетчика. При входе в подпрограмму сохраняются рабочий регистр и регистр статуса в отдельные регистры ( tmp_w и tmr_st), потому что прерывание от таймера имеет наивысший приоритет и разрешены даже во время обработки остальных прерываний.
Далее инкрементируется регистр, расширяющий таймер до 16и разрядного. Если нет переноса, то подпрограмма завершается восстановлением регистров W и STATUS, и выходом с разрешением дальнейших прерываний. Если есть перенос, то сбрасываются флаги переноса для моментов выдачи скорректированных сигналов “зажигание” и “топливо”. Длительность работы подпрограммы – 12 тактов (14 когда происходит переполнение).
_IntVector Ñ äàííîãî ñìåùåíèÿ íàõîäèòñÿ подпрограмма обработки прерываний. Сначала определяется, является ли внутренний таймер источником прерывания. Если это так, то происходит передача управления на подпрограмму _rtcc_int.
Ïåðåä ðàáîòîé îñíîâíîé ÷àñòè ïîäïðîãðàììû ñîõðÿíÿþòñÿ ðåãèñòðû W и STATUS в отдельные регистры tmp_w и tmp_st. Следом идет блок команд, сохраняющих текущее значение времени (16 разрядов таймера) и выполняющих проверку, не было ли во время сохранения изменения старших 8 разрядов таймера (для исключения ситуации, когда, например, сохраняем число 3ffh, записываем значение ffh в один регистр, происходит прерывание от таймера, старшие 8 разрядов увеличиваются на 1 (программно), и мы записываем значение 4; получаем что мы сохранили значение текущего времени равное 4ffh). Если такая ситуация происходит, то она исправляется.
Далее определяется источник прерывания из порта RB, и управление передается либо подпрограмме, работающей с сигналом “зажигание”, либо работающей с сигналом “топливо”.
Подпрограмма обработки сигнала “зажигание” определяет фронт сигнала, и в зависимости от этого передает управление коду, обрабатывающему каждый из фронтов сигнала.
При обнаружении спада сигнала “зажигание” происходит: во-первых, настройка регистра OPTION, изменяется значение активного фронта прерывания на ножке INT; âî-âòîðûõ, íà÷èíàåòñÿ âûäà÷à èìïóëüñà “çàæèãàíèå”; â-òðåòüèõ, âû÷èñëåíèå 16è ðàçðÿäíîãî çíà÷åíèÿ ïåðèîäà, çàïèñü òåêóùåãî âðåìåíè êàê âðåìåíè íà÷àëà îòñ÷åòà ïåðèîäà, íàñòðîéêà ðåãèñòðîâ ôëàãîâ (flag è flagh). Фрагмент программы:
movf owh,w ; текущее значение времени
subwf temph,w ; минус сохраненное значение
movwf perh ; начала отсчета дает
movf ow,w ; значение периода
subwf templ,w ; (perh,per) содержит значение периода
movwf per
btfss _status,c
decf perh,f
movf templ,w
movwf ow ; (owh,ow) содержит текущее время
movf temph,w ; т.е. начало отсчета нового периода
movwf owh
Далее осуществляется проверка значения регистров, содержащих длительность скорректированного импульса “зажигание”. Если значение регистров равно нулю, следовательно коррекция длительности сигнала “зажигание” не производилась и управление передается на метку exit. Åñëè çíà÷åíèå íå íóëåâîå, òî ê ýòîìó ÷èñëó ïðèáàâëÿåòñÿ çíà÷åíèå òåêóùåãî âðåìåíè, â ðåçóëüòàòå â ðåãèñòðîâîé ïàðå (tay2h,tay2) находится время, в которое необходимо прекратить выдачу сигнала “зажигание”.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.