Необходимо сделать несколько замечаний по поводу приведенного фрагмента программы. Во-первых, как и большинство микроконтроллеров PIC среднего уровня, PIC16F627/8 имеют четыре банка регистров, выбираемых при помощи битов RP1 и RP0 регистра STATUS (см. Рис. 5.4 на стр. 121). После сброса микроконтроллера оба бита обнуляются, т. е. используется 0-й банк памяти. Поэтому в приведенном коде мы не стали дополнительно сбрасывать бит RP1. Регистр PIE1 всегда располагается в 1-м банке, так как после конфигурирования дальнейшее его изменение, как правило, не требуется. В то же время из соображений удобства регистр PIR1 размещается в 0-м банке, поскольку он часто опрашивается и изменяется. Регистр INTCON отображен на все четыре банка.
В некоторых процессорах, таких как PIC16F87X, имеется очень много источников прерывания, слишком много даже для описанной схемы. В таких устройствах вводится дополнительная пара регистров PIR2 и PIE2, располагающихся в тех же банках, что и аналогичные регистры первой пары. В этих регистрах находятся соответственно биты маски и флаги прерываний дополнительных источников.
Возьмем конвейерную линию по упаковке консервированного горошка. Одним из элементов автоматического упаковщика является фотоэлемент, формирующий одиночный короткий импульс при пересечении луча банкой, аналогично схеме на Рис. 7.4. После прохода 24 банок на 0-м выводе порта A (RA0) необходимо сформировать импульс длительностью 1 мс
Решение
Код программы приведен в Программе 7.2. По адресу
Поскольку после сброса прерывания автоматически запрещаются, различные регистры и порты обычно конфигурируются в самом начале фоновой программы до разрешения прерываний. Это исключает вероятность появления прерываний до завершения инициализационного кода. Инициализация же заключается в следующем:
1. Сброс 0-го бита порта А, что гарантирует наличие НИЗКОГО уровня на выводе RA0 после сброса.
2. Все линии параллельных портов ввода/вывода при сбросе микроконтроллера переключаются на вход. Для переключения 0-й линии порта А на выход, необходимо сбросить соответствующий бит регистра TRISA. Поскольку этот регистр располагается в 1-м банке, необходимо переключить банки памяти, изменив бит RP1 регистра STATUS (см. стр. 99). Более подробно о работе с портами ввода/вывода можно прочитать в главе 11.
3. Сбрасываются регистры EVENT, в котором подсчитывается количество импульсов от фотодетектора, и BATCH, в который заносится ненулевое значение в обработчике прерывания после прохода 24 банок.
4. Сброс всех битов регистра INTCON сбрасывает все флаги прерываний, которые могли бы установиться с момента сброса. Это очень важно, поскольку указанные флаги могут устанавливаться независимо от состояния соответствующих битов маски. Последующая установка бита глобального разрешения прерываний разрешает работу системы прерываний, а установка бита INTE разрешает внешние прерывания с вывода INT.
Основной задачей фоновой программы является периодическая проверка значения регистра BATCH. При старте программы он равен нулю, однако обработчик прерывания записывает в него ненулевое значение после прохода группы из 24 банок. При обнаружении ненулевого значения регистр обнуляется, на выходе RA0 устанавливается ВЫСОКИЙ уровень и вызывается подпрограмма 1-мс задержки[105], названная DELAY (см. Программу 6.1 на стр. 175). После этого цикл повторяется. Вообще говоря, фоновая программа во встраиваемых системах представляет собой именно такой