top.mail.ru Описание Flowcode

Вход



Код защиты Введите символы с картинки. (Щелкни картинку чтобы обновить)
Введите символы с картинки.
 * 

Описание Flowcode PDF Печать E-mail
Владимир Гололобов.

http://vgololobov.narod.ru/

Микроконтроллер в программе FlowCode (Windows)

Программа FlowCode существует в двух версиях — для контроллеров AVR и PIC. Удобно, что можно импортировать решения из одной версии в другую. Для начинающих удобна простота отладки, поскольку есть много внешних элементов устройств, обычно используемых вместе с микроконтроллерами.

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

Первая левая инструментальная панель — это панель команд.

Рис. 2.1. Инструментальная панель команд

Перечень представленных команд (слева-направо на рисунке, сверху-вниз при запуске):

Input (ввод), Output (вывод), Delay (пауза), Decision (ветвление), Connection Point (две точки соединения), Loop (цикл), Macro (макрос), Component Macro (макрос компонента, добавленного в программу), Calculation (вычисление), String Manipulation (строковые операции), Interrupt (прерывание), C Code (блок кода на языке Си), Comment (комментарий).

Вторая инструментальная панель для добавочных внешних элементов.

Рис. 2.2. Инструментальная панель добавочных элементов

Компоненты (слева-направо):

LEDs (светодиоды), Switches (переключатели), LCDDisplay (жидкокристаллический дисплей), ADC (АЦП, если есть порт АЦП), LED7Seg1 (семисегментный индикатор), LED7Seg4 (блок из 4х семисегментных индикаторов), Buggy (компонент игрушки), далее несколько стандартных интерфейсов TCP_IP, Bluetooth, RS232, IrDA, AddDefines (добавить определения), LinMaster (ведущий в локальной сети), Custom (заказной компонент), EEPROM (перепрограммируемая память), Alarm (охранное устройство), Thermometer (термометр), PWM (широтно-импульсный модулятор), SPI (последовательный внешний интерфейс), WebServer (web-сервер), CAN (сеть абонентского доступа), KeyPad (клавиатура), LinSlave (ведомый в локальной сети), FormulaFlowCode (компонент игры), I2C (шина связи между ИС).

Работа с элементами программы в FlowCode схожа с аналогичной в KTechlab. Если кого-то интересует более подробное описание (все-таки, чтобы не повторять полностью), то можно почитать help или те истории, относящиеся к программе, что есть на моем сайте.

Шарик пинг-понга перелетел на половину программы FlowCode, когда программа для микроконтроллера должна была генерировать меандр с частотой 0.5 Гц.

Такая программа в среде разработки FlowCode должна иметь следующий вид:

Рис. 2.3. Вид предыдущей программы микроконтроллера в FlowCode

Программа полностью построена из элементов Output (выход), Delay (пауза) и Loop (цикл). Цикл, в отличие от KTechlab, существует в единственном виде, но можно изменить его свойства, превратив в цикл for. Так же в свойствах Output задано управление единственным выводом RA0 (A0 на рисунке). Во всем остальном программы, практически, одинаковы. Но в отношении отладки с FlowCode проще. Достаточно добавить светодиоды с панели добавочных элементов, чтобы можно было запустить проверку программы.

Рис. 2.4. Первая проверка начального этапа программы

Очень, конечно, хочется увидеть это все в «живом» виде. У меня даже есть макетная плата с панелькой для микросхемы, а к некоторым выводам подключены светодиоды... Хочется-перехочется. Следующий этап работы выглядит в данный момент так:


  • Ввести две кнопки управления частотой.
  • Попробовать действие кнопок при удвоении частоты.

Ввести две кнопки для управления, в отношении программы, означает добавить два программных элемента ввода (Input). Труда это не составит, взял и перетащил с инструментальной панели элементов программы. Так, вперед!

Рис. 2.5. Начало следующего этапа создания программы

Что такое я сделал, обидев программу FlowCode?

Сознаюсь, мне пришло в голову, что (я все-таки «железячник») вход на схемах обычно слева, а выход справа. К микросхеме контроллера это не имеет отношения, но привычнее будет, если входы будут привязаны к порту А, а выходы к порту B. Я переобозначил два элемента программы Output: без проблем, вызываем двойным щелчком по элементу программы диалоговое окно свойств, в котором меняем порт А на B.

