Микропроцессорная система коррекции режимов работы двигателя внутреннего сгорания (Проектная часть дипломного проекта), страница 5

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) находится время, в которое необходимо прекратить выдачу сигнала “зажигание”.