|
Работа с BASCOM AVR (обзор статей грамотных людей) 5
Статьи публикуются по мере поступления. Для упорядоченного тематического
поиска воспользуйтесь блоком "Карта сайта"
Это очень удобный тип переключателей, в которых шаг изменения параметра
не зависит от диапазона, как в случае с переменными резисторами и АЦП.
К тому же энкодеры вращаются "бесконечно".
У большинства энкодеров есть два выхода - A и B,
которые переключаются при повороте ручки:
Энкодеры бывают двух типов - контактные (механические) и оптические. В механическом энкодере стоят обычные контактные пластины, которые размыкаются и замыкаются при повороте.
У них есть проблема дребезга, которую мы уже рассматривали, когда изучали клавиатуры. Еще у них есть характерная особенность - ощутимый щелчок при каждом повороте на один шаг. В оптических энкодерах установлен диск с прорезями и оптопара. Фототранзисторы расположены таким образом, что при вращении диска на их выходе получаются сигналы такого же вида, что и у механического энкодера. Распотрошите старую и новую компьютерные мышки с колесиками, и вы поймете, как оно работает. Подробнее про типы энкодеров можно почитать на википедии. У механических энкодеров три вывода - земля и выводы A, B, замыкаемые на землю. Так что для работы с ними их можно напрямую подключать к выводам микроконтроллера. Я бы порекомендовал использовать дополнительно подтягивающие резисторы 10 кОм. В оптических энкодерах подтягивающие резисторы, как правило, уже встроены. (сверьтесь с даташитом!)
Купить
Программаторы, средства разработки и отладки для DSP,
средства разработки и отладки для ПЛИС-ПАИС
В них также стоят выходные транзисторы, так что вам не нужно беспокоиться о дребезге. Некоторые энкодеры имеют выход Index, на котором импульсы возникают независимо от направления вращения. Оба типа энкодеров иногда имеют дополнительный переключатель, который срабатывает при нажатии на вал. Это приятное дополнение можно использовать в качестве клавиши Enter при навигации по меню.
Давайте посмотрим, как подключить энкодер к микроконтроллеру:
программа, которая бесконечно проверяет состояние контактов:
Использование контактного энкодера
Я использовал энкодер ECW1J-B24-AC0024 фирмы Bourns. И у этого энкодера есть дребезг:
Формально, проверка Cha = 0 в подпрограмме прерывания не очень то и нужна, ведь мы попали в подпрограмму именно из-за того, что сигнал на Cha сменил уровень с высокого на низкий! Однако она все равно не будет лишней из-за нестабильных состояний в момент переключения между положениями A/B.
Использование оптического энкодера
В качестве подопытного был выбран HEDS-550 фирмы Agilent. Даташита на сайте уже нет.
У оптических энкодеров нету дребезга:
Редактор кода и симулятор Bascom
Окно редактора Bascom используется для ввода и редактирования текста программы. Он имеет удобную подсветку синтаксиса:
- Зеленым обозначаются комментарии: это может быть любой текст после апострофа ( ' ). Используйте их, чтобы делать структуру программы понятной для всех. Вы потом себе сами спасибо скажете, открыв код через некоторое время.
- Красным обозначаются спецсимволы: *+-,./\:;<>=&^%#@~()[]|?!@{}
- Полужирным синим выделяются ключевые слова Bascom. Например, Waitms 500. Кстати, по этим словам доступна справка - нужно установить курсор на интересующее слово и нажать F1.
- Черным обозначаются переменные.
Эти цвета установлены по умолчанию, но их можно изменить в настройках Options/Environment (вкладка Font):
Bascom претендует на звание "умного" редактора. Это значит, что он осуществляет форматирование кода программы по мере его ввода, делая его более опрятным и удобочитаемым. Например, он делает каждое вводимое слово с заглавной буквы. Еще он убирает лишние пробелы и добавляет их там, где надо, делая текст более разреженным. Все это можно так же сменить в тех же настройках:
Достаточно убрать галки "Don't change case" и "Reformat Bas files". Последняя отменяет форматирование файлов сразу после открытия в редакторе. Пока мы все еще копаемся в настройках среды (Environment), обратим внимание на вкладку "IDE":
Оказывается, Bascom сохраняет изменения, внесенные в код, перед каждым компилированием! Это достаточно неожиданное поведение для редактора. Вы не можете просто взять и поменять код, а затем скомпилировать его, посмотрев, что будет. После нескольких таких "посмотреть что будет" ваш код может быть необратимо изменен, и этого нельзя избежать, не закрыв полностью Bascom и отказавшись от сохранения изменений. Это ненужное и вредное поведение редактора нужно осознавать и принимать как должное. Конечно, можно отключить автосохранение, сняв галку "Autosave on compile", но перед каждой компиляцией вам придется заново указывать имя файла для сохранения!
Синтаксические ошибки в Bascom
Синтаксические ошибки сродни орфографическим ошибкам или опечаткам. Например, вы хотели набрать Config, но промахнулись по клавишам и набрали Confih. Bascom такого слова не знает и при компиляции выдаст ошибку. Большинство таких ошибок выявляются на стадии компиляции. Если таковые имеются, Bascom откажется создавать bin-файл и выдаст список ошибок в нижнем окошке. Давайте попробуем испортить уже знакомый нам ledflasher.bas:
Это довольно удобно - перепрыгивать сразу на нужную строку, особенно если вы пишете большую и запутанную программу. Первая строка гласит "Assignment error...". Мы забыли объявить переменную, а Bascom требует объявления каждой переменной, которую мы используем. Сейчас давайте просто удалим эту строку. Вторая строка в отчете говорит нам "Unknown statement...". Опять же, мы промахнулись по клавишам и не набрали вторую "o" в слове Loop. Последняя строка отчета возникла из-за того, что Bascom после слова Do ожидал увидеть слово Loop. Нам достаточно исправить 'Lop' на 'Loop' и обе ошибки исчезнут. Такое случается часто, когда одна синтаксическая ошибка по цепочке вызывает несколько. Поэтому не все записи в отчете могут быть очевидны. Тут Bascom есть куда стремиться! Перекомпилируем нашу программу и увидим, что на этот раз в ней нет ошибок. Обратите внимание: Bascom выявляет синтаксические ошибки, но не логические! Поэтому если вы думаете, что компилятор не прав, сначала проверьте себя и свой код!
Симулятор Bascom
Перед использованием каких-то новых решений в коде, бывает полезно сначала проверить, насколько они хорошие. Симулятор позволяет вам пошагово проверить программу без программирования контроллера и использования железа вообще. Вы можете смотреть состояние портов ввода/вывода, значения переменных, аппаратных регистров и программной памяти. Также вы можете посмотреть, как контроллер взаимодействует с железом. Вы можете симулировать подключенный к МК индикатор, изменять состояние портов контроллера виртуальными кнопками, подводить нужное значение напряжения к АЦП и т.п. Сначала давайте посмотрим, как мы можем симулировать работу светодиодной мигалки. Откроем все тот же ledflasher.bas и скомпилируем. Помимо .bin файла, компилятор создаст .dbg и .obj файлы, которые используются симулятором.
Запустим симулятор (F2):
В нижней части мы увидим окно с исходным кодом. В верхней части мы увидим кучу кнопочек для симуляции железа и вкладки, отображающие состояния переменных и регистров. Когда мы запускаем симуляцию, мы можем видеть состояние портов ввода/вывода после каждой команды в программе. Чтобы отобразить "виртуальное железо", нажмем кнопку LCD. Появится дополнительное окно:
Теперь, если мы запустим программу на выполнение (F5), напротив текущей строки программы появится синяя стрелочка:
Обратите внимание, как включаются все вывода порта D после строки 'PortD = 255' и выключаются после строки 'PortD = 0'. (Заметьте, что симулятор показывает 8 светодиодов для порта D, хотя в AT90S2313 наружу выведены только 7. Также заметьте, что симулятор показывает индикаторы состояния регистров ввода/вывода для текущей модели контроллера. Попробуйте сменить строку "$regfile = "2313def.dat" на "$regfile = "m128def.dat", перекомпилируйте, перезапустите симуляцию и нажмите кнопку LCD. В ATMega128 всего 7 регистров ввода/вывода!). Мы можем остановить симуляцию кнопкой Stop program. Обычно запускать программу на произвол судьбы и следить за ней со стороны не очень удобно. Лучше пользоваться кнопкой Step into code (F8).
Купить
Программаторы, средства разработки и отладки для DSP,
средства разработки и отладки для ПЛИС-ПАИС
Симулятор будет делать паузу после каждой строки, давая вам время рассмотреть, что происходит. Заметьте, что симулирование команды waitms 50 займет гораздо больше времени чем 50 мс. В общем, на таких командах симулятор работает слишком медленно. Вставьте директиву "$sim" после строки "$crystal = 4000000" и перекомпилируйте программу. Вы увидите, что все команды задержки будут пропущены. Но не забудьте убрать ее и перекомпилировать программу заново перед прошивкой контроллера! Если вы забудете сделать это, все задержки из конечной программы пропадут, и контролелр будет вести себя некорректно!
Работа с переменными
О переменных уже было сказано в главе 6, при необходимости обратитесь к ней.
Создадим новый проект и введем такую программу:
$regfile = "2313def.dat"
Dim Counter As Byte
Counter = 1
Do
Counter = Counter + 1
Loop
End
Скомпилируем и запустим симулятор. В первой ячейке таблицы на вкладке Variables введем имя переменной Counter:
Щелкнем по Refresh variables. Это будет обновлять значения переменных в таблице по ходу выполнения программы. Будем давить по Step into Code и смотреть на значение переменной Counter:
Нажмем Run program (F5) и будем следить, как значение переменной увеличивается до 255, после чего она переполняется и становится равна 0. Вкладка Locals может отображать значения переменных, которые используются локально в подпрограмме или функции. Вкладка Interrupts показывает состояние прерываний. Вы можете принудительно вызвать внешнее прерывание на выводах Int0/Int1.
Маломощные микроконтроллеры AVR
С расширением линейки МК AVR, появилось множество новых моделей контроллеров для выполнения самых разных задач. Одним из направлений стал выпуск линейки ATTiny микроконтроллеров для небольших приложений с низким энергопотреблением. Сам производитель базирует их как "маломощные", но на самом деле это не совсем так. Посмотрим для примера на ATTiny13 в восьмилапом SMD исполнении. У него 1 килобайт программной памяти, 64 байта оперативной памяти и 64 байта EEPROM. Для использования нам доступны 5 лапок ввода/вывода. Хоть контроллер и называется Tiny, но он может работать на скорости до 20 МГц! И его можно программировать точно так же через SPI, как и старших собратьев.
Убедитесь, что вы прочитали даташит ATTiny13.
Соберем следующую схему:
Теперь давайте запрограммируем мигающий светодиод:
Запустим TWinAvr и нажмем Config. Мы увидим настройки фузов для "чистого" ATTiny13:
Мощные микроконтроллеры AVR
Если ваш проект не слишком сложный и запутанный, то наверняка вам подойдет ATTiny2313 или ныне покойный AT90S2313 из дедушкиных запасов. Но если вам нужно много портов ввода/вывода, больше оперативной памяти, EEPROM, да и места под основную программу, вам придется выбрать более навороченный контроллер. Например, я часто пользуюсь ATMega8535, у которого 8 килобайт программной памяти и всевозможные модули. Выпускается он в сорокалапом корпусе. Однако мой самый любимый контроллер, который подходит для практически всех моих проектов - ATMega8. Давайте сравним его с некогда популярным AT90S2313:
С более мощными микроконтроллерами вам возможно придется менять их фузы. По умолчанию ATMega8 работает на внутреннем тактовом генераторе 1 МГц. Если вы хотите использовать внешний генератор, вам нужно установить некоторые фазы. Сначала определим их значения по умолчанию для нового микроконтроллера ATMega8. Соберем на макетной плате такую схему:
Хоть МК и работает на внутреннем генераторе, мы все равно подключим к нему внешний кварцевый резонатор. Запустим TWinAvr и нажмем Config. Посмотрим на настройки фузов по умолчанию: Как показано в даташите на стр. 24, фузы CKSEL3, 2, 1 и 0 должны быть установлены в "1111" для работы с внешним тактовым генератором.
Теперь ваш контроллер будет работь от внешнего резонатора с максимально возможной частотой 16 МГц. Если же вам нужны другие настройки тактовых генераторов, вам следует тщательно ознакомиться с даташитом и расстановкой фузов. Когда TWinAvr считывает значения фузов из чипа в первый раз, тот работает на внутреннем тактовом генераторе в 1 МГц. Хотя TWinAvr общается с контроллером на частоте 4 МГц, все вроде работает, как это ни странно. Но если вы испытываете какие-то проблемы с чтением фузов, попробуйте снизить скорость TWinAvr с 4 до 1 МГц:
Еще два жирных контроллера - ATMega32 и ATMega128. У них 32 КБ и 128 КБ программной памяти соответственно и гораздо больше портов ввода/вывода и периферийных устройств. ATMega32 доступен в DIP исполнении, ATMega128 - только в SMD. Но их можно использовать вот так:
Здесь фузы настроены на работу с внешним тактовым генератором. Фуз CKOPT установлен, чтобы позволить работать микроконтроллеру с максимальной частотой 16 МГц. Фуз M103C не включен, так как мне не нужна совместимость с ATMega103. Иногда случаются страшные и ужасные вещи, если напутать с фузами. Если после манипуляций с тактовыми фузами ваш контроллер перестал включаться и отвечать TWinAvr, вы можете попробовать подключить TTL генератор ко входу XTAL1 чипа. После этого снова проверьте, видить ли он TWinAvr.
Купить
Программаторы, средства разработки и отладки для DSP,
средства разработки и отладки для ПЛИС-ПАИС
При необходимости смените тактовую частоту программы. Если программа увидела чип, снова выставьте фузы и попробуйте запустить контроллер.
Тактовые генераторы для AVR
Мой первый микроконтроллер, с которого я начинал, как и у многих, был AT90S2313-10PI. Число 10 в окончании говорит о том, что контроллер будет гарантированно работать с тактовой частотой 10 МГц. Но, как правило, AVR могут работать на гораздо больших частотах, правда при этом нет гарантии, что всё будет всегда стабильно работать в таких экстремальных условиях при повышении напряжения питания или температуры окружающей среды. Пониженная тактовая частота также может использоваться при работе, но при этом нужно помнить, что для некоторых видов контроллеров при изменении типа тактового генератора или скорости, необходимо правильно выставить фузы.
Стандартный TTL генератор на кварцевом резонаторе может тоже быть использован для этих целей. Подключите его точно так же, как и функциональный генератор. В этом случае вывод XTAL2 контроллера можно использовать в качестве сквозного, т.е. подключить его ко входу XTAL1 другого контроллера:
Так как все контроллеры AVR собраны по КМОП-технологии, вы можете даже остановить тактовый генератор, и контроллер будет находиться в этом состоянии до тех пор, пока не снова не получит тактовые импульсы. Попробуйте использовать функциональный генератор с меандром +5В на выходе в качестве тактового генератора. Подключите его в выводу XTAL1 контроллера. Вывод XTAL2 оставьте неподключенным. Меняйте частоту генератора и следите за результатом. Очень низкие частоты иногда могут быть полезны при разработке или отладке.