Затем перетащил два программных элемента ввода, расположив их перед началом цикла (Loop), и попробовал задать свойства первого Input (тот же двойной щелчок), привязав его к единственному биту (выводу микросхемы) А0, второй будет А1. Чем, похоже, и обидел программу, которая сообщила, что операции ввода должны быть сделаны для переменных — по умолчанию стоит значение «0». Программа предлагает выбрать существующую переменную или создать новую, используя клавишу Variables.

Нажатие указанной клавиши открывает диалоговое окно создания переменных, в котором есть клавиша Add New Variable..., открывающая следующее окно, где собственно и создается новая переменная, для которой я приготовил имя «more» — больше. Тип переменной Byte меня вполне устроит.

Рис. 2.6. Создание новой переменной в FlowCode

Как часто бывает в программах, это не единственный путь создания переменных. В основном меню Edit-Variables... можно открыть диалоговое окно переменных, где и создать,

точно так же, нужные переменные.Клавиша ОК, и попадаем в предыдущий диалог.

Рис. 2.7. Диалоговое окно работы с переменными

Клавиша Use Variable, и мы возвращаемся к началу путешествия, где, помирившись с программой, можем нажать ОК. Для второго элемента ввода, как видно на рисунке выше, я выбрал переменную less (меньше). И пора, думаю, показать, во что я превратил программу.

Рис. 2.8. Начало работы над программой на втором этапе

Почему я не добавил элементы ввода в цикл? А при перетаскивании этих элементов рука направилась именно внутрь цикла, поскольку опрашивать кнопки управления тоже нужно в бесконечном цикле, но пока я перетаскивал, у меня мелькнула мысль, что операции внутри цикла, возможно, придется переписывать несколько раз для каждого измененного значения частоты. Так ли это, покажет время, но ввод я пока вынес за пределы цикла.

Чтобы не переписывать многократно одинаковые фрагменты программы, программисты давно придумали такие удобные средства, как подпрограмма, или процедура, а в данном случае программный элемент Macro.

Перетаскиваем его в программу ниже элементов Input, он вписывается в программу, как Call Macro (вызов макроса), а двойной щелчок по нему открывает диалог работы с макросами.

Рис. 2.9. Диалоговое окно работы с макросами

Клавиша Create New Macro... (создать новый макрос), как мне кажется, хорошее начало для создания нужной мне подпрограммы.

Рис. 2.10. Задание свойств подпрограммы

Я дал подпрограмме имя «multi» и, пока «на всякий случай», добавил параметр freq. Я еще не знаю, смогу ли я воспользоваться этим параметром, как я это смогу сделать, но удалить лишнее я всегда смогу (если не забуду, как обычно бывает). Добавление параметра потребовало создания еще одной переменной freq_ch, но, все неприятности когда-нибудь заканчиваются. Я, наконец, получаю подпрограмму. Вернее, заготовку для нее.

Рис. 2.11. Создание заготовки для подпрограммы

Теперь я перенесу весь цикл из основной программы в подпрограмму. Как во многих графических редакторах, для выделения достаточно, нажав левую клавишу мышки, обвести нужные элементы. Затем (перетащить не получилось) в основном меню Edit-Cut (вырезать), перемещаемся в рабочее поле подпрограммы и щелкаем мышкой по линии связи операторных скобок (появляется стрелочка), и в основном меню Edit-Paste (вставить).

Подпрограмма выглядит так, как выглядела программа в момент начала работы. Но мне этого мало. Я, я не забыл об этом, я хочу изменять частоту мультивибратора, а подпрограмма, в конечном счете, и есть мультивибратор. Изменить частоту я могу единственным образом, я, по крайней мере, пока не вижу другого способа, изменив длительность пауз. Поэтому в свойствах паузы (двойной щелчок по первому, затем второму элементу Delay подпрограммы) я меняю число «1» на переменную freq_ch, которую создал при создании подпрограммы. Посмотрим, что из этого получится. Пока я не превратил программу в «небоскреб», можно проверить, работает ли задумка?

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

Рис. 2.12. Задание начальной частоты мультивибратора

Достаточно нажать на кнопку ? основной инструментальной панели программы, чтобы проверить работоспособность конструкции, если не забыть (что я и сделал) поменять в свойствах привязку светодиодов к порту B, а не А, как было раньше.

