Программный реверсивный счетчик с ручной начальной

загрузкой (сложность 4 балла).

При начальном старте исходное состояние программного счетчика равно нулю и выполняется опрос состояния кнопки SV1. При нажатии кнопки SV1 осуществляется загрузка программного счетчика с определенной частотой Fзагрузки до значения N. Состояние счетчика индицируется двух разрядным цифровым табло. При значении N кнопка SV1 блокируется, и начинается опрос кнопки SV2, каждое нажатие на которую уменьшает состояние счетчика на единицу и формирует время задержки tзад. При достижении значения 00 осуществляется опрос кнопки SV1, а SV2 блокирована. После этого процесс можно повторить (занесение числа N, и т.д). В табл.8 представлены варианты заданий данного типа.

Таблица 8

Вариант Порт для подключения кнопки SV1 Порт для подключения кнопки SV2 N Частота загрузки Fзагрузки, Гц tзад, с
P3 P2 0,22
P2 P1 0,35
P1 P0 0,12
P0 P3 0,18

ОБЩИЕ ПРИНЦИПЫ РАЗРАБОТКИ ПРОГРАММНОГО

ОБЕСПЕЧЕНИЯ

Для получения ассемблерного текста искомой программы рекомендуется выполнить ряд последовательных действий [1]:

1. подробное описание задачи;

2. анализ задачи;

3. инженерную интерпретацию поставленной задачи с привлечением того или иного способа формализации (например граф автомата);

4. разработку общей блок-схемы алгоритма (БСА) работы микроконтроллера;

5. разработку детализированных БСА отдельных процедур, выделенных на основе модульного принципа составления программ;

6. детальную проработку интерфейса контроллера и коррекция общей и детализированных БСА;

7. распределение рабочих регистров и памяти микроконтроллера;

8. формирование текста исходной программы.

В результате работы по трем первым пунктам приведенного перечня получают так называемую функциональную спецификацию прикладной программы микроконтроллера, в которой основное внимание уделяется детализации способов формирования входной и выходной информации.

На языке схем алгоритмов разработчик описывает метод, выбранный для решения поставленной задачи. Довольно часто бывает, что одна и та же задача может быть решена различными методами. Способ решения задачи, выбранной на этапе ее инженерной интерпретации, на основе которого формируется БСА, определяет не только качество разрабатываемой прикладной программы, но и качественные показатели конечного изделия.

В основу разработки БСА положена процедура модульного проектирования, которая традиционно используется разработчиками аппаратных средств. Отличие состоит в том, что при разработке программного обеспечения вместо интегральных схем (логических схем, триггеров, счетчиков и др.) разработчик оперирует командами, подпрограммами, таблицами и другими программными объектами из арсенала средств обработки данных.

Так как алгоритм есть точно определенная процедура, предписывающая контроллеру однозначно определенные действия по преобразованию исходных данных в обработанные выходные данные, то разработка БСА требует предельной точности и однозначности используемой атрибутики: символических имен переменных, констант подпрограмм, символических адресов таблиц, портов ввода вывода и т. п. Основное внимание при разработке БСА следует уделить тому разделу функциональной спецификации прикладной программы, в котором приводится описание аппаратуры сопряжения микроконтроллера с объектом управления. Это описание для успешной разработки программного обеспечения должно быть детализировано вплоть до электрических и временных характеристик каждого входного и выходного сигнала.

Для успешной разработки программного обеспечения необходимо использовать метод декомпозиции, при котором вся задача последовательно разделяется на меньшие функциональные модули, каждый из которых можно анализировать, разрабатывать и отлаживать отдельно от других. При выполнении прикладной программы в микроконтроллере управление передается от одного функционального модуля к другому. Схема связности этих функциональных модулей, каждый из которых реализует некоторую процедуру, образует общую БСА прикладной программы. Это разделение задачи на модули и субмодули выполняется последовательно до такого уровня, когда разработка БСА модуля становится простым и понятным делом.

