Рис. 2.5 Результаты тестирования системы - коррекция угла опережения зажигания Q |
Рис. 2.6 Результаты работы системы (синхронная коррекция сигнала "топливо"); tв - длительность впрыска топлива (мс) |
2.3. Описание программы
Программа использует циклический опрос флагов, показывающих в каждый момент времени состояние выходных сигналов, - ожидание приема сигнала или выдача. Фрагмент программы:
lp_001 btfsc flag,7 ; приняли сигнал "зажигание"?
call make_ignition ; да - идем корректировать
btfsc flag,6 ; скорректировали сигнал "зажигание"?
call check_outC ; да - выдаем
btfss flagh,0 ; приняли сигнал "топливо"?
call make_inj_time ; да - корректируем
btfss flagh,2 ; выдаем сигнала для 1,4 форсунок?
call check_inj1 ; да - проверяем
btfss flagh,1 ; выдаем сигнала для 2,3 форсунок?
call check_inj2 ; да - выдаем
btfss _porta, Dat ; проверяем сигнал с одновибратора
goto lp_001 ; нет сигнала - идем на начало цикла
movlw b'00111111' ; есть сигнал - сбрасываем флаги отсчета
andwf flagh,f ; номера группы форсунок
bsf flagh,6 ; устанавливаем активными 1,4 форсунку
lp_010 btfsc _porta, det проверяем сигнал с датчика детонации
goto lp_001 ; идем на начало цикла
bsf flag,5 ; ставим флаг детонации
goto lp_001 ; идем на начало цикла
Бит 7 (устанавливается по окончанию измерения длительности сигнала “зажигание”) регистра flag показывает, что длительность сигнала “зажигание” измерена, следовательно требуется передача управления на подпрограмму коррекции. Бит 6 (регистра flag) указывает на то, что коррекция длительности сигнала “зажигание” была проведена и в выходных регистрах содержится значение, готовое к выдаче. Бит 0 (в регистре flagh), установленный в 1, сигнализирует о том, что сигнал “топливо” не был скорректирован в данном периоде. Биты 1 и 2 (ðåãèñòðà flagh) устанавливаются на время выдачи сигналов по парам форсунок, и сбрасываются по окончанию выдачи каждого сигнала.
В случае выполнения проверок, передача управления происходит на нужную подпрограмму, в которой, в свою очередь происходит несколько дополнительных проверок.
Для оптимизации кода программы те группы операций, которые выполняются несколько раз, используя одни и те же ячейки оперативной памяти, помещены в подпрограммы.
read_EEPROM Подпрограмма чтения ячейки из внутреннего EEPROM микроконтроллера. Адрес ячейки передается в подпрограмму в регистре adrk. В подпрограмме запрещаются прерывания, т.к. происходит переключение страницы памяти для настройки управляющего регистра. Результат операции чтения готов на следующем командном цикле. Длительность подпрограммы 11 тактов. Фрагмент программы:
movf adrk,w ; считываем адрес ячейки
movwf _eeadr ; записываем в регистр адреса EEPROM
bcf _intcon,7 ; запрещаем прерывания
bsf _status,rp0 ; ïåðåêëþ÷àåì ñòðàíèöó ïàìÿòè
bsf _eecon1,rd ; óñòàíàâëèâàåì áèò ÷òåíèÿ EEPROM
bcf _status,rp0 ; ïåðåêëþ÷àåì ñòðàíèöó ïàìÿòè îáðàòíî
movf _eedata,w ; ñ÷èòàâàåì ïîëó÷åííîå çíà÷åíèå
movwf tmp ; çàïèñûâàåì â ðåãèñòð TMP
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.