Рис. 2.13. Добавочный элемент светодиоды

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

Рис. 2.14. Изменение порта «приписки» светодиодов

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

Рис. 2.15. Проверка работы подпрограммы

Я не вижу разницы в работе программы сравнительно с предыдущей проверкой. И еще, пока «болезнь не запущена», с программами это бывает, проведем еще одну диагностику.

Я намерен в дальнейшем менять значение частоты, меняя значение переменной freq_ch. При нажатии кнопки «больше» эта переменная должна делиться на 2. Проверим. Добавим после первого элемента Calculation второй такой же. А в нем запишем freq_ch = freq_ch/2. Запустим программу...

...чтобы убедиться, что-то идет не так, как должно. Программа сейчас выглядит (основная программа):

Рис. 2.16. Вид основной программы на данный момент

Светодиод вместо того, чтобы мигать быстрее, то ли мигает, то ли нет — непонятно. Но есть простой способ проверить, а я думаю, что проблема с переменной freq_ch, проверить, что с ней происходит. Для этого достаточно в подпрограмме включить точку останова на элементе, скажем, первого вывода в порт B. Для включения точки останова можно щелкнуть правой клавишей мышки по этому элементу и в выпадающем меню щелкнуть по пункту Toggle Breakpoint. Запуск программы выводит в окно наблюдения переменные и их значение.

Рис. 2.17. Окно наблюдения при включении точки останова

Видно, что после деления переменная превращается в ноль. Первое, что приходит в голову, изменить тип переменной на int (целое). И задать значение не «1», а 1000. И поменять в подпрограмме в свойствах паузы секунды на миллисекунды.

Теперь после деления на два переменная становится равной 500, а светодиод исправно мигает. Своевременная проверка.

Итак. Мы создали подпрограмму работы мультивибратора. Мы добавили два элемента ввода (для двух кнопок управления). И, наконец, разобрались с механизмом изменения частоты будущего мультивибратора. Не пора ли перебросить шарик пинг-понга на другую половину стола?

Развитие программы в FlowCode (Windows)

Первое, что следует сделать — перенести все «достижения» в ранее написанную часть программы. Вместо элемента Assignment программы KTechlab, вне всяких сомнений, следует использовать элемент Calculation программы FlowCode. Если я ничего не перепутал, то программа должна получиться следующей.

Рис. 4.1. Вид программы (на данном этапе) в среде программирования FlowCode

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

...программа не реагирует на мои попытки изменить частоту генератора.

Используем прием, которым мы уже пользовались: ставим точку останова (правая клавиша мышки и Toggle Breakpoint — переключить точку останова, в выпадающем меню) на второе ветвление. Программа останавливается, но повторный запуск на продолжение выполнения программы ее уже не останавливает, несмотря на наличие точки останова. То есть, программа повторно не попадает в точку останова. И где же она?

Есть единственное место, где она может быть — подпрограмма. Подпрограмма — это бесконечный (в данный момент) цикл. Попав в него после «схода» с точки останова, программа больше из него не возвращается. Хорошо, что проверил.

Я вижу два варианта, как исправить упущение. Первый самый простой. Добавим в программу переменную «lp» (loop, цикл). До входа в подпрограмму присвоим ей значение «1». Цикл подпрограммы изменим условием While lp = 1, а в конце подпрограммы присвоим этой переменной значение «0».

Теперь мы попадаем в подпрограмму и возвращаемся из нее, что можно проверить с помощью точек останова, создавая их внутри подпрограммы и вне ее.


Рис. 4.2. Исправленный фрагмент программы

Рис. 4.3. Исправленная подпрограмма

Второй путь — внести опрос клавиатуры в подпрограмму. Правда, при этом смысл подпрограммы полностью теряется. Но отладка программы выявляет еще одно: меняя переменные «more» и «less», я думаю об увеличении и уменьшении частоты, а меняю при этом длительность, то есть, период. Все с точностью «до наоборот». Вовремя заметил. Изменение (заменить операции на обратные) это пара щелчков мышкой.

Двигаемся дальше. Я проверяю клавиатуру условием if more = 0, поскольку задумывал «подтянуть» входы резисторами, а кнопкой «приземлять» их. Однако в программе FloeCode внешний элемент Switches в разомкнутом состоянии оставляет вход в состоянии «0», а при замыкании подает на вход «1». Срочно исправлять (и не забыть вернуть к первоначальному варианту перед прошивкой!).

