Эта ячейка расположена в адресном пространстве специальной области памяти по адресу h’2100’, а для указания значения, заносимого в эту область памяти на этапе программирования, используется директива de, как было описано на стр. 549.
Код, выполняемый при каждом сбросе микроконтроллера, используется для инициализации рабочего окружения.
Вектора
По адресу вектора сброса (h’000’) расположен переход к основной программе MAIN, а по адресу вектора прерывания (h’004’) — команда перехода к процедуре обработки прерывания.
Конфигурирование портов
Линии PORTA[4:0] и PORTB[7:5] конфигурируются как выходы, а остальные линии портов используются как входы.
Конфигурирование
Коэффициент деления предделителя задается равным 64, в качестве источника тактовых импульсов Таймера 0 используется системный тактовый сигнал. Также разрешается прерывание от Таймера 0.
Выбор текущего процесса
Для выбора процесса, которому следует передать управление, проверяется состояние кнопок ДИАГ. и УСТ. Если ни одна из кнопок не нажата, то осуществляется переход к процессу MAIN.
Если в момент сброса микроконтроллера нажата кнопка ДИАГ., то управление передается в подпрограмму DIAGNOSTIC, код которой приведен в Программе 17.4. Задачей процесса диагностики является тестирование различных периферийных устройств, подключенных к процессору, с целью проверки целостности цепей и исправности собственно устройств.
; *****************
; * ФУНКЦИЯ: Проверяет состояние кнопок и включает соотв. *
; * ФУНКЦИЯ: СИД или звуковой излучатель. Поочередно включает*
; * ФУНКЦИЯ: по одному сегменту на каждом индикаторе *
; * РЕСУРСЫ: Подпрограмма SPI_WRITE *
; * РЕСУРСЫ: Переменные TEMP, DATA_OUT_H, DATA_OUT_L *
; * ВХОД: Кнопка ДИАГ. нажата *
; * ВЫХОД: Кнопка ДИАГ. отпущена *
; *****************
DIAGNOSTIC
movlw b’11111110’; Формируем начальное значение
movwf TEMP; маски управления индикаторами
D_LOOP movlw b’11111111’; Выключаем все СИД и пищалку
movwf PORTB
bsf PORTA,BUZ
; Сканируем кнопки
btfss PORTB,PAUSE; ЕСЛИ нажата кнопка ПАУЗА,
bcf PORTB,GREEN; TO включаем зеленый СИД
btfss PORTB,STOP; ЕСЛИ нажата кнопка СТОП,
bcf PORTB,YELLOW; ТО включаем желтый СИД
btfss PORTB,SETT; ЕСЛИ нажата кнопка УСТ.,
bcf PORTB,RED; ТО включаем красный СИД
btfss PORTB,GO; ЕСЛИ нажата кнопка ПУСК,
bcf PORTA,BUZ; ТО включаем пищалку
; Теперь по очереди включаем все сегменты на обоих индикаторах
movf TEMP,w; Берем маску
movwf DATA_OUT_L; Копируем в регистры последовательной
movwf DATA_OUT_H; передачи
call SPI_WRITE; Передаем ее
btfsc PORTB,DIAG; ЕСЛИ кнопка ПАУЗА отпущена,
return; ТО выходим из процедуры самодиагностики
clrf NEW_SEC; Сбрасываем флаг секунды
; Теперь сдвигаем маску для индикаторов и ждем 1 секунду
bcf STATUS,С; Сбрасываем бит переноса
btfsc TEMP,7; Проверяем старший бит маски
bsf STATUS,С; ЕСЛИ 1, ТО устанавливаем флаг переноса
rlf TEMP,f; Вдвигаем его в регистр
D_LOOP2 movf NEW_SEC,f; Ждем секунду
btfsc STATUS,Z; ЕСЛИ флаг не равен нулю, ТО пропускаем
goto D_LOOP2; ИНАЧЕ пробуем снова
goto D_LOOP; Повторяем процедуру
Кнопки