|
Микроконтроллеры 2
Статьи публикуются по мере поступления. Для упорядоченного тематического
поиска воспользуйтесь блоком "Карта сайта"
Чтобы первое собранное устройство было наглядным, в его состав включены два индикатора и две кнопки (рис.2). Исходные донные алгоритма работы: индикатор HL1 должен светиться при нажатой и не светиться при отпущенной кнопке SB1, индикатор HL2, наоборот, должен светиться при отпущенной и не светиться при нажатой кнопке SB2. Кварцевый резонатор ZQ1 и конденсаторы С1-С4 включены стандартно [2]. Входные линии Р3.4, Р3.5 нарисованы с левой стороны схемы, кок и положено для входов. Они подключены к кнопкам SB1, SB2 без нагрузочных резисторов, функции которых выполняют полевые структуры внутри МК DD1. Выходные линии Р1.3, Р3.7 нарисованы с правой стороны схемы, как выходы. К ним подключены светодиоды HL1, HL2 и токоограничивающие резисторы Rl, R2. Можно ли было в качестве входных и выходных использовать другие линии портов МК? Для выходов - "да", для входов - "не совсем", поскольку линии Р1.0, Р1.1 имеют открытый сток и требуют внешних нагрузочных резисторов [2]. Питание устройства производится от сетевого стабилизатора напряжением 5 В или от батарейки 4,5 В. Ток потребления 7...25 мА. Контроллер DD1 должен устанавливаться в 20-выводную панель. Все устройство собирается на макетной плате.Первая Си-программа. После того, как нарисована электрическая схема, выбраны линии портов для входов и выходов, определен алгоритм роботы, можно приступить к составлению программы функционирования МК. Различают три типа архитектуры Си-программ, использующие: системные функции;системные и внутренние функции;системные, внутренние и внешние функции. Первый тип относится к простым случаям так называемого последовательного программирования операций. Второй тип характерен для несложных программ, использующих процедуры повторяющихся циклов. Третий тип позволяет создавать большие па объему и хорошо структурированные программы. Теоретически любую Си-программу можно построить по любой из указанных схем, но для пробного устройства проще всего использовать архитектуру первого типа (рис.4). Каждая программа имеет заголовок, содержащий справочную и вспомогательную информацию. Далее расположено "тело" программы, начинающееся с выполнения главной системной функции "main" (англ. "основной, главный"). Это название будет одинаковым для всех Си-программ. Понятие "функция" в языке Си эквивалентно понятию "подпрограмма" в Basic или "процедура" в Pascal. Различают системные, внутренние и внешние функции. В частности, функция "main" является главной среди системных. Названия всех системных функций определены стандартом ANSI языка Си. Их нельзя менять по своему усмотрению, в отличие от названий внутренних и внешних функций, которые составляет сам пользователь. Начало функции "mаin" обозначается прямыми "{", а окончание - обратными "}" фигурными скобками. Внутри нее располагаются операторы, каждый из которых заканчивается точкой с запятой. Легко провести аналогию с грамматическими предложениями, которые следуют друг за другом, но разделяются точками. Операторы выполняются последовательно во времени. Внутри операторов могут быть вызовы функций, которые содержат операторы и т.д. В листинге 1 приведена управляющая Си-программа для МК пробного устройства. Изучение правил языка Си будет происходить на ходу, "разведкой боем", ведь журнальное место не безгранично. Первые две строки программы относятся к заголовку, остальные - к "телу" программы. Для удобства все строки листинга про-нумерованы цифрами в правой части текста. Строка 1 по традиции начинается с комментариев, которые ограничиваются слева символами "/*", а справа - их зеркальным отражением "*/". Все, что внутри, - это произвольная информация, которую пишет сам программист, чтобы через месяц-другой вспомнить, о чем, собственно, шла речь. Наличие комментариев ни но один байт не увеличивает длину прошивки МК, так что рекомендуется писать их поподробнее и побольше. Комментарии могут занимать несколько строчек подряд или находиться на одной линии с текстом программы. Строка 2 подключает к компилятору системную библиотеку "icc8051". Без нее нельзя будет вызвать ни одну из системных функций. Эта строка одинакова во всех приводимых далее программах. Строка 3 пустая, чтобы визуально отделить "заголовок" от "тела" программы. По правде говоря, ее наличие не обязательно. Более тога, вместо одной мажно вставить и две, и три пустые строчки. Весь смысл заключается в улучшении читаемости текста программы. На величину кодов прошивки это не влияет. Строка 4 содержит стандартный вызов функции "main". Два слова "void" (англ. "пустой, свободный") означают, что программа выполняется автономно. В языке Си принято все функции писать прописными (а не заглавными) латинскими буквами. Строка 5 отведена под одну-единственную открывающую фигурную скобку. Такой чести она удостоена не случайно.
Купить
Программаторы, средства разработки и отладки для DSP,
средства разработки и отладки для ПЛИС-ПАИС
Компилятор языка Си при ее выполнении производит начальную инициализацию регистров МК, установку стека, распределение адресного пространства. Механику этого сложного процесса изучать не надо (в отличие от программистов на Ассемблере). Для пользователя главное усвоить две вещи: при инициализации программы запрещаются все прерывания и во все 15 линий портов Р1 и РЗ заносятся лог.*Г, то есть порты PI, P3 настраиваются на ввод информации. Строка 6 содержит первый исполняемый оператор программы. Он состоит из вызова системной функции "while" (англ. "до тех пор, пока"). Чтобы отличить функцию от обычного оператора, за ней следуют круглые скобки. В данном случае в скобках присутствует условие проверки - цифра "Г. Поскольку в алгебре логики этой цифре соответствует понятие "истина", то проверяемое условие никогда не будет ложным. Расшифровка оператора: "До тех пор, пока выражение в скобках функции "while" будет истинным, выполнять строки 7-10". Налицо бесконечный цикл выполнения операторов. Это стандартный прием в программировании МК, который надо запомнить. Он позволяет программе постоянно быть в работе и выполнять действия. Почему функция "while" начинается не в первом слево столбце программы (как "main"), а в третьем? Это условность, которая облегчает чтение листинга. Существует этикет языка Си, согласно которому в первом столбце любой функции должны располагаться только две фигурные скобки - одна открывающая и одна закрывающая, причем промежуток между ними должен оставаться пустым. Строка 7 содержит открывающую фигурную скобку ровно под началом функции "while" в строке 6. Такое форматирование текста повышает читаемость программы, поскольку легко видеть, к какой именно функции относится конкретная скобка. Кроме того, все фигурные скобки располагаются в столбцах с нечетными номерами, 1, 3, 5, 7 и т.д., что легко запомнить. Существуют и другие схемы размещения текста, но каждый программист волен выбирать по своему вкусу. Строка 8 представляет собой оператор присваивания, где "Р1.3" - имя линии 3 порта Р1; "=" - знак записи данных; "Р3.4" - имя линии 4 парта РЗ. К первой из линий подключен индикатор HL1, ко второй - кнопка SB1. Расшифровка оператора: "Прочитать логическое состояние линии Р3.4 и занести точно такое же состояние в линию Р1.3". Иными словами, при нажатии кнопки SB1 происходит засветка индикатора HL1, при отжатии кнопки - его гашение. В операторе присваивания выходная линия должна обязательно указываться слева, а входная - справа. Название линий должно начинаться с заглавной латинской буквы "Р". Имена линий в точности совпадают с приводимыми на схеме для АТ89С2051. Оператор присваивания начинается в пятом столбце слева, что подчеркивает его принадлежность к функции "while" в строке 6. Внимательный читатель вправе задать вопрос, почему в конце строки 8 поставлена точка с запятой, а в строке 6 ее нет? Ответ - потому, что в строке 6 знак ";" заменяет фигурная скобка в строке 7. Строка 9 аналогична строке 8, но для линий Р3.5 (кнопка SB2) и Р3.7 (индикатор HL2). Выражение "Р3.5^ 1 инвертирует прочитанные данные с пинии Р3.5, так как знак "^" обозначает логическую операцию "сумма по модулю 2". При нажатой кнопке SB2 (лог."0") индикатор HL2 будет погашен (лог." Г), и наоборот. Строка 10 содержит закрывающую фигурную скобку. Если мысленно провести вертикальную линию, то она укажет прямо на открывающую скобку строки 7. При достижении строки 10 компилятор перейдет к строке 6, затем убедится, что условие проверки в скобках функции "while" все так же осталось истинным, и будет выполнять строки 7-10 в бесконечном цикле. Скорость повторения циклов в данной программе около ста тысяч раз в секунду. Строка 11 означает окончание листинга и завершение функции "main".
Купить
Программаторы, средства разработки и отладки для DSP,
средства разработки и отладки для ПЛИС-ПАИС
Последовательность программирования МК
Перед началом работы необходимо "скачать" с сайта журнала "Радоаматор" в компьютер архивный файл Си-компилятора "IAR4.zip". Создать на любом из дисков новую директорию с названием, например, IAR. Распаковать в нее архив компилятора, при этом должны появиться 6 папок: Bin, Doc, Include, Lib, Source, Startup. Набрать листинг 1 в любом текстовом редакторе, DOS или Windows значения не имеет. Если пользоваться редакторами Microsoft Блокнот или Microsoft Ward, та следует установить шрифт Courier, чтобы каждая буква, цифра и символ занимали одинаковое по ширине место. Кроме того, включить флажок "Непечатаемые символы", чтобы каждый пробел в тексте был выделен точкой. Это поможет визуально проконтролировать правильность форматирования столбцов. Сохранить полученный текст с опцией "Текст DOS с разбиением на строки" в виде файла "mk3.txt", затем переименовать eго в "ткЗ.с"
Создать новый текстовый файл "mk3.bat" согласно листингу 2, сохранить его в папке "Bin" компилятора, а затем запустить на выполнение. Если в листингах 1 и 2 не было допущено ошибок, то на экране монитора должны появиться сообщения, как на рис.5. Если будут обнаружены ошибки, то их можно просмотреть во вновь созданном файле "mk3.lst". Попутно в ту же директорию будет записан файл с НЕХ-кодами прошивки МК под названием "mk3.hex" (листинг 3). Теперь, имея НЕХ-файл и пользуясь методикой [1], можно с помощью программатора занести коды прошивки в ПЗУ МК. К примеру, пакетный bat-файл, который используется при работе с программатором Blowlt-2, должен выглядеть следующим образом:
echo off
ру2051 mk3.hex
startlpt 1
Запрограммированный МК устанавливают в панель на плате пробного устройства. При первом включении питания и отжатых кнопках SB1, SB2 должен засветиться индикатор HL2. Его можно рассматривать как своеобразный индикатор подачи питания. Далее нажимают кнопки и убеждаются, что логика роботы устройства соответствует исходным данным на разработку.
Игровой автомат "Кто быстрее?"
Во многих радиокружках с подобного прибора начинают знакомить, учеников с радиоделом. В качестве элементной базы обычно используют реле, транзисторы, тиратроны, логические микросхемы. Наш прибор, естественно, будет выполнен на МК. Исходные данные для разработки. В игре участвуют 3 человека: судья и два игрока. У каждого из них имеется своя кнопка и светодиодный индикатор. В начале игры судья дает "отмашку времени", нажимая кнопку "Пуск", в результате чего зажигается стартовый индикатор. Теперь очередь за игроками: кто из них первый нажмет свою кнопку, тот и выиграл. Результат определяется по светодиодам. При равенстве быстроты реакции должна фиксироваться ничья. Кроме того, необходима предусмотреть индикацию фальстарта, когда один из игроков нажимает кнопку до появления судейского светового сигнала. Данный игровой автомат по принципу функционирования является измерителем относительной реакции человека. "Относительной" потому, что сравнивается быстрота нажатия кнопки одним играющим, по отношению к другому.
После изучения исходных данных становится понятным, что прибор должен содержать три кнопки на входе и три светодиода на выходе (рис.1). Кнопки SB1, SB2 находятся у игроков,' кнопка SB3 - у судьи. В табл.1 показаны логические состояния индикаторов HL1-HL3 в зависимости от игровых ситуаций. Кварцевый резонатор ZQ1, конденсаторы C1-G4 включены согласно типовой схеме. Кнопка SB3 одновременно с функцией сброса играет роль "судейского стартового пистолета". Входные линии портов Р3.2-Р3.5 нарисованы с левой, а выходные линии РЗ.О, Р3.1, Р3.7 - с правой стороны МК, как принято в цифровых схемах. Номера линий портов выбраны произвольно. В случае необходимости их можно заменить другими сделав соответствующие поправки в программе. Структурная схема алгоритма работы. Перед составлением программы обычно рекомендуют нарисовать схему алгоритма ее функционирования Опыт подсказывает, что делают это далеко не все и не всегда. Кто-то предпочитает держать логику работы в уме, кому-то мешает природная матушка лень, для кого-то графические схемы кажутся чересчур сложными, а кто-то вообще считает, что лучше составлять схему алгоритма не до, а после отладки программы. Как бы там ни было, на один раз надо хорошо разобраться в методике составления алгоритма а применять ли его на практике - жизнь сама подскажет.
На рис.2 показана структурная схема алгоритма функционирования игры "Кто быстрее?". Раньше подобные рисунки называли блок-схемами. Каждая новая игра начинается со сброса, т.е. с нажатия и отпускания судейской кнопки SB3. В блоке инициализации производятся начальные настройки МК. Далее следует проверка на фальстарт: если одна из кнопок игроков была нажата при не-'светящемся индикаторе "Пуск", то происходит зацикливание. Если фальстарт не обнаружен, то загорается индикатор "Пуск" и циклически проверяется состояние кнопок SB1, ЗВ2" (имеются ли*'Дули"- на линиях РЗ 2, Р3.4). При первом нажатии любой из КНОПОК производится определение, какой именно, и засвечивается индикатор HL1 или HL2 Если кнопки нажаты одновременно, то светятся оба индикатора. Завершается программа бесконечным циклам, чтобы ни один из игроков не смог изменить в свою пользу результат соревнования. Си-программа игры "Кто быстрее. Судя по несложному алгоритму работы, для реализации программы можно использовать архитектуру первого типа, т.е. с системными, но без внутренних и внешних функций (листинг 1).
Строки 1-5 особенностей не имеют, их назначение было рассмотрена в "Шаге 3". Для пользователя важно знать, что при инициализации все линии портов Р1, РЗ настраиваются на ввод информации и в них заносятся лог."1". Строка 6 содержит новшество - оператор описания типа переменной "а Переменную можно образно представить в виде шкатулки, в данном случае с надписью "а". В эту шкатулку всегда можно положить некоторое количество предметов, а затем добавить или удалить их, т.е. увеличить или уменьшить значение переменной "а". В зависимости от числа помещаемых предметов, размер "шкатулки" может быть меньше или больше В табл.2 указаны пределы числовых значений, принятые в компиляторе "icc805l". Как видно, габаритные размеры "шкатулки' - типоразмера "unsigned char" позволяют положить в нее 255 предметов. Вместе с нулевым значением ("пустая шкатулка") будет 256 состояний или 256 байтов. Если бы в сроке 6 было указано "unsigned long а", та их максимальное количество составило бы 4,2 млрд.
Какую размерность указывать для конкретной переменной, определяет программист. В нашем случае в переменной "а" хранятся результаты опроса состояния порта Р1, следовательно, числа могут быть в диапазоне OxOO-OxFF. Чем шире диапазон чисел у переменной, тем больше размер программы и меньше скорость ее выполнения. С другой стороны, если взять слишком малый диапазон, то при его превышении данные теряются (предметы высыпаются из "шкатулки"). Считается, чта система команд МК семейства MCS-51 лучше приспособлена для работы с положительными числами. Следовательно для целочисленных переменных рекомендуется использовать типы: bit, unsigned char, unsigned int, unsigned long, для дробных переменных - float. Строка 7 отделяет блок объявления переменных от основной программы. Она необходима для повышения читаемости текста программы, хотя может и отсутствовать. Строка 8 содержит проверку нажатия кнопок SB I, SB2 при фальстарте. Системная функция "if" (англ. "если") определяет истинность двух условий: во-первых, имеется ли лог."О" на линии Р3.2, во-вторых, имеется ли лог."О" на линии Р3.4. Символы "Р3.2" и "Р3.4" взяты из названий сигналов на выводах 6 и 8 микросхемы АТ89С2051, "==" - знак чтения данных с проверкой равенства (табл.З); "||" - знак логической операции "ИЛИ" над выражениями, заключенными в круглые скобки слева и справа от него. Расшифровка оператора: "Если при чтении данных из линий Р3.2 или Р3.4 в какой-то из них, или в обеих сразу, будет обнаружен лог "О" вместо лог."1, то выполнять строки 9-13, иначе,.пропустить их и перейти на выполнение строки 14". Другими словами, если хоть одна из КНОПОК SB1, SB2 нажата при фальстарте (Р3.2=0 или Р3.4=0), то выполнять строки 9-13, в противном случае сразу после строки 8 перейти к строке 14.
Небольшая тонкость. Линии РЗ.З Р3.5 в проверках не участвуют, хотя они и подключены параллельно РЗ 2 Р3.4.
Купить
Программаторы, средства разработки и отладки для DSP,
средства разработки и отладки для ПЛИС-ПАИС
Их назначение - дополнительная резистивная нагрузка для увеличения тока, протекающего через кнопки SB1, SB2. Строки 9, 13 содержат открывающую и закрывающую фигурные скобки ровно под началом функции "if". Наличие фигурных скобок означает, что в конце функции "if" в строке 8 не надо ставить точку с запятой. Строка 10- оператор присваивания, где "РЗ. 1" - имя линии 1 порта РЗ; "=" - знак записи данных; "0" - символ лог."0". Расшифровка оператора: "Установит на линии Р3.1 (вывод 3 микросхемы АТ89С2051) уровень лог."0"". Физически происходит засветка индикатора HL1 первого игрока. Строка 11 аналогична строке 10, но для линии Р3.7. Теперь к светящемуся индикатору HL1 добавляется светящийся индикатор HL2. Строка 12 позволяет зациклить программу при фальстарте. Оператор содержит системную функцию "while" (англ. "до тех пор, пока") и в круглых скобках число "1", которое эквивалентно логической "истине" Знак ";" в конце функции заставляет программу бесконечное число раз выполнять строку 12. Выйти из данного состояния можно только через общий сброс МК кнопкой SB3 или по выключению питания. Полезный для запоминания прием. Строка 14 аналогично строке 10, но для линии Р3.0 с засветкой индикатора HL3 "Пуск". Строка 15 содержит цикл ожидания с проверкой нажатия кнопок SB1, SB2. Это важный момент, в котором необходимо хорошо разобраться. Функция "while" имеет три вложенные друг в друга пары круглых скобок. Самые внешние скобки являются обязательными для любой функции. Остаются еще две пары скобок, определяющие порядок логических действий. Как и в школьной алгебре, выполнение операций начинается слева направо с самих внутренних скобок, те. (РЗ & 0x14), где "РЗ" - имя порта РЗ; "&" - знак логического "И" (табл.4), "0x14" - байт данных. Из порта РЗ читается байт данных, который поразрядно умножается на число 0x14.
В табл.5 для ориентира показана соответствие линий портов и шестнадцатеричных чисел. Из нее следует, что коду 0x14 соответствует лог."1 в линиях Р3.2, Р3.4 и лог."0" в остальных линиях порта РЗ. Результат операции (РЗ & 0x14) равен: 0x14 - кнопки не нажаты; 0x10 - нажата только кнопка SB1; 0x04 - нажата только кнопка SB2; 0x00 - нажаты обе кнопки. Далее выполняются действия во второй паре скобок (а = (РЗ & 0x14)), т.е. переменной "а" присваивается значение или 0x014, или 0x10, или 0x04, или 0x00. После этого переменная "а" сравнивается (знак "==") с числам 0x14 в правой стороне формулы. Если результат сравнения "истина", то вновь повторяется функция "while" в строке 15, осуществляется еще одно чтение донных из порта РЗ и т.д. Полная расшифровка оператора: "Прочитать байт из порта РЗ, выделить в нем биты 2, 4 сохранить результат в переменной "а". Если он равен 0x14, то вновь выполнить строку 15, иначе перейти к строке 16". Строка 16 сравнивает значение переменной "а с кодом 0x10. Если результат "истина" ("а" ровно 0x10), то выполняются строки 17-19, затем сразу переход но строку 31. Если условие "ложь" ("а" не равно 0x10), то строки 17-19 пропускаются и выполняется строка 20. Такой порядок действий обусловлен связкой функций "if - else", о чем пойдет речь дольше. Строка 18 - засветка индикатора HL1 аналогично строке 10.
Строка 20- эта начало системной функции "else" (с англ. "иначе"). Если оно встречается в тексте программы, значит, в том же столбце наверху находится работающая с ней в паре ближайшая функция "if". Например, в столбце 3 листинга 1 имеется две функции "if" в строках 8 и 16 но с "else" работает та, что в строке 16. На рис.3,а, б показан пример, поясняющий логику работы функции "if" и связки "if - else". Разница ощутимая. Строки 22-29 - еще одна связка "if - else". Расшифровка "Если значение переменной "а" равно 0x04, то выпопнить строки 23-25, затем сразу перейти на строку 30, иначе выполнить строки 26-29". Строка 24 - засветка индикатора HL2 аналогично строке 10. Строка 28 - одновременная засветка индикаторов HL1-HL3. Здесь "РЗ" - имя порта; "=" - знак записи данных; "0х7С" - записываемое число. Если обратиться к табл.5, то получается, что в линиях 0, 1, 7 порта РЗ будут установлены лог."0", в остальных линиях лог."1", следовательно, будут засвечены индикаторы HL1-HL3. Строка 31 - бесконечное выполнение функции "while" аналогична строке 12. Это необходимо для визуального просмотра результата соревнования. Строка 32 означает окончание листинга и завершение функции "main" . Язык программирования Си сравнивают с "народным автомобилем": скромный, быстрый, удобный. Его ОСНОВНАЯ философия заключается в толерантности к построению программ и выбору алгоритмов. Никто не осудит человека, который составит "прямую, как трубопровод", программу с использованием архитектуры первого типа (см. "Шаг 3"). Лишь бы быстродействия МК хватило, да прошивка кодов поместилась в память. Однако рано или поздно придет понимание того, что функциональные возможности МК не безграничны. Проблема сокращения объема программы заставит перейти к более экономичной архитектуре построения алгоритмов.
С.М. Рюмик, г. Чернигов