Есть еще одно решение проблемы с ловушкой в бесконечном цикле — использовать прерывание. Хотелось бы его опробовать, но, пока я старательно вносил правку в «стройную последовательность» своих ошибок, на горизонте (мысленном) замаячила еще одна проблема.

Что за проблема? Проблема пауз, с одной стороны, и проблема времени опроса с другой. Клавиши изменения частоты (больше-меньше) — сейчас временные интервалы большие и удобные для отладки — приходится удерживать нажатыми подолгу. Причина в том, что программа должна «пройти через паузы». Пока она «отдыхает», она не обращает внимание на нажатые клавиши. Но, когда мы приведем длительности к реальным нуждам, скажем, частоты в диапазоне 1-10 кГц, то нажатие, естественное для нас, не заставит ли программу со скоростью заданной частоты увеличивать эту частоту? За время удержания клавиши, например, в одну секунду, программа сможет прочитать нажатие клавиши очень много раз.

Перво-наперво, есть ли такая проблема в данном, конкретном случае?

В данном случае, возможно, нет. Почему?

Немного странный ответ: «Потому, что мы используем механические кнопки, подверженные дребезгу контактов».

Этот дребезг предстоит нейтрализовать. А самый простой способ нейтрализации — добавить паузу после опроса состояния кнопки, если оно менялось, и еще раз, после паузы, проверить, изменилось ли оно? Конструкция программы, примерно, следующая.

Рис. 4.4. «Антидребезговый» блок программы

Время «антидребезговой» паузы, следовательно, время необходимого удержания кнопки при смене частоты, может быть выбрано равным секунде или двум, когда выполнение других блоков программы не требуется. И ничто нам не помешает добавить еще одну паузу в секунду или больше перед вызовом подпрограммы. Мы устраним дребезг контактов, его в любом случае нужно устранить, и не позволим программе в этом месте что-то делать, что могло бы помешать «правильно» переключать частоту. Можно использовать и другой прием, например, ждать размыкания кнопки (с «антидребезгом»). Ниже я использую программный элемент Connection Point (точка соединения) и светодиод на выводе A7 для индикации процесса изменения частоты. Пара Connection Point — это в более привычном облике пара, образуемая меткой и оператором Goto (переход к метке).

Рис. 4.5. Возможное решение по остановке программы для опроса кнопок

И, наконец, можно вернуться к еще одному варианту решения проблемы «попадания в бесконечный цикл», к варианту с прерыванием.

К программе вида, изображенного на рисунке 4.1, можно добавить прерывание. Для этого есть программный элемент Interrupt. Присваивание переменных «more» и «less» внесем в подпрограмму обработки прерывания.

Если открыть свойства элемента Interrupt (прерывание), то можно увидеть список доступных прерываний.


Рис. 4.6. Список возможных прерываний в FlowCode

Рис. 4.7. Программа с использованием прерывания

Прерывание чем-то похоже на вызов подпрограммы. Видимо, наличием подпрограммы обработки прерывания.

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

Рис. 4.8. Подпрограмма обработки прерывания

Запущенная программа, после нажатия на кнопку B0 останавливается, как и задумывалось, на точке останова.

Рис. 4.9. Работа программы с прерыванием

Если бы это прерывание (RB0/INT) было единственным доступным механизмом прерывания, то и тогда можно было бы его использовать: вместо двух кнопок будут три, две для изменения частоты, третья кнопка, чтобы изменения вступили в силу. Но...

Список штатных прерываний, предложенный программой FlowCode, продолжается прерыванием по RB Port Change (прерывание по изменению состояния порта B). В описании микроконтроллера PIC16F628A можно найти, что изменение состояния входов RB4-RB7 может инициировать прерывание, если оно разрешено. Выбор входов для соединения с кнопками управления частотой не носит принципиального характера, можно легко заменить вход RB0 на RB4, а RB1 на RB5. Не сложнее изменить свойства программного элемента Iterrupt.

Подпрограмма «работы мультивибратора» остается прежней. А в подпрограмму обработки прерываний добавлены опросы клавиш на входах B4 и B5.

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

