Длительность работы подпрограммы в среднем 60 тактов. По окончанию работы подпрограммы управление передается на метку exit.
При положительном фронте сигнала “зажигание” подпрограмма вычисляет значение длительности измеряемого сигнала и осуществляет проверку сигнала Idl. Если сигнал равен нулю, то выдача сигнала “зажигание” прерывается (входной и выходной сигналы “зажигание” оказываются равны по длительности). То же самое происходит при нулевом значении регистров (tay2h,tay2). Ôðàãìåíò ïðîãðàììû:
btfss _porta,idl ; ïðîâåðÿåì IDL
goto _out_i2 ; åñëè ðàâåí 0 èäåì íà âûäà÷ó èìïóëüñà
movf t2h,f ; ïðîâåðÿåì íà 0 ñêîððåêòèðîâàííîå çíà÷åíèå
btfss _status,z ; ñð = 0?
goto exit ; íåò -> èäåì íà âûõîä
movf t2,f
btfss _status,z ; ìð = 0?
goto exit ; íåò -> èäåì íà âûõîä
_out_i2 bsf _portb,outc ; âûäàåì èìïóëüñ "çàæèãàíèå"
movlw b'10110101' ; íàñòðàèâàåì ðåãèñòð äëÿ
andwf flag,f ; ñáðîñà ôëàãîâ
clrf t2h ; î÷èùàåì ðåãèñòðû äëÿ õðàíåíèÿ
clrf t2 ; ñêîððåêòèðîâàííîé äëèòåëüíîñòè èìïóëüñà
bsf flag,4 ; ñòàâèì ôëàã âûäà÷è èìïóëüñà "çàæèãàíèå"
goto exit ; èäåì íà âûõîä
Äëèòåëüíîñòü ðàáîòû ïîäïðîãðàììû â ñðåäíåì 60 тактîâ. По окончанию работы подпрограммы управление передается на метку exit.
Подпрограмма измерения сигнала “топливо” анализирует фронт сигнала, вызвавший прерывание. При обнаружении положительного фронта сигнала происходит фиксация этого момента времени как точки отсчета длительности сигнала “топливо”, сохранение старого значения длительности сигнала (подпрограмма save_old) и выход из обработчика (exit). По отрицательному фронту сигнала вычисляется длительность сигнала “топливо”. Фрагмент программы:
movf tnh,w ; ср начала отсчета импульса "топливо"
subwf tjdh,f ; вычитаем из ср текущего времени
movf tn,w ; мр начала отсчета
subwf tjd,f ; получаем длительность импульса "топливо"
btfss _status,c ; перенос?
decf tjdh,f ; уменьшаем ср
Для обнаружения момента перехода процессора на двойной счет по сигналу “топливо” требуется сохранять предыдущее значение сигнала IDL. Для этого используются следующие команды:
btfss flag,2 ; предыдущий IDL был 1?
call save_old ; нет - запись старого значения длительности
ex_rb5 btfsc _porta,idl ;IDL равен 1?
bsf flag,2 ; да - ставим флаг
btfss _porta,idl ;IDL равен 0?
bcf flag,2 ; да - сбрасываем флаг
Среднее время выполнения каждой ветви подпрограммы - 23 такта, общее время обработки прерывания по сигналу “топливо” - 56 тактов.
exit Блок команд, настраивающих контроллер на выход из подпрограммы обработки прерывания. Восстанавливаются два рабочих регистра, W и STATUS, путем записи в них значений, сохраненных в регистры tmp_w и tmp_st при входе в подпрограмму обработки прерывания. Так же выполняется настройка регистра прерываний INTCON, и возврат из подпрограммы обработки прерывания с разрешением дальнейших прерываний (команда RETFIE устанавливает бит 7 в регистре INTCON, ðàçðåøàÿ äàëüíåéøèå ïðåðûâàíèÿ).
check_outC Подпрограмма выдачи сигнала “зажигание” анализирует:
1. флаг выдачи сигнала (бит 4 регистра flag);
2. флаг начала выдачи сигнала (бит 3 регистра flag);
3. переполнения таймера для момента выдачи (бит 1 регистра flag);
4. сигнал IDL.
При невыполнении одного из этих условий происходит выход из подпрограммы. После прохождения всех проверок, значение времени выдачи скорректированного сигнала (t2h,t2) и текущего времени сравниваются, и после их равенства выходное значение порта изменяется - скорректированный сигнал “зажигание” в данном периоде считается выданным. Фрагмент программы:
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.