Пусть, например, необходимо с помощью микроконтроллера PIC16F84 осуществить опрос двоичного датчика и, в зависимости от его состояния, либо организовать процедуру «ожидания события», либо сформировать и выдать управляющий сигнал в виде положительного импульса заданной длительности.
Для решения данной задачи необходимо:
1) Выбрать линии (разряды) портов А и В для ввода сигналов от датчика и вывода импульсных сигналов (например, RB0 - на ввод, а RA0 - на вывод);
2) Запретить все прерывания;
3) Осуществить опрос состояния датчика;
4) Проанализировать его (например, проверив бит, сигнализирующий о состоянии датчика, то есть определить произошло в текущем цикле опроса событие в объекте управления или нет – был ли зафиксирован очередной переход из "0" в "1");
5) Организовать процедуру передачи управления на две подпрограммы в зависимости от уровня сигнала, полученного от датчика;
6) Сформировать положительный импульсный сигнал (IMPULS) заданной длительности в случае если, например, состояние датчика равно "1" (D=1). Для организации зфдержки (DELAY) можно использовать:
· одну или несколько холостых команд NOP;
· программный счетчик, работающий, например, в декрементном режиме. При этом в счетчик заносится константа, счетчик декрементируется. Обнуление счетчика является сигналом окончания временного интервала;
· внутренний таймер-счетчик (TMRO);
· внешний (дополнительный) таймер-счетчик в случае, если TMRO по какой-либо причине использовать невозможно;
7) Организовать процедуру «ожидания события», которая заключается в непрерывном опросе датчика и анализе его состояния.
На основании предыдущих рассуждений можно предложить вариант функциональной схемы и блок схемы алгоритма (БСА) рабочей программы микроконтроллерного устройства (МКУ). Функциональная схема и БСА рабочей программы МКУ приведены соответственно на рис. 7.1 и рис. 7.2. На рис 7.3 и рис. 7.4 приведены БСА подпрограмм, входящих в общий алгоритм рабочей программы. Данные подпрограммы вполне могут считаться стандартными, так как они используются достаточно часто при реализации различных функций управления и обработки данных в МКУ.
Рис. 7.1. Функциональная схема устройства
Рис. 7.3. Алгоритм подпрограммы
IMPLUS
Рис. 7.2. Общий алгоритм
программы
Рис. 7.4. Алгоритм подпрограммы
DELAY (Вариант 2)
Прежде чем приступить к написанию исходного текста рабочей програмы необходимо окончательно определить все ресурсы микроконтроллера и переменные, которые понадобятся для решения поставленной задачи, а также осуществить распределение памяти данных (ПД). То есть, закрепить за указанными ресурсами и переменными определенные адреса в адресном пространстве ПД. Это распределение ПД отражается в секции заголовка рабочей программы микроконтроллера.
На основании блок-схем алгоритмов и распределения памяти данных можно приступить к написанию исходного текста рабочей программы. Вариант текста программы, которая позволяет реализовать все функции, заложенные в исходном техническом задании, приведен ниже:
; Текст программы
LIST p=16C84, r =HEX
Title ‘Z1’
; Секция заголовка
; Описание специальных регистров
TRISA EQU 85H ; Регистр управления портом А
TRISB EQU 86H ; Регистр управления портом B
INTCON EQU 0BH ; Регистр управления прерыва-
; ниями
; Описание регистров ввода/вывода
PORTA EQU 05H
PORTB EQU 06H
; Описание ячеек ОЗУ
CTD EQU 0DH ; Счетчик цикла в подпрограмме
; DELAY
; Рабочая секция
; Точка входа в программу после RESET
ORG 0
GOTO INMK
ORG 100H
; Процедура инициализации МК
; Запрет прерываний
INMK BCF INTCON, 7 ; Сброс 7-го бита в регистре
; INTCON.
; Загрузка регистра управления
; портом В
MOVLW B’1111 1111’ ; Переслать константу в регистр TRIS 6 ; W и назначить все линии порта
; В на ввод.
; Загрузка регистра управления
; портом A
MOVLW B’0000 0000’ ; Переслать константу в регистр
TRIS 5 ; W и назначить все линии порта
; А на вывод
BCF PORTA, 0 ; Сброс 0-го бита в регистре
; порта А
; Опрос состояния датчика и процедура "ожидания события"
M1 BTFSS PORTB, 0 ; Анализ 0-го бита в регистре
; порта В. Если датчик равен ²1²,
; то пропустить следующую
; команду, иначе-ждать
GOTO М1
; Выдача импульса заданной длительности (IMPULS)
BSF PORTA, 0
; Задержка (DELAY)
MOVLW B’0000 1111’ ; Загрузка счетчика задержки
MOVWF CTD
; Цикл задержки
M2 DECFSZ CTD ; Декремент CTD, пропустить
; команду, если 0 (если регистр
; CTD обнулился)
GOTO M2
; Прекратить выдачу сигнала
BCF PORTA, 0
GOTO M1