Вид основной программы и подпрограммы обработки прерываний показан ниже.

Рис. 4.10. Программа, использующая прерывания по изменению состояния порта В

Рис. 4.11. Подпрограмма обработки прерываний

Следующий этап работы.

Кроме изменения частоты генератора мы намеревались отображать эти изменения на семисегментном индикаторе. Добавим его в программу, удалив из нее светодиоды.

Рис. 4.12. Семисегментный индикатор из набора дополнительных элементов

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

По умолчанию анод индикатора подключен к выводу 3 порта А. В дальнейшем этот вывод следует сделать в программе выходом и установить в состояние высокого уровня.

Свойства подключения можно изменить, например, так.

Рис. 4.13. Изменение свойств индикатора

Анод теперь подключен к B0. А с тем, чтобы переключатель Switches не мешал нам распорядиться выводами порта В на наше усмотрение, можно изменить его свойства. Для этого достаточно для нужных бит порта, выделяя их, в окошке Bit: выбрать Unconnected (не присоединен).

Рис. 4.14. Изменение свойств переключателя

Вывод порта A7 подключен к точке на индикаторе, что позволяет в блоке «работы мультивибратора» использовать этот бит для вывода отображения сигнала, заменив в подпрограмме прежнее значение A0.

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

Рис. 4.15. Начало этапы работы с индикатором

Чтобы не усложнять вид программы, а ясно, что порядок работы с индикатором при отображении частот, скажем, в диапазоне 1-9 кГц, это не более, чем повторение одних и тех же программных фрагментов, я остановлюсь на основной частоте 2, а кнопки меньше и больше будут переключать ее на 1 и 4 (деление и умножение на 2, заложенные ранее).

Обслуживание индикатора можно оформить в виде подпрограммы. Назовем ее «indicator». И вначале погасим индикатор, «записав единицы» во все биты порта. Затем можно, используя ветвление, обслужить все задуманные значения частоты, зажигая нужные сегменты (установкой соответствующего бита в «0»).

На этом этапе работы, а программа уже несколько «подросла» количественно, можно проверить и исправить ошибки, если они есть, можно дописать такие фрагменты, как выход частоты из заданного диапазона, например, высвечивая «E» на индикаторе. Можно сравнить полученную конструкцию с той, что могла бы быть получена без использования микроконтроллера. Устройство достаточно простое, его можно реализовать, используя цифровой счетчик и тактовый генератор на вентилях. А можно удовлетвориться достигнутым и перейти к макетной плате и внешнему оформлению устройства.

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

Главное, вы начали работу с микроконтроллерами, создав первое устройство, и вам ясно, что создание второго и третьего — все в вашей власти. Нужно только продолжить работу.

Рис. 4.16. Фрагмент подпрограммы обслуживания индикатора

Создание схемы устройства при заданных назначении, параметрах и прочих критериях выбора, как правило, дает несколько возможных решений. Программирование тоже. И иногда полезно при работе с микроконтроллером вспоминать, как могло бы это реализоваться в «железе». Приведу пример.

Мы говорили о дребезге контактов. Из схемотехники мне вспоминается решение, использующее кнопку с контактами на переключение и RS-триггер. При нажатии кнопки управляющее напряжение подается, скажем, на вход установки, а при отпускании на вход сброса. Сколько бы ни дребезжали контакты, формируется единственный переключающий импульс. Аналогичную схему можно применить и в программе для микроконтроллера.

Ниже показана программа, где входы A0 и A1 используются для установки и сброса переменной flag. Состояние флага отображают светодиоды B0 — флаг установлен, B1 — флаг сброшен.

Можно проверить, что после первого нажатия кнопки A0 флаг устанавливается, светодиод B0 зажигается, и повторные нажатия на эту кнопку (дребезг контактов) не меняют состояния. Такое решение по устранению дребезга контактов, вернее, влияния дребезга контактов на работу устройства, в некоторых случаях может оказаться предпочтительнее других. А использование аналогий, как прием, вполне оправдывает себя.