Структурное программирование есть процесс построения прикладной программы из строгого набора программных модулей, каждый из которых реализует определенную процедуру обработки данных. Программные модули должны иметь только одну точку входа и одну точку выхода. Только в этом случае отдельные модули можно разрабатывать и отлаживать независимо, а затем объединять в законченную прикладную программу с минимальными проблемами их взаимосвязей. Источником подавляющего большинства ошибок программирования является использование модулей, имеющих один вход и несколько выходов. При необходимости организации ветвлений в программе декомпозицию задачи выполняют таким образом, чтобы каждый функциональный модуль имел только один вход и один выход. Для этого условные операторы (имеющие два выхода) включают внутрь модуля, объединяя их с операторами обработки.

Разработка БСА функционального модуля программы имеет ярко выраженный итеративный характер, т.е. требует многократных проб, прежде чем возникает уверенность, что алгоритм реализации процедуры правильный. Вне зависимости от функционального назначения процедуры при разработке ее БСА необходимо придерживаться следующей очередности работы:

1. Определить, что должен делать модуль. Это уже было сделано при разработке общей БСА, но теперь разработчик имеет дело с фрагментом прикладной программы, и, следовательно, может потребоваться уточнение целевого назначения процедуры.

2. Определить способы получения модулем исходных данных (от датчиков через порты ввода, или из таблиц в памяти, или через рабочие регистры). Для реализации ввода исходных данных в модуль в его БСА необходимо включить соответствующие операторы.

3. Определить необходимость какой-либо предварительной обработки введенных исходных данных (маскирование, сдвиг, масштабирование, перекодировка ). Для выполнения этой процедуры в состав БСА включаются соответствующие операторы.

4. Определить способ преобразования входных данных в требуемые выходные. Используя операторы процедур и условные операторы принятия решения, отобразить на языке БСА выбранный метод обработки исходных данных.

5. Определить способы выдачи из модуля обработанных данных (передача в память, или в вызывающую программу, или в порты вывода информации). Необходимые действия отобразить в БСА.

6. Определить необходимость какой-либо постобработки выводимых данных (изменение формата, перекодировка, масштабирование, маскирование). Ввести в БСА операторы подготовки данных для вывода из модуля.

7. Вернуться к п. 1 настоящего перечня работ и проанализировать полученный результат. Выполнить итеративную корректировку БСА с целью сделать ее простой, логичной, стройной и обладающей четким графическим образом.

8. Проверить работоспособность алгоритма на бумаге путем подстановки в него действительных данных. Убедиться в его сходимости и результативности.

9. Рассмотреть предельные случаи и попытаться определить граничные значения информационных объектов, с которыми оперирует алгоритм, за пределами которых он теряет свойства конечности, сходимости или результативности. Особое внимание при этом следует уделить анализу возможных ситуаций переполнения разрядной сетки микроконтроллера, изменения знака результата операции, деление на переменную, которая может принять нулевое значение.

10. Провести мысленный эксперимент по определению работоспособности алгоритма в реальном масштабе времени, когда стохастические процессы, происходящие в объекте управления, могут оказать влияние на работу алгоритма. При этом тщательному анализу следует подвергнуть реакцию алгоритма на возможные прерывания с целью определения критических операторов, которые необходимо защитить от прерываний. Кроме этого, в ходе этого мысленного эксперимента следует проанализировать логику алгоритма с целью определения последовательностей операторов, при выполнении которых микроконтроллер может не «заметить» кратковременных событий в объекте управления. Прим обнаружении таких ситуаций в логику БСА следует внести коррективы.

Практика разработки программного обеспечения для микроконтроллера показала, что последовательное использование описанной поэтапной процедуры проектирования алгоритмов, составляющей основу метода структурного программирования, позволяет получать работоспособные прикладные программы.

Преобразование разработанной БСА в исходный текст программы - сравнительно простая процедура. Но прежде чем приступить к написанию программы необходимо специфицировать память и выбрать язык программирования.

Спецификация памяти (и рабочих регистров) заключается в определении адреса первой команды прикладной программы, действительных начальных адресов стека, таблиц данных, буферных зон передачи параметров между процедурами, подпрограммы обслуживания прерываний и т. д. При этом следует помнить, что в микроконтроллере память программ и память данных физически и логически разделены.

Подавляющее большинство прикладных задач управления объектами вследствие того, что они должны решаться в реальном времени, предъявляют столь высокие требования по быстродействию, что для их решения основным языковым средством еще долгие годы будет оставаться язык ассемблера.

Наши рекомендации