|
Микроконтроллеры 4. Программа FlowCode.
Статьи публикуются по мере поступления. Для упорядоченного тематического
поиска воспользуйтесь блоком "Карта сайта"
Второй путь — внести опрос клавиатуры в подпрограмму. Правда, при этом смысл подпрограммы полностью теряется, не оставляя ничего программе. Впрочем, к созерцанию структуры программы можно вернуться позже, а сейчас отладка программы выявляет еще одно: меняя переменные «тоrе» и «less», я думаю об увеличении и уменьшении частоты, а меняю при этом длительность пауз, то есть, период. Все с точностью «до наоборот». Вовремя заметил. Изменение (заменить операции на обратные) это пара щелчков мышкой. Двигаемся дальше. Я проверяю клавиатуру (переменную «more») условием if more = 0, поскольку задумывал «подтянуть» входы резисторами, а кнопкой «приземлять» их. Однако в программе FlowCode внешний элемент Switches в разомкнутом состоянии оставляет вход в состоянии «О», а при замыкании подает на вход «1». Срочно исправлять (и не забыть вернуть к первоначальному варианту перед прошивкой!). Есть еще одно решение проблемы с попаданием в ловушку бесконечного цикла — использовать прерывание. Хотелось бы его опробовать, но, пока я старательно вносил правку в «стройную последовательность» своих ошибок, на горизонте (мысленном) замаячила еще одна проблема.
Что за проблема? Проблема пауз, с одной стороны, и проблема времени опроса с другой. Клавиши изменения частоты (больше-меньше) — сейчас временные интервалы большие и удобные для отладки — приходится удерживать нажатыми подолгу. Причина в том, что программа должна «пройти через паузы». Пока она «отдыхает в паузах», она не обращает внимание на нажатые клавиши. Но, когда мы приведем длительности к реальным нуждам, скажем, частоты в диапазоне 1-10 кГц, то нажатие, естественное для нас, не заставит ли программу со скоростью заданной частоты увеличивать эту частоту? За время удержания клавиши, например, в одну секунду, программа сможет прочитать нажатие клавиши очень много раз. Перво-наперво, возникнет ли такая проблема в реальности? В данном случае, возможно, нет. Почему? Из-за дребезга контактов.
Купить
Программаторы, средства разработки и отладки для DSP,
средства разработки и отладки для ПЛИС-ПАИС
Этот дребезг предстоит нейтрализовать. А самый простой способ нейтрализации — добавить паузу после опроса состояния кнопки, если оно менялось, и еще раз, после паузы, проверить, это состояние. Еще одно небольшое отступление. Идея сделать входы слева (порт А), а выходы справа (порт В) была, быть может, и не плоха. Но позже выяснилось, что это приводит к некоторым неудобствам. Входы и выходы вновь пришлось поменять местами. Как распорядиться работой портов, как разумнее организовать выводы порта — задача конкретная, но, что, несомненно, важно, в среде FlowCode это решается достаточно быстро и просто. Когда устройство задумывается, далеко не всегда сразу видно окончательное решение, и, порой, в процессе отладки меняются не только детали решения, но приходится пересматривать и базовые подходы. Наличие удобных отладочных средств в среде разработки помогает успешно выявить причины возникновения проблем, а удобные средства модификации программы — залог быстрого продвижения к намеченной цели. В этом отношении FlowCode вполне благосклонна к пользователю. В данный момент конструкция программы, примерно, следующая.
Время «антидребезговой» паузы, следовательно, время необходимого удержания кнопки при смене частоты, может быть выбрано равным секунде или двум, когда выполнение других блоков программы не требуется. И ничто нам не помешает добавить еще одну паузу в секунду или больше перед вызовом подпрограммы. Мы устраним дребезг контактов, его в любом случае нужно устранить, и не позволим программе в этом месте что-то делать, что могло бы помешать «правильно» переключать частоту. Можно использовать и другой прием, например, ждать размыкания кнопки (с «антидребезгом»). Таким образом, в реальности нам не грозит многократное увеличение (или уменьшение) частоты генератора при однократном нажатии кнопки. Ниже я использую программный элемент Connection Point (точка соединения) и светодиод на выводе А7 для индикации процесса изменения частоты. Пара Connection Point — это, в более привычном облике, пара, образуемая меткой и оператором Goto (переход к метке).
И, наконец, можно вернуться к еще одному варианту решения проблемы «попадания в бесконечный цикл», к варианту с прерыванием. Для этого есть программный элемент Interrupt. Присваивание переменных «more» и «less» внесем в подпрограмму обработки прерывания. Если открыть свойства элемента Interrupt (прерывание), то можно увидеть список доступных прерываний.
Прерывания по таймеру сейчас, пожалуй, не актуальны, а начать эксперимент можно с внешнего прерывания RBO/INT. Программа приобретает вид, показанный ниже.
Снабдим подпрограмму обработки прерывания точкой останова, чтобы посмотреть , попадаем ли мы в подпрограмму, когда нажимаем кнопку ВО.
Запущенная программа после нажатия на кнопку ВО останавливается, как и задумывалось , на точке останова.
Если бы это прерывание (RB0/INT) было единственным доступным механизмом прерывания, то и тогда можно было бы его использовать: вместо двух кнопок будут три, две для изменения частоты, третья кнопка, чтобы изменения вступили в силу. Но...Список штатных прерываний, предложенный программой FlowCode, продолжается прерыванием по RB Port Change (прерывание по изменению состояния порта В). В описании микроконтроллера PIC16F628A можно найти, что изменение состояния входов RB4-RB7 может инициировать прерывание, если оно разрешено. Выбор входов для соединения с кнопками управления частотой не носит принципиального характера, можно легко заменить вход RB0 на RB4, a RB1 на RB5. Не сложнее изменить свойства программного элемента Interrupt. Подпрограмма «работы мультивибратора» остается прежней. А в подпрограмму обработки прерываний добавлены опросы клавиш на входах В4 и В5. При необходимости в работу можно внести описанные выше «антидребезговые» добавления. А в целом, можно сказать, что в разных ситуациях лучше использовать те приемы работы, которые дают должный эффект, лучше выполняют работу устройства и хорошо вам знакомы и понятны, когда вы достаточно ясно представляете себе, почему выбрали тот или иной вариант.
Купить
Программаторы, средства разработки и отладки для DSP,
средства разработки и отладки для ПЛИС-ПАИС
Аналогичными соображениями вы руководствуетесь и при выборе типа и модели микроконтроллера. Для начинающих, когда наступает время выбора микроконтроллера, я предложил бы обратить внимание на наличие описания модели на русском языке. Далеко не все готовы прочитать несколько сотен страниц на английском, а к описанию от производителя приходится обращаться достаточно часто, уточняя те или иные свойства контроллера. Вид основной программы и подпрограммы обработки прерываний показан ниже.
Кроме изменения частоты генератора мы намеревались отображать эти изменения на семисегментном индикаторе. Добавим его в программу, предварительно удалив светодиоды.
Как и остальные элементы, индикатор имеет свойства. Для доступа к свойствам подключения индикатора служит кнопка на титульной панели рядом с кнопкой закрывания. При ее нажатии из выпадающего меню следует выбрать пункт Component Connections. По умолчанию анод индикатора подключен к выводу 3 порта А. В дальнейшем этот вывод следует сделать в программе выходом и установить в состояние высокого уровня. Свойства подключения можно изменить, например, так:
Анод теперь подключен к выводу ВО. А с тем, чтобы переключатель Switches не мешал нам распорядиться выводами порта В на наше усмотрение, можно изменить его свойства. Переключатели и светодиодные линейки по умолчанию обслуживают порт целиком, то есть подключаются ко всем восьми выводам порта. Зачастую это удобно. Но не всегда. Если возникает необходимость в переменах, то их можно выполнить в свойствах компонента. Для этого достаточно для нужных бит порта, выделяя их, в окошке Bit: выбрать Unconnected (не присоединен). Микроконтроллер PIC16F628A имеет два порта ввода-вывода по восемь выводов в каждом. Такого количества на первый взгляд более чем достаточно, но по мере усложнения схемы первоначально распределенные по портам выводы смешиваются, часть этих выводов приходится использовать вынужденно, кварц соединяется со вполне определенными выводами, для сетевой работы выводы тоже предопределены. Если возникают сомнения, как отразится привязка выводов при работе программы к байтовым линейкам светодиодов или переключателей, ненужные выводы можно сразу отключить.
Вывод порта А7 подключен к точке на семисегментном индикаторе, что позволяет в программном блоке «работы мультивибратора» использовать этот бит для вывода отображения сигнала, заменив в подпрограмме прежний вывод АО. После запуска программы все элементы индикатора зажигаются, а точка мигает с выбранной скоростью. Чтобы не усложнять вид программы, а ясно, что порядок работы с индикатором при отображении частот, скажем, в диапазоне 1-9 кГц, это не более, чем повторение одних и тех же программных фрагментов, я остановлюсь на основной частоте 2 , а кнопки меньше и больше будут переключать частоту на 1 и 4 (деление и умножение на 2, заложенные ранее). Обслуживание индикатора можно оформить в виде подпрограммы. Назовем ее «indicator». И вначале погасим индикатор, «записав единицы» во все биты порта . Затем можно, используя ветвление, обслужить все задуманные значения частоты, зажигая нужные сегменты (установкой соответствующего бита в «О»).
На этом этапе работы, а программа несколько «подросла» количественно, можно проверить и исправить ошибки, если они есть, можно дописать такие фрагменты, как выход частоты из заданного диапазона, например, высвечивая «Е» на индикаторе. Можно сравнить полученную конструкцию с той, что могла бы быть получена без использования микроконтроллера. Устройство достаточно простое, его можно реализовать, используя цифровой счетчик и тактовый генератор на вентилях. А можно удовлетвориться достигнутым и перейти к макетной плате и внешнему оформлению устройства. Можно и продолжить разработку, введя еще один семисегментный индикатор для расширения диапазона частот.
Купить
Программаторы, средства разработки и отладки для DSP,
средства разработки и отладки для ПЛИС-ПАИС
Главное, вы начали работу с микроконтроллером, создав первое устройство, и вам ясно, что создание второго и третьего — вопрос только вашего желания. После первого шага, пусть создания простейшей программы с мигающим светодиодом, первого шага, доведенного до конца, то есть, до макетной платы с микроконтроллером и «фонариком», у вас обязательно появится много идей, как с пользой применить микроконтроллер. Реализуя эти идеи, вы больше узнаете о программе FlowCode, научитесь работать с ней. Но, возможно, легкое чувство неудовлетворенности не оставит вас. Знатоки, едва речь заходит о микроконтроллерах, в один голос утверждают, программировать нужно на ассемблере.
Я не отношусь к знатокам. Работает устройство, и хорошо. Как написана программа — какая разница? Но, если вас это беспокоит, то я посоветовал бы, конечно, если вы не «на короткой ноге» с языками программирования, использовать программу FlowCode, как удобный самоучитель по программированию. Сначала на языке Си. Язык более высокого уровня, Вернемся к самой простой программе — помигать светодиодом. Даже упростим задачу — зажечь светодиод.Программа в графическом представлении выглядит так.
Следующее, что мы сделаем, выберем в основном меню раздел Chip, в котором выберем пункт Compile to С. . . (компилировать на Си) . После успешной компиляции можно открыть файл на языке Си в блокноте с помощью пункта View С... того же раздела Chip основного меню. Значительная часть файла, все строки, начинающиеся с двойной косой черты //, это комментарии, то есть, пояснения для читающего файл, все комментарии игнорируются при дальнейшей трансляции кода программы. Очень много строк, начинающихся со значка «#» и слова «define» — определить . Это служебное слово, за которым следует, что должно быть определено, чтобы при дальнейшей трансляции компилятором, используемым программой FlowCode, текста программы на ассемблер и дальше в загружаемый код, все было определено и обозначено. Что именно следует определять, зависит от ваших нужд, того как будет написана программа и конкретного компилятора. Есть еще одно служебное слово «#include» — включить, предназначенное к добавлению в программу других файлов, чаще файлов заголовков, которые активно используются в языке Си. В данном случае, как это следует из комментария, включены функции, необходимые для работы с контроллером. Сама программа (не умаляя значения всего остального) выглядит почти так же коротко, как ее графическое представление.
void main ()
{
//Инициализация
cmcon = 0x07;
//Output: 1 -> PORT А
trisa = 0x00;
porta = 1;
}
Для работы с программами на языках Си и ассемблер и PIС-контроллерами я считаю наилучшей средой разработки MPLAB. Небольшая правка, которая зависит от используемого компилятора, и программа на языке Си, полученная в FlowCode, будет работать в MPLAB. Аналогично можно поступить с программой на ассемблере. Простота создания работающих устройств в среде программирования FlowCode может оставить неверное впечатление, что она хороша только для очень простых устройств. Но это не так. Средства вычисления, возможность добавления готовых блоков программы, написанных на языке Си, все это, наряду с продуманным набором встроенных команд, позволяет решать, если и не любые, то достаточно сложные задачи в рамках создания устройств на основе микроконтроллеров. Достаточно часто подобные устройства организуются в систему, где отельные устройства связаны в сеть. Для сетевого применения во многие микроконтроллеры добавлены модули сетевой работы USART. Где может быть полезна эта функция контроллера? Положим, что контроллер выполняет некую программу, связанную с обработкой состояния датчика. В этом случае, как правило, датчик и контроллер могут быть разнесены на некоторое расстояние. Или, например, пульт управления и исполняющее устройство, они тоже могут находится в разных местах.
Купить
Программаторы, средства разработки и отладки для DSP,
средства разработки и отладки для ПЛИС-ПАИС
И пусть пульт управления имеет всего две-три кнопки, а между пультом и управляющим модулем расстояние в несколько метров, для связи между ними удобно использовать встроенный приемопередатчик USART. В качестве сетевого интерфейса я отдал бы предпочтение RS485: всего два провода, хорошая защита от внешнего электромагнитного воздействия, малые создаваемые помехи, допустимые большие расстояния, для одного модуля всего одна микросхема интерфейса RS485. Не самое сложное и не самое дорогое решение. Посмотрим, как можно использовать USART для задачи соединения модуля (с одной кнопкой) управления с исполняющим модулем (один светодиод). Программа для первого модуля может выглядеть (я использую FlowCode) следующим образом:
Кроме уже привычных программных компонент, после добавления дополнительного элемента RS232 (с инструментальной панели дополнительных элементов) я использую программный элемент Component Macro, появляющийся как вызов подпрограммы, обрабатывающей обращения к встроенному USART. Сама подпрограмма уже написана производителем FlowCode, остается только настройка.
Выбрав в окне Component: нужный мне дополнительный элемент RS232(0), выбрав в окне Macro: нужный мне вид работы SendRS232Char (отправка символа по RS232), я создаю новую переменную «one» (типа Byte), которой в ветке программы (до вызова подпрограммы отправки символа) с помощью программного компонента Calculate присваиваю значение '1'. На этом написание программы для первого модуля можно закончить и проверить работу программы. Нажимая кнопку АО на элементе Switches(0), можно видеть, как в окне Characters sent элемента RS232(0) появляются единицы (в программе не убран «дребезг», и каждое нажатие может отправлять несколько единиц). Окно наблюдения за этим процессом в программе FlowCode черное, а символы зеленые, но они плохо видны на рисунке в тексте, поэтому в графическом редакторе GIMP (перед тем, как вставить рисунок) цвета инвертированы. После задания слова конфигурации (и выбора модели контроллера, напомню, основное меню Chip) проект транслируется в hex-файл. Теперь создадим еще одну программу. Она должна принимать символ ' 1' по USART и включать светодиод на выводе RB0.
Здесь также использован элемент Component Macro для RS232.
Запустив программу, в компоненте RS232(0), в окне Characters in queue с помощью клавиши с иконкой «+» можно открыть окно ввода необходимого символа, как если бы мы этот символ отправили из первого модуля. Если теперь нажать клавишу ОК, то программа должна зажечь светодиод на выводе RBO.
Окошко Characters received опять «подправлено» в Gimp, чтобы можно было видеть полученный символ на рисунке. И, что дальше? Можно, конечно, «зашить» программы в контроллеры и проверить, что называется «живьем», но...Есть такая программа (тоже для Windows), которая называется Proteus. Чем она сейчас интересна, так это тем, что в ней можно симулировать работу двух микроконтроллеров. Добавив в редакторе Proteus ISIS два микроконтроллера PIC16F628A и все необходимые внешние элементы, следует настроить контроллеры:
Настройка сводится к указанию тактовой частоты, слова конфигурации и места расположения hex-файлов. Теперь, нажимая кнопку в собранной схеме, проверяем, что все действительно должно работать.
Так «беседуют» два микроконтроллера. Не будем им мешать.
"Домашняя лаборатория" Гололобов В.Н.