Начиная создавать программу для микроконтроллера, далеко не всегда удается «увидеть» всю ее целиком и осознать все детали. Пройдя по, казалось бы, верному пути достаточно далеко, иной раз приходится возвращаться назад. Чтобы легче было вернуться назад, полезно сохранять отдельные этапы работы в виде отдельных файлов программы. Если в названии файла отобразить название этапа, то его легче обнаружить в образующемся длинном списке файлов. Как я уже говорил, порой следует транслировать программу до конца, чтобы посмотреть ее вид на языке Си или ассемблера. Если в программе есть ошибка, программа может не транслироваться в hex-файл и сообщать об этом при трансляции — повод еще раз все проверить и найти причину этого.

Рис. 4.17. Еще один вариант программы «антидребезга»

После первого шага, пусть создания простейшей программы с мигающим светодиодом, первого шага, доведенного до конца, то есть, до макетной платы с микроконтроллером и «фонариком», у вас обязательно появится много идей, как с пользой применить микроконтроллер. Реализуя эти идеи, вы больше узнаете о программе FlowCode, научитесь работать с ней. Но, возможно, легкое чувство неудовлетворенности не оставит вас. Знатоки, едва речь заходит о микроконтроллерах, в один голос утверждают, программировать нужно на ассемблере.

Я не отношусь к знатокам. Работает устройство, и хорошо. Как написана программа — какая разница?

Но, если вас это беспокоит, то я посоветовал бы, конечно, если вы не знакомы с языками программирования, использовать программу FlowCode, как удобный самоучитель по программированию. Сначала на языке Си. Язык более высокого уровня, а, следовательно, более простой, чем ассемблер. Да, и более универсальный. Итак.

FlowCode как самоучитель программирования на языке Си

Вернемся к самой простой программе — помигать светодиодом. Даже упростим задачу — зажечь светодиод.

Программа в графическом представлении выглядит так.



Рис. 5.1. Прототип программы для трансляции в код на языке Си

Следующее, что мы сделаем, выберем в основном меню раздел Chip, в котором выберем пункт Compile to C... (компилировать на Си). После успешной компиляции можно открыть файл на языке Си в блокноте с помощью пункта View C... того же раздела Chip основного меню. Значительная часть файла, все строки, начинающиеся с двойной косой черты //, это комментарии, то есть, пояснения для читающего файл, все комментарии игнорируются при дальнейшей трансляции кода программы. Хотя, подчас, комментарии с использованием кириллицы, вставленные в графическое представление программы, вызывают ошибку при компиляции.

Очень много строк, начинающихся со значка # и слова define — определить. Это служебное слово, за которым следует, что должно быть определено, чтобы при дальнейшей трансляции компилятором, используемым программой FlowCode, текста программы на ассемблер и дальше в загружаемый код, все было определено и обозначено. Что именно следует определять, зависит от ваших нужд, того как будет написана программа и конкретного компилятора.

Есть еще одно служебное слово #include — включить, предназначенное к добавлению в программу других файлов, чаще файлов заголовков, которые активно используются в языке Си. В данном случае, как это следует из комментария, включены функции, необходимые для работы с контроллером.

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

void main()

{

//Инициализация

cmcon = 0x07;

//Output: 1 -> PORT A

trisa = 0x00;

porta = 1;

}

Для работы с программами на языках Си и ассемблер и PIC-контроллерами я считаю наилучшей средой разработки MPLAB. В Windows у меня версия 8.10, в Linux 7.11. Но в Linux какие-то проблемы с компилятором. MPLAB позволяет работать с разными компиляторами языка Си. Есть компилятор производства HI-TECH, его демо-версия доступна для свободного скачивания, но после обязательной регистрации на сайте. Если попытаться воспользоваться чужой версией, то это может не получиться. Есть ограничения на оперативную память, возможно, еще какие-то, но для изучения программирования микроконтроллеров на языке Си компилятор вполне подходит.

После первой установки программы MPLAB и компилятора следует проверить, все ли определилось с местом установки компилятора. В основном меню в разделе Project есть пункт Set Language Tool Locations..., открывающий диалоговое окно задания расположения трансляторов с разных языков.


Рис. 5.2. Диалоговое окно расположения компилятора в MPLAB

Если с расположением есть неувязки, то клавиша Browse... поможет указать место (Location), где расположены нужные файлы. Как видно на рисунке, MPLAB работает со многими языковыми средствами.

