Эта ячейка расположена в адресном пространстве специальной области памяти по адресу 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
; Повторяем процедуруКнопки