Настоящий светодиодный маятник » Программирование устройств на PIC микроконтроллерах


Логин:
Пароль:
О сайте:

Pic.Rkniga.ru - Сайт как для начинающих, так и для опытных радиолюбителей, разрабатывающих свои устройства на популярных PIC микроконтроллерах.
Здесь можно обмениваться сообщениями на форуме, а также добавлять на сайт статьи и схемы своих устройств.

Меню сайта
Главная Форум по PIC микроконтроллерам Форум Статьи по PIC микроконтроллерам Статьи Справочная информаци по PIC микроконтроллерам Справочник Литература по PIC микроконтроллерам Литература Схемотехника Схемотехника устройств на PIC микроконтроллерах Микроконтроллеры Программаторы Все по программированию PIC микроконтроллеров Программы, Софт Программы Ссылки
Опрос

Какими микроконтроллерами вы чаще всего пользуетесь


PIC10
PIC12
PIC16
PIC18
PIC24
PIC32
Другими


Последние материалы
  • Тестовая плата для отладки программ на микроконтроллере PIC18F4550
  • Кнопка On/OFF на PIC12F629.
  • Часы с синхронизацией от китайского будильника
  • ШИМ регулятор на PIC16F628A.
  • Счетчики прямого и обратного счета на PIC16F628A.
  • Таймер отключения питания для мультиметра и не только.
  • Измеритель напряжения и тока
  • Маршрутный компьютер для электровелосипеда
  • Простой двухканальный термометр на PIC16F690 и датчиках DS18B20
  • Электронная "Незабудка" для забывчивых
  • Популярные материалы
    Случайная книга
    Настоящий светодиодный маятник
    Автор публикации: alex Просмотров: 6539 Добавлен: 9-08-2012, 09:25 Комментарии: 0

         В электронных часах и автоматах световых эффектов довольно часто применяют имитацию качания маятника. Но далеко не всегда она получается полноценной. В этой статье не только предлагается доработка одного из ранее опубликованных устройств, приближающая электронный маятник по характеру движения к настоящему, но и описаны два микроконтроллерных "маятника", обладающих таким свойством. В статье подробно рассмотрены программы микроконтроллеров, написанные на языке Pascal, а приложены к ней и функционально идентичные программы на языках С и Basic. Описаны некоторые приемы разработки и отладки таких программ. Это делает статью интересной и полезной всем, кто осваивает программирование микроконтроллеров на языках высокого уровня.
         Те, кто повторял конструкции, имитирующие поочередным включением нескольких светодиодов качание маятника, обратили, вероятно, внимание, что в работе такой маятник выглядит несколько ненатурально. Характер его движения совсем не такой, как у настоящего.
         Дело в том, что механический маятник под действием силы тяжести или пружины движется по синусоидальному закону, а светодиодная светящаяся точка — по линейному с постоянной скоростью, меняя лишь направление движения. На рис. 1 показано, какими должны быть интервалы включения девяти светодиодов, чтобы создать впечатление движения по синусоиде.

         Один из способов привести в устройстве закон движения светящейся точки к требуемому состоит в замене тактовых импульсов частотой 1024 Гц, поступающих от электронных часов, импульсами специального управляемого тактового генератора. Его частоту нужно сделать зависимой от того, какой из девяти светодиодов включен. Такой генератор можно собрать по схеме, показанной на рис. 2. Нумерация элементов продолжает начатую на рис. 1.
         Когда светятся светодиоды HL1 или HL9, частоту генерируемых мультивибратором на таймере DA1 импульсов задают резисторы R5, R6 и конденсатор С2. Резисторы R8 и R9 в это время отключены, поскольку диоды VD1—VD7 закрыты (на всех выходах дешифратора DD3, к которым подключены аноды диодов, установлен низкий уровень напряжения). Эта частота довольно низкая, поэтому светодиоды HL1 или HL9 остаются включенными сравнительно долго. Но с началом следующего такта уровень на выводе 14 или 4 дешифратора станет высоким, диод VD1 или VD7 откроется и резистор R8 окажется подключенным параллельно резистору R5 через открытый диод и внутренние цепи дешифратора. Ток во времяза-дающей цепи мультивибратора увеличится, частота генерируемых импульсов возрастет, а за счет этого уменьшится длительность тактов, в которых включены светодиоды HL2 или HL8. Еще более короткими станут такты, в которых включены светодиоды HL3— HL6, так как сопротивление резистора R9 меньше, чем R8.
         Учтите, что для получения нужного закона "качания", значения сопротивления резисторов R5, R6, R8 и R9 должны находиться между собой в определенном соотношении, подобрав которое, заменять резисторы по отдельности уже нельзя. По этой причине добиваться нужного периода "качания" приходится подборкой конденсатора С2. Если сделать это с нужной точностью не удается, можно добавить в генератор резисторы R7 и R10 (он работает и без них) и установить период точно, вращая ротор подстроечного резистора R10.

         Кроме рассмотренного "аналогового" возможен, конечно, и "цифровой" метод имитации синусоидального закона движения. Можно, например, заменить используемый в [1] делитель частоты импульсов с фиксированным коэффициентом деления — микросхему К561ИЕ16 (DD1), делителем с переменным коэффициентом, например, КА561ИЕ15А или аналогичным CD4059A, изменяя этот коэффициент в зависимости от того, какой светодиод включен. Но это значительно усложнит прибор, число микросхем в нем может дойти до десятка.
         Самое простое с точки зрения числа деталей в устройстве решение — заменить все непрограммируемые микросхемы одним микроконтроллером. Например, чтобы сделать устройство, схема которого изображена на рис. 3, кроме светодиодов HL1 —HL12 и микроконтроллера DD1 нужны только резистор и конденсатор. Порядок подключения светодиодов к выводам микроконтроллера выбран исходя из удобства их соединения на печатной плате, чертеж которой показан на рис. 4.
         Естественно, для работы микроконтроллера необходима программа. Она написана на языке Pascal с помощью среды разработки программ "mikroPascal for PIC12, PIC16, PIC18", бесплатную демонстрационную версию которой можно "скачать" по адресу <http://www.mikroe.com/download/pascal_pic1.php>. Единственное ограничение этой версии — объем загружаемого в программную память микроконтроллера кода не более 2 К слов. Поскольку память микроконтроллера PIC16F628A именно такого объема, разрабатывая программу для него, об ограничении можно позабыть.

         На том же сайте имеются и средства разработки программ для микроконтроллеров PIC на языках программирования С ("mikroC") и Basic ("mikroBasic"). По своим возможностям и особенностям применения они мало чем, кроме синтаксиса языка, отличаются от "mikroPascal", поэтому почти все, изложенное ниже, можно отнести и к ним. В приложении к статье имеются варианты программ "маятника" на всех трех языках.
         Текст программы SWING 1Р (на языке Pascal), обеспечивающий "качание" по синусоиде "маятника" из 12 светодиодов, приведен в табл. 1. Сразу же после заголовка в программе имеется таблица констант, задающих как логические уровни на выводах портов А и В в каждом из 24 тактов, из которых состоит период "качания", так и длительность каждого такта.
         Для наглядности состояния портов выражены двоичными числами: 1 — светодиод, подключенный к выводу соответствующего разряда порта, выключен, 0 — включен. Длительность тактов задана в условных единицах, причем числа подобраны так, что период "качания” (суммарная длительность всех тактов) равен тысяче этих единиц.

         Работа программы начинается с записи в регистры управления портов А и В значений, делающих все линии этих портов выходами, за исключением РА4, которая остается входной. Этот вход потребуется в дальнейшем для синхронизации "маятника” внешними секундными импульсами.
         Фрагмент программы, заключенный между строкой с оператором while и находящимся в предпоследней строке программы оператором end, описывает один период "качания" (24 такта управления светодиодами). Он повторяется циклически, пока питание микроконтроллера не будет выключено, поскольку условие входа в этот цикл и его повторения задано в операторе while логической константой true (истина) и, следовательно, всегда выполняется.
         Перебор тактов выполняет оператор цикла for, поочередно присваивающий переменной I значения от 0 до 23. Отсчет номеров тактов с нуля, а не с единицы, немного упрощает вычисления. В начале такта определяется позиция в массиве А, с которой начинается группа из трех констант, задающих параметры этого такта. Ее номер (индекс) в массиве равен утроенному значению номера такта. Обратите внимание, что утроение выполняется двумя сложениями. На операцию умножения было бы израсходовано значительно больше времени и памяти.

         От явного вычисления индекса можно в принципе отказаться, описав массив констант А как двумерный и обращаясь к его элементам А[I][0], А[I][1]. А[I][2]. В этом случае все нужные для поиска элемента вычисления программа выполняла бы неявно, скрыв их от пользователя. Но проверка показала, что объем загружаемого в микроконтроллер программного кода при этом заметно возрастает.
         Найдя нужные константы в таблице, микроконтроллер переписывает их значения в регистры портов А и В, чем включает нужный светодиод. Остается выдержать заданный интервал времени, после чего можно переходить к следующему такту.
         Выдержку обеспечивает оператор цикла for по переменной J. Он вызывает функцию задержки Delay_us число раз, на единицу меньшее указанного в таблице, так как начинает цикл со значения J=2. По окончании цикла функция Delay_us вызывается еще раз. Это сделано для того, чтобы как можно точнее выдержать заданный период "колебаний". Дело в том, что микроконтроллер расходует время не только на выполнение операторов Delay_us, но и на другие, необходимые для выполнения программы операции.

         Учесть этот расход только уменьшением аргумента функции Delay_us, вызываемой в цикле по переменной J, не удается. Поскольку в течение одного периода эта функция вызывается 1000-24=976 раз, изменение ее аргумента на единицу (т. е. на 1 мкс) изменяет длительность периода почти на миллисекунду. Такое же изменение аргумента функции, выполняемой вне цикла по J, изменит период только на 24 мкс. Вызов такой же функции еще один раз перед завершением периода позволяет отрегулировать его длительность с точностью до микросекунды.
         Указанные в программе (табл. 1) значения аргументов функции Delay_us подобраны такими, что "маятник" качается с периодом 1000000 мкс = 1 с, если тактовая частота микроконтроллера равна 4 МГц. Именно таково номинальное значение частоты внутреннего тактового RC-генератора микроконтроллера PIC16F628A. Однако в зависимости от экземпляра микросхемы и под действием колебаний температуры и напряжения питания частота внутреннего генератора может изменяться на несколько процентов.
         Если требуется более высокая точность, придется отключить внутренний генератор и по схеме, изображенной на рис. 5, присоединить к микроконтроллеру кварцевый резонатор на 4 МГц. Обратите внимание, что конденсаторы С2 и СЗ соединены с выводом 14 (+5 В) микроконтроллера, а не как обычно с его общим выводом 5. Это допустимо, так как между упомянутыми выводами имеется блокировочный конденсатор С1, сопротивление которого току ВЧ очень мало.

         Можно применить резонатор и на другую частоту, обязательно сообщив ее компилятору перед трансляцией программы. При этом выдержки, создаваемые функциями Delay_us, останутся соответствующими их аргументам, но расход времени на другие операции изменится, поэтому аргументы функций после изменения частоты придется подобрать заново.
         Можно достигнуть высокой точности "качания" маятника и другим способом — синхронизировать его импульсами частотой 1 Гц от внешнего высокостабильного генератора. Такие импульсы присутствуют в любых электронных часах. Например, "часовая" микросхема К176ИЕ12 формирует их на выводе 4. Импульсы синхронизации нужно, как показано на рис. 6, подать на вывод 3 микроконтроллера (это линия РА4, которую рассматриваемая программа конфигурирует как вход).

         В программу тоже придется внести небольшие изменения. Вы, вероятно, обратили внимание, что одна из строк программы, содержащая цикл repeat— until, как говорят программисты, "закомментирована" — отмечена двумя подряд знаками дробной черты. Это значит, что компилятор ее пропустит (как и всякий комментарий), не включив в исполняемую программу. Если эту строку "раскомментировать", убрав знаки дробной черты в начале, она превратится в обычную, программа станет выполнять предписанные в ней действия. Дойдя в конце периода "колебаний" до этого места, программа начнет циклически проверять состояние четвертого разряда порта А, то есть логического уровня сигнала на выводе 3 микроконтроллера, и будет продолжать это делать, пока уровень на этом входе, благодаря начавшемуся синхроимпульсу, не станет высоким. С этого момента начнется следующий период колебаний "маятника".
         Учтите, что для устойчивой синхронизации период "маятника” без синхронизации должен быть немного меньше периода повторения синхроимпульсов, а их разность — не меньше возможной взаимной нестабильности. Проще всего добиться этого, уменьшив значение константы, задающей длительность последнего такта периода. Например, сделав ее равной 50 вместо 93. В этом случае микроконтроллер начнет поиск синхроимпульса приблизительно за 43 мс до ожидаемого синхроимпульса. Все это время светодиод HL1 будет включен. Если перепад, по которому нужно начинать новый период, не нарастающий, а спадающий, достаточно изменить условие выхода в операторе until на PORTA.4=0.

         К статье приложен НЕХ-файл программы, полностью соответствующей приведенной в табл. 1 (без синхронизации, тактовый генератор — внутренний). Для его загрузки в микроконтроллер рекомендую пользоваться адаптером JDM, описанным, например, в [2], и оболочкой программирования IC-Prog, последнюю версию которой можно найти на интернет-странице <http://www.ic-prog.com/index1.htm>. Нужно сказать, что в пакете mikroPascal имеются средства управления программатором, но они работают, к сожалению, только с аппаратным адаптером фирмы mikroElektronika.
         Для тех, кто захочет внести в программу изменения, описанные в первой части статьи или какие-либо другие, расскажу об основных правилах работы со средой разработки mikroPascal. Запустив программу, необходимо выбрать в меню Project пункт New Project или нажать на экранную кнопку . В верхней части открывшегося окна, изображенной на рис. 7, введите имя будущего проекта и папки, где будут находиться относящиеся к нему файлы. Нажав на экранную кнопку Browse, нужную папку можно выбрать или даже создать заново. Далее в графу Description можно ввести любой пояснительный текст.

         Нажав на имеющуюся в графе Device кнопку с треугольником, выберите в выпавшем списке нужный микроконтроллер, а в графе Clock укажите тактовую частоту в мегагерцах.
         В нижней правой части окна имеется таблица конфигурации микроконтроллера, показанная на рис. 8. Имейте в виду, что в действительности она меньше по высоте и, чтобы увидеть все показанные на рис.8 строки, придется воспользоваться находящимся справа от таблицы движком. Нужно отметить строки, как показано на рисунке. Если все сделано правильно, в поле справа от таблицы будет выведено :_CONFIG: 0x3F10 — это значение слова конфигурации микроконтроллера. Если микроконтроллер будет работать не с внутренним генератором, а с кварцевым резонатором, необходимо снять "галочку" в строке _INTOSC_OSC_NOCLKOUT и поставить ее в строке _XT_OSC или _HS_OSC в зависимости от типа резонатора. Учтите, что на любом этапе работы над программой окно свойств проекта можно открыть, выбрав пункт меню Project—>Edit Project или нажав на экранную кнопку (OPEN) , и при необходимости внести в него изменения.

         Теперь остается нажать на экранную кнопку ОК. В ответ будет предложено создать пустой файл программы, в случае согласия окно с ним появится на экране. Здесь будут только строка с названием программы и две строки с ключевыми словами begin и end. Теперь можно дополнять программу, набирая нужные строки на клавиатуре. Если файл с программой уже имеется, надо закрыть созданный проект (пункт меню Project—>Close Project), открыть указанную при его создании папку, уничтожить имеющийся там файл с расширением имени .ppas и скопировать в нее файл с исходным текстом программы, дав ему имя уничтоженного. При последующем открытии проекта (пункт меню Project—>Ореп Project или Project—>Recent Projects) этот файл будет открыт автоматически. То же самое произойдет при повторном запуске программы mikroPascal, если она была завершена при открытом проекте.
         Подготовив текст программы, можно нажимать на экранную кнопку (Build Project). В находящемся ниже текста программы окне Message появятся сообщения об обнаруженных в процессе трансляции ошибках. Не расстраивайтесь, если их много. Обычно существенна только первая в списке, а она может быть всего лишь следствием пропущенной при вводе текста буквы, лишней или недостающей скобки. Как правило, почти все остальные сообщения об ошибках — последствия сбоя компилятора, вызванного первой.

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

         Приступая к работе с программным отладчиком, необходимо, прежде всего, выбрать его, как показано на рис. 9. Другой вариант — аппаратный отладчик (работающий с реальным микроконтроллером, а не имитирующий его) в отсутствие специализированной отладочной платы фирмы mikroElektrouika не подходит.
         После компиляции программы выбранный отладчик запускают нажатием на зкрлнную кнопку Й». На экране появится окно, показанное на рис. 10. Список переменных в нем первоначально пуст. Чтобы добавить одну из них, необходимо нажать на экранную кнопку (ВНИЗ) в графе "Select variable from list:", в "выпавшем" списке всех определенных в программе переменных выбрать нужную и нажать на экранную кнопку (Add). Эту операцию повторяют для всех переменных, за значениями которых необходимо следить при отладке. Если выделить переменную в списке (на рис. 10 это PORTB, отображающая текущее состояние порта В микроконтроллера), то в соответствующей строке появится экранная кнопка. При нажатии на нее откроется окно, изображенное на рис. 11.

         В нем можно выбрать наиболее подходящий формат отображения значения этой переменной: Dec — десятичный (если отмечен пункт Signed, то отрицательные числа будут выведены со знаком минус), Hex — шестнадцатеричный, Bin — двоичный, Float — с плавающей запятой, Char—в виде символов согласно кодовой таблице ASCII. При необходимости здесь можно ввести значение, которое будет присвоено переменной перед началом или продолжением исполнения программы отладчиком.
         С помощью экранных кнопок можно выполнять программу в пошаговом режиме, наблюдая за изменениями значений переменных и анализируя их. "Шагать" можно не только по строкам программы на языке высокого уровня, но и по инструкциям ее ассемблерного текста, сгенерированного компилятором. Если необходимо выполнить какой-либо участок программы в непрерывном режиме, в его конце следует установить контрольную точку (иногда ее называют точкой останова), щелкнув мышью в левом поле окна программы у соответствующей строки. Ее фон станет красным. Удаляют контрольную точку, выполнив описанную операцию еще раз

         Например, чтобы оценить длительность периода колебаний "маятника", формируемого программой SWING1P, нужно установить в ней контрольную точку, как показано на рис. 12. После нажатия на экранную кнопку исполнение программы начнется со строки, отмеченной курсором и синим фоном, и будет остановлено по достижении контрольной точки. Если нажать на ту же кнопку еще раз, выполнение программы продолжится с того места, где она была прервана, и вновь остановлено по достижении контрольной тонки (той же или, возможно, другой, если она имеется). Изменившиеся после последнего пуска программы значения переменных будут выделены в окне Watch (рис. 13) красным цветом.
         В зависимости от скорости работы компьютера симулятор исполняет программу с большим или меньшим замедлением относительно к реальной скорости ее исполнения микроконтроллером. Но прошедшее с начала отладки "микроконтроллерное" время отображается в нижней части окна Watch. К сожалению, с недостаточной для нашей цели точностью. Точное значение можно узнать, открыв с помощью экранной кнопки окно, изображенное на рис. 14. Кроме округленных значений "микроконтроллерного" времени, а нем показано точное число выполненных микроконтроллером машинных циклов. В графе Current Count — с начала отладки. Stopwatch — после последнего нажатия на экранную кнопку "Reset То Zero", Delta — после последнего пуска программы с помощью. При тактовой частоте 4 МГц длительность одного цикла равна 1 мкс.

         В данном случае выполнены два периода "качания", первый занял 1000003 мкс, а второй — ровно 1000000 мкс. Неоднократно нажимая на кногку, можно убедиться, что длительность 1000000 мкс будут иметь и все следующие периоды. Увеличенная длительность первого объясняется тем, что микроконтроллеру пришлось предварительно выполнить загрузку регистров TRIS.
         Подбирая оптимальные параметры функций Delay_us в рассматриваемой программе, после каждого изменения значения параметра обязательно нажимайте на кнопки. Если более существенных изменений не вносилось, положение контрольной точки можно оставить прежним. Лишь затем с помощью кнопки проверяйте, какой получилась длительность периода.

         В заключение рассмотрим еще один вариант "маятника". В нем двенадцатью светодиодами управляет восьмивыводный микроконтроллер PIC12F629, используя для этого всего три вывода.
         Схема такого "маятника" показана на рис. 15, а чертеж его печатной платы— на рис. 16. К сожалению, на плате с односторонним печатным монтажом не удалось обойтись без проволочных перемычек.

         Обратите внимание, что микроконтроллер на схеме изображен довольно необычно — в виде набора переключателей, отображающих состояние разрядов его регистров GPIO и TRISIO. Единице в разряде соответствует верхнее, а нулю — нижнее положение подвижного контакта соответствующего переключателя. В табл. 2 приведены сочетания состояний разрядов регистров, при которых включен тот или иной светодиод. Чтобы предотвратить подсветку "лишних" светодиодов, на аноды светодиодов HL10— HL12 подано напряжение 3,3 В, а на катоды HL7—HL9 — 1,7 В от эмиттерных повторителей на транзисторах VT1 и VT2. Так как оптимальные значения напряжения в этих цепях зависят от прямого падения напряжения на примененных светодиодах, для их правильного включения резисторы R1— R3 придется, возможно, подобрать.
         Программа микроконтроллера DD1 приведена в табл. 3 Необходимая конфигурация микроконтроллера PIC16F629 показана на рис. 17. Ей соответствует слово конфигурации 0x3FC4.
         Эта программа мало чем, кроме таблицы констант и имен портов, отличается от рассмотренной ранее. В ней также есть "закомментированный" участок. Если удалить фигурные скобки, в которые он заключен, то программа прочитает с помощью двух ассемблерных инструкций записанное на заводе-изготовителе микроконтроллера PIC12F629 в самую последнюю ячейку его программной памяти число, необходимое для настройки встроенного тактового генератора точно на частоту 4 МГц, а затем занесет это число в регистр калибровки генератора OSCCAL. В приложенный к статье файл SWING2P.hex команды подстройки генератора не включены
         Учтите, что программу, в которой этот участок активизирован, недопустимо проверять с помощью отладчика, поскольку его виртуальная память не содержит нужной информации в нужном месте, что приведет к сбою. Поэтому, решив воспользоваться программной подстройкой тактового генератора, удаляйте фигурные скобки вокруг "закомментированного" участка только перед окончательной трансляцией полностью отлаженной программы, после которой полученный НЕХ-файл будет загружен в микроконтроллер.
         ЛИТЕРАТУРА
         1.    Озолин М. Имитатор качания маятника. — Радио, 2005, № 12, с. 49.
         2.    Долгий А. Программаторы и программирование. — Радио, 2004, № 1—12. <ftp://ftp.radio.ru/pub/2008/05/p&p.pdf>.
         3.    Озолин М. Имитатор качания маятника. — Радио, 2005, № 12, с. 49.
         4.    Долгий А. Программаторы и программирование — Радио, 2004, № 1—12 <ftp://ftp.radio.rг/pub/2008/D5/p.s.p.pdf>
         5.    Lekic N., Mijanovlc Z. Three microcor troller ports drive 12 LEDs — <http://www.edn.com/article/CA6399101.htnol?spacedesc=Designldeas&taxld=10593&industryld=44217#refref>.
    Материал взят из: Журнала Радио 2008 №7

    В архиве исходные коды на C, Basic, Pascal и прошивки к ним

    nastsvetmaitn.rar [7,4 Kb] (cкачиваний: 254)

    Комментарии