Для работы с компилятором HI-TECH текст программы, показанный выше, следует слегка «подправить», переписав команды в верхнем регистре. Что следует сделать при использовании компиляторов других производителей, мы рассмотрим, когда (и если) будем говорить о других компиляторах. В любом случае, используя короткие фрагменты программ в FlowCode, можно получать их код на языке Си. И, если в FlowCode ясен смысл фрагмента, то полученный код на языке Си можно использовать для написания кода других программ на языке Си. В этом и есть смысл, который я вкладывал в название главы.

В качестве примера пользы от сочетания таких средств, как FlowCode и MPLAB, я хочу привести решение одного маленького неудобства, возникшего у моего знакомого. Ему понадобилось при работе с FlowCode сделать паузу на 30 секунд. Программа предоставляет штатное решение — программный элемент Delay. Но во время паузы работа программы останавливается, а нужно, чтобы она опрашивала клавиатуру. Самое простое — добавить в программу цикл опроса клавиатуры, который выполнялся бы столько раз, сколько нужно для паузы в 30 секунд. Но сколько раз следует выполнить цикл?

Посмотрим, как такое неудобство можно решить с помощью MPLAB. Создадим в FlowCode цикл, но с «мигающим светодиодом». Оттранслируем этот фрагмент на Си, «подправим» для компилятора HI-TECH и проверим его работу в MPLAB.

#include <pic16f62xa.h>

int i;

void main()
{

//Loop: While 1
while( 1 )
{

//Output: 1 -> PORT B
TRISB = 0x00;
RB0 = 1;

//Delay
for(i=0;i<10;i++);

//Output: 0 -> PORT B
TRISB = 0x00;
RB0 = 0;

//Delay
for(i=0;i<10;i++);
}
}

Переменную int i (целое) я добавил «от руки», как и цикл for.


Рис. 5.3. Проверка работы программы в MPLAB

Проверка осуществлялась с помощью отладчика (в основном меню Debugger-Animate), а осциллограмму «показал» логический анализатор (основное меню View-Simulator Logic Analyzer). Для этого в окне логического анализатора следует нажать клавишу Channels,в диалоге выбрать (в данном случае RB0) предмет наблюдения, который и добавить для наблюдения клавишей Add. После запуска отладчика осциллограмма начнет «заполняться». Если на инструментальной панели логического анализатора выбрать клавишу Cursor (клавиша с иконкой ???), то появившийся курсор можно установить на импульс, длительность которого нас интересует. Красные прямые на рисунке ниже — это и есть искомый курсор. При наведении курсора мышки на эти прямые курсор мышки превращается в изображение руки с указательным пальцем, которым можно, удерживая левую клавишу мышки, перемещать метки измерительного курсора.

Длительность будет измерена в тактах (cyc), но, зная тактовую частоту, легко получить время (с учетом 10 повторов).


Рис. 5.4. Измерение «длительности» импульса

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

Чтобы яснее понять, как образуется эта длительность, можно рассмотреть работу ассемблерного кода в MPLAB.


Рис. 5.5. Работа отладчика с кодом на ассемблере

Цикл for десять раз будет повторять набор команд, на которые указывает курсор анимации отладки. А, зная, за сколько тактов выполняется каждая из команд, можно «вручную» определить общую «длительность» цикла.

Мне кажется, что, используя возможности программы FlowCode, программу MPLAB, хороший учебник по языку Си и руководство к выбранному вами компилятору, можно быстрее овладеть программированием на языке Си (и аналогично на ассемблере) в преломлении к разработке устройств с использованием микроконтроллеров.


Что дальше?

Ни одна профессия не позволяет достичь вершин с тем, чтобы с этих вершин, угнездившись в достигнутом, равнодушно взирать на окружающий мир. Так не бывает. Приходится каждый день, каждый час решать все новые и новые задачи, перетряхивать ворох документации и искать информацию, которая помогла бы реализовать новые идеи, «освежить» старые решения, пополнить запас знаний.

Радиолюбители, народ любознательный и энергичный, порой, могут дать «сто очков вперед» любому профессионалу в части любознательности. Сделав первые шаги в освоении микроконтроллеров, они обязательно захотят знать, а что дальше? У них уже есть идеи, как применить контроллер, но это будни. Это текущие планы. А, что еще?

Очень интересным в этом отношении мне представляется использование встроенного во многие микроконтроллеры модуля сетевой работы USART. Где можно применить эту функцию контроллера?

Положим, что контроллер выполняет некую программу, связанную с обработкой состояния датчика. В этом случае, как правило, датчик и контроллер могут быть разнесены на некоторое расстояние. Или, например, пульт управления и исполняющее устройство, они тоже могут находится в разных местах. И пусть пульт управления имеет всего две-три кнопки, а между пультом и управляющим модулем расстояние в несколько метров, для связи между ними удобно использовать встроенный приемо-передатчик USART. В качестве сетевого интерфейса я отдал бы предпочтение RS485: всего два провода, хорошая защита от внешнего электромагнитного воздействия, малые создаваемые помехи, допустимые большие расстояния, для одного модуля всего одна микросхема интерфейса RS485. Не самое сложное и не самое дорогое решение.

Посмотрим, как можно использовать USART для задачи соединения модуля (с одной кнопкой) управления с исполняющим модулем (один светодиод).

Программа для первого модуля может выглядеть (я использую FlowCode) следующим образом:


Рис. 7.1. Программа для модуля управления

Кроме уже привычных программных компонент, после добавления дополнительного элемента RS232 (с инструментальной панели дополнительных элементов) я использую программный элемент Component Macro, появляющийся как вызов подпрограммы, обрабатывающей обращения к встроенному USART. Сама подпрограмма уже написана производителем FlowCode, остается только настройка.


Рис. 7.2. Диалоговое окно настройки компонента RS232

Выбрав в окне Component: нужный мне дополнительный элемент RS232(0), выбрав в окне Macro: нужный мне вид работы SendRS232Char (отправка символа по RS232), я создаю новую переменную «one» (типа Byte), которой в ветке программы (до вызова подпрограммы отправки символа) с помощью программного компонента Calculate присваиваю значение '1'.

На этом написание программы для первого модуля я заканчиваю. Можно проверить работу программы.

Рис. 7.3. Проверка программы первого модуля

Нажимая кнопку А0 на элементе Switches(0), я могу наблюдать, как в окне Characters sent элемента RS232(0) появляются единицы (я не убирал «дребезг», и каждое нажатие может отправлять несколько единиц). Окно наблюдения за этим процессом в программе FlowCode черное, а символы зеленые, но они плохо видны в тексте, поэтому в графическом редакторе GIMP (перед тем, как вставить рисунок в текст) я инвертирую цвета.

После задания слова конфигурации (и выбора модели контроллера, напомню, основное меню Chip) я транслирую проект в hex-файл.

Теперь создадим еще одну программу. Она должна принимать символ '1' по USART и включать светодиод на RB0.

Рис. 7.4. Программа второго модуля, приемного

Здесь я тоже использую Component Macro для добавочного элемента RS232.


Рис. 7.5. Диалоговое окно настройки компонента RS232

Запустив программу, в компоненте RS232(0), в окне Characters in queue с помощью клавиши с иконкой + можно открыть окно ввода необходимого символа, как если бы мы этот символ отправили из первого модуля.

Рис. 7.6. Окно ввода символа, который получит второй модуль

Если теперь нажать клавишу ОК, то программа должна зажечь светодиод на выводе RB0.


Рис. 7.7. Проверка второго модуля

Окошко Characters received я опять «подправил» в Gimp, чтобы можно было видеть полученный символ. Для трансляции в hex-файл, правда, приходится переходить в Windows (программа для этой ОС). Многие программы транслируются в Linux без проблем, но, похоже, не все. И, что дальше? Можно, конечно, «прошить» программы в контроллеры и проверить, что называется «живьем», но...

Есть такая программа (тоже для Windows), которая называется Proteus. Чем она мне сейчас интересна, так это тем, что в ней можно симулировать работу двух микроконтроллеров. Что я и хочу проделать.

Добавив в редакторе Proteus ISIS два микроконтроллера PIC16F628A и все необходимые внешние элементы, я настраиваю контроллеры:


Рис. 7.8. Настройка первого контроллера

Рис. 7.9. Настройка второго контроллера

Теперь, нажимая кнопку в собранной схеме, я вижу, что все действительно должно работать.

Рис. 7.10. Проверка работы двух контроллеров в Proteus

Так «беседуют» два микроконтроллера. Не будем им мешать.

 

Добавить комментарий


Защитный код
Обновить

        Рейтинг@Mail.ru Rambler's Top100                       Valid XHTML & CSS