Разделы сайта
Выбор редакции:
- Обзор Sony Z5 Compact: компактный флагман Сони иксперия z5 компакт премиум обзор
- Как удалить пустые строки в Excel
- Подключение светодиодов к микроконтроллеру AVR
- Как преобразовать JPG файлы в меньший размер без потери качества
- Что представляет собой распайка USB-разъема
- Восстановление MicroSD карты памяти
- Как посмотреть исходный код страницы в Google Chrome
- Способы установить приложения Android (установить APK)
- Карта базовых станций сотовых операторов или самостоятельный поиск их расположения и координат
- Радиосвязь Кодирование одним символом двух бит передаваемой информации
Реклама
Мигаем светодиодом atmega8. Подключение светодиодов к микроконтроллеру AVR. Что такое порт и как он работает |
При написании программы часто возникает необходимость в формировании определенного интервала времени между отдельными командами. Наглядным примером тому может послужить гирлянда, в которой лампочки загораются в определенной последовательности через промежутки времени. В нашем случае для индикации задержки времени будем использовать мигающий светодиод, а лучше два и разного цвета. Мы будем управлять длительностью их включения и выключения, т. е. изменять частоту мигания. Большинство команд микроконтроллеров AVR выполняются в один такт генератора задающей частоты. В качестве которого широко используют встроенную в МК RC-цепочку или подключают к выводам XTAL1 и XTAL2 кварцевый резонатор. Например, если МК работает с частотой 1 Гц, то одна команда будет выполняться за одну секунду По умолчанию у МК ATmega8 задействован собственный внутренний генератор частоты, а точнее RC-цепочка, которая работает на частоте 1000 000 Гц = 1 МГц. Поэтому время выполнения одной команды равно: Из этого следует, что если мы запишем подряд две команды, каждая из которых засветит отдельный светодиод, то визуально мы увидим, что они оба засветились одновременно. #include
int main (void ) DDRD = 0b000000011; while (1) PORTD = 0b000000001; // Подаем питание на 1-й светодиод PORTD = 0b000000010; // Подаем питание на 2-й светодиод Но на самом деле второй LED загорится с разницей во времени 0,000001 секунды от первого. Наши глаза не могут заметить такой малой разницы во времени. Уже при частоте изображений более 24 Гц (t = 1/24 ≈ 0,042 с) наше зрение формирует из отдельных картинок непрерывный фильм. Поэтому в большинстве случаев мы не различаем 25-й кадр. Для того, чтобы оба светодиода засветились с разницей во времени 0,5 секунды необходимо между соответствующими двумя командами (PORTD = 0b000000001; и PORTD = 0b000000010; ) поместит еще 500 000 однотактных пустых команд, т. е. заставить МК полсекунды не выполнять никаких полезных действий. Или, как говорят, нужно “убить” 500 000 тактов. Если код пишется на Ассемблере, то программисты применяют различных циклы, которые “съедают” определенное число тактов и тем самым получают различные интервалы времени. #include
int main (void ) DDRD = 0b000000011; while (1) PORTD = 0b000000001; // Подаем питание на 1-й светодиод Для получения задержки 0,5 секунды сюда нужно вставить 500 000 однотактных команд PORTD = 0b000000010; // Подаем питание на 2-й Функция _delay_ms() и мигающий светодиодПри написании кода на Си в Atmel Studio имеется очень удобная функция _delay_ms
()
. Для работы данной функции ее необходимо предварительно подключить директивой препроцессора В круглых скобках данной функции можно задавать время в миллисекундах, тогда перед скобками нужно записать ms, или в микросекундах – us: При использовании данной функции для того, чтобы при компиляции Atmel Studio не выдавала никаких предупреждений, следует объявить частоту с помощью оператора #define . Так как по умолчанию для ATmega8 она равна 1 000 000 Гц, то это значение мы и объявим. Это делается следующей строкой: #define F_CPU 1000000UL В дальнейшем, когда мы будем подключать к МК кварцевый резонатор, без данной строки уже не обойтись. Структура ее останется прежней, только вместо 1 000 000 нужно будет записать частоту кварцевого резонатора. Давайте улучшим нашу программу, так, чтобы сначала загорался один светодиод, затем через полсекунды он гаснул и еще через полсекунды загорался второй и снова через 0,5 с гаснул. # defineДавайте посмотрим на код, приведенной выше, еще раз. Если нам необходимо изменить значение задержки времени в функции _ delay из 500, например на 300, то мы должны отыскать все строки с ее именем и выполнить соответствующую замену. Теперь представим, что таких строк сотня, а то и тысяча. Изменять значение каждого числа по отдельности крайне неудобно и долго. К тому же можно случайно пропустить строку. Поэтому необходимо применять другой, более удобный и практичный подход. Таких подходов существует несколько. Самый простой – это объявить переменную и присвоить ей нужное значение. Далее эта переменная подставляется в соответствующие функции. Это хороший способ. В дальнейшем мы его рассмотрим детальнее. Сейчас же мы рассмотрим еще более лучший! С помощью оператора #define мы присвоим числовому значению какое-либо имя. Это имя называется константа . В отличие от переменной, константа не может изменяться в программе. Выглядит это так: #define MIG 300 _ delay _ ms (MIG); Имя константы можно задавать практически любым, используя латинские символы и цифры. В данном случае имя MIG говорит о том, что мы применяем задержку для миг ания светодиодами. После строки с директивой препроцессора #define точка с запятой не ставится. Между именем константы и числовым значением ставится пробел. Данная строка работает следующим образом. Перед началом компиляции выполняется замена числом 300 всех констант с именем MIG. #define и регистрыТакже оператор #define хорош тем, что с помощью него можно задавать имена регистрам. Например, если мы подключаем к порту D светодиоды, то вместо PORTD мы можем записать, например VD: #define VD PORTD VD = 0b00000001; Давайте перепишем программу, применяю директиву #define : #define F_CPU 1000000UL #include
#include
Пишем первую программу!Большинство начинают с мигания светодиодов, и мы не исключение. Если микроконтроллер, даже самый быстрый, не “общается” с внешним миром, ценность его сводится к нулю. Нам нужно чтобы микроконтроллер принял информацию, обработал по заданному алгоритму и выдал результат в понятной для нас форме.Алгоритм
, (от имени персидского математика аль-Хорезми) - точный набор инструкций, описывающих порядок действий исполнителя для достижения результата решения задачи за определенное время. Вообще, написать программу можно в любом текстовом редакторе, так же как вы бы написали письмо другу, например. После этого, текст надо скомпилировать (иногда говорят - ассемблировать) т.е. перевести в форму, понятную процессору. Раньше, расширение текстового файла.txt переименовывали в.asm и обрабатывали специальной программой, называемой компилятором. Суть работы компилятора в переводе письменных символов понятных для человека в машинный код (в код нулей и единиц) и создание нового файла с расширением.hex Что делать с этим.hex файлом? А он нужен для программатора, чтобы записать код программы в ПЗУ (постоянное запоминающее устройство) микроконтроллера. Мы вместо программатора будем использовать программу Proteus
, которая модулирует реальную работающую схему. Директива
– это предписание редактору, с которым мы будем работать. В большинстве своем название директивы и ее функция в разных редакторах совпадают. Например, если сравнить редактор MPLAB IDE
для микроконтроллеров PIC, то разницы практически нет! Редактор AVR Studio 5 – понимает написанные, директивы и команды выделяя их в синий цвет, числовые данные остаются черными, непонятные выражения выделяет в красный, комментарии в зеленый. Прежде чем начать, что-то писать рассмотрим директивы ассемблера микроконтроллеров AVR. Полное описание команд и директив ассемблера в русском переводе Руслана Шимкевича
можно посмотреть тут: Хорош! Халява кончилась. Хочешь файлы и полезные статьи - помоги мне!
-- Мы еще не раз вернемся к директивам ассемблера, а сейчас попробуем написать небольшой текст программы, где будем включать светодиоды.
-- Нужно лишь распаковать и стартовать его (при условии, что Proteus уже установлен). Должна появиться вот такая картинка: Запустим AVR Studio 5
, и в редакторе напишем небольшую программу с подробными комментариями: Скомпилируем ее, кликнув по F7 Этот файл по умолчанию размещен в Моих документах, в проекте AVR Studio 5. Переходим в Proteus
, кликаем на рисунок контроллера и вводим путь, где находиться.hex файл: Запускаем эмуляцию программы. Чтобы остановить эмуляцию – кликаем Стоп. Если прошить микроконтроллер программатором и собрать схему, то результат будет таким-же. Попробуем разобраться, с программой:Строка:.def temp=r16 ; директива.def назначает регистру r16 имя temp Для удобства мы назначили регистру r16 имя temp, это значит что в любом месте программы, при написании слова temp программа будет обращаться к регистру r16. Что это за регистр – r16? Он относится к регистрам общего назначения, которые обозначаются как r0….r31, т.е их всего 32 по 8 бит. Вторая половина регистров общего назначения r16…r31 выполняют функцию временного хранения информации (как аккумуляторы, могут принимать и могут отдавать информацию, для сравнения - у PIC контроллеров всего один аккумулятор W). Последние 6 регистров общего назначения условно объединены в три 16-битных: Обратите внимание, что старший байт пишется раньше, младший позже. Строка:
Строка:
Строка:
Строки:
Строка:
Строка:
Что такое порт и как он работает?Если упростить до минимума, то порт можно представить как ножку-вывод микроконтроллера, на который в режиме вывода можно произвольно подать напряжение или отключить, а в режиме ввода определить, есть ли напряжение, поданное извне или нет.Есть три режима работы порта: это вывод, ввод и отключенное состояние. Управляют портами регистры PinX, PortX, DDRX. Х – означает порт, которым управляют эти регистры. Регистр DDRX управляет режимами ввода-вывода, как реле – включили (записали 1) – подключился на линию вывода, отключили (записали 0) – переключился на линию ввода (по умолчанию). Чтобы вывести данные в порт Х, нужно регистр DDRX переключить в режим вывода (прописать 1) а данные переслать в регистр PortX. Читательское голосованиеСтатью одобрили 23 читателя.Для участия в голосовании зарегистрируйтесь и войдите на сайт с вашими логином и паролем.На этом уроке Вы научитесь программировать свою плату Arduino на примере мигания встроенным светодиодом. Необходимые элементыДля данного примера Вам понадобится плата Arduino (в данном случае – Arduino Uno R3 , но Вы сможете проработать данный пример, имея в наличии и другую плату) и кабель USB (типа A (4х12 мм) – B (7х8 мм) – более подробно можно почитать на Вики). Что такое ” L” светодиодНа Arduino Uno присутствуют ряды коннекторов типа мама по бокам платы, которые используются для подключения периферийных электронных устройств или “шилдов” . Кроме того, на плате присутствует встроенный светодиод (англ. – LED), которым Вы можете управлять с помощью скетчей. Этот встроенный светодиод условно назовем “L” светодиод, как это принято на многих англоязычных ресурсах. Расположение данного светодиода на плате отмечено на фото снизу. Загрузка примера “Blink” (мигание) в Arduino IDEПри подключении новой платы к персональному компьютеру, обратите внимание, что светодиод начинает мигать, так как все платы от производителей поступают с уже “залитым” скетчем “Blink ”. На этом уроке мы перепрограммируем нашу плату, изменив частоту мигания светодиода. Не забудьте настроить оболочку Arduino IDE и выбрать нужный серийный порт, по которому Вы подключили Вашу плату. Пришло время проверить Ваше подключение и запрограммировать плату. В оболочке Arduino IDE существует большая коллекция скетчей, которые уже готовы к использованию. Среди них находится и пример, который заставляет мигать “L” светодиод. Откройте пример “Blink”, который находится в пункте меню File – Examples – 01.Basics После открытия, расширьте окно оболочки Arduino IDE, чтобы Вы могли весь скетч в одно окне. Скетчи из примеров, включенные в Arduino IDE предусматривают режим “только чтение” (“read only”). То есть, загрузить их на плату Вы сможете, но после изменения кода, Вы не сможете их сохранить в том же файле. Мы будем изменять скетч, так что в первую очередь Вам необходимо сохранить собственную копию, которую Вы сможете изменять. Вы сохранили копию скетча “Blink” в Вашей библиотеке. Теперь открыть этот файл Вы можете в любой момент, перейдя по вкладке File – Scetchbook. Загрузка примера “Blink” (мигание) на платуПодключите свою плату Arduino к компьютеру с помощью USB и проверьте тип платы (“Board type”) и серийный порт (“Serial Port”), по которому она подключена. Текущие настройки отображаются внизу окна оболочки Arduino IDE Кликните на кнопку “Загрузить” (“Upload”) Во время загрузки в нижней части окна IDE появятся ползунок загрузки и сообщения. Вначале появляется фраза “Компилирование” (“Compiling scetch..”), что означает процесс конвертирования Вашего скетча в формат, подходящий для загрузки на плату Arduino. В конце статус сменится на ”Загрузка завершена” (“Done uploading”). В сообщении, которое появится в текстовой строке отобразится информация о том, что загруженный скетч занимает 1,084 байта из 32,256 доступных. Иногда при компиляции у Вас может возникнуть подобная ошибка: Причин может быть несколько: Вы не подключили плату к компьютеру; Вы не установили необходимые драйвера; Вы выбрали некорректный серийный порт. Пояснения к скетчу “Blink”Ниже представлен код скетча “Blink”. Turns on an LED on for one second, then off for one second, repeatedly. This example code is in the public domain. // Pin 13 has an LED connected on most Arduino boards. // give it a name: pinMode(led, OUTPUT); delay(1000); // wait for a second Первое, на что стоит обратить внимание: в данном скетче множество “комментариев”. Обратите внимание, что комментарии не являются инструкцией по работе программы. Это исключительно пояснения отдельных функций и задач, которые выполняются на определенном этапе кода. Это не обязательная часть кода. Все между символами /* и */ в верхней части скетча – это комментарии, в которых описаны задачи программы. Так же есть комментарии, которые ограничиваются одной строкой. Они начинаются с символов // и заканчиваются по умолчанию в конце строки. Первая важная, по сути, часть данного кода это строка: В комментариях над строкой указано, что мы присваиваем имя пину, к которому подключен светодиод. На большинстве плат Arduino это будет 13 пин. Дальше используется функция “Setup”. Опять-таки, в комментариях указано, что функция срабатывает после нажатия кнопки “reset”. Также эта функция срабатывает, когда плата перезагрузится по каким-либо другим причинам. Например, подача питания или после загрузки скетча. // the setup routine runs once when you press reset: // initialize the digital pin as an output. pinMode(led, OUTPUT); Каждый скетч Arduino обязан включать в себя функцию “setup” и часть, в которую вы можете добавлять собственные инструкции, заключенные между { }. В нашем примере в функции присутствует только одна команда, в которой указано, что пин, который мы используем, настраивается на “вывод” (“Output”). Также обязательным для любого скетча является функция цикла “Loop”. В отличие от функции “Setup ”, которая отрабатывает один раз после перезагрузки, функция “Loop” после окончания работы команд, вновь запустится. // the loop routine runs over and over again forever: digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(led, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second В теле функции “Loop” светодиод включается (HIGH), данное значение задерживается на 1000 миллисекунд (1 секунда), светодиод отключается (LOW) и остается выключенным на 1 секунду, после чего цикл повторится. Изменение частоты мигания светодиодаДля того, чтобы обеспечить более частое мигание светодиода, необходимо изменить параметр, указываемый в скобках () в команде “delay ”. Как уже было указано, период задержки указывается в миллисекундах. То есть, для того, чтобы заставить светодиод мигать в два раза чаще, необходимо изменить значение с 1000 на 500. В результате, пауза между включением/выключением светодиода составит половину секунды и светодиод будет мигать быстрее. Для проверки, не забудьте загрузить измененный скетч на плату Arduino. В статье будет рассмотрено подключение светодиодов к микроконтроллеру, работа с портами и написание программы на СИ. Статья, прежде всего, предназначена новичкам, которые только взялись за микроконтроллеры AVR. Для начала нужно выбрать микроконтроллер. В моем случае это ATmega8535. В данном случае микроконтроллер можно брать любой, так как данная задача легко реализуется под любой МК. Писать программу для микроконтроллера можно на Ассемблере, СИ, Pascal-е и Bascom. Я использовал язык СИ, все эти языки разные. //Мигающий светодиод void main() { ddrB = 0b11111111; //задаём порты B на выход portB = 0b11111111; //по умолчанию всё выключено while(1) { portB = ˜portB; //переключаем состояние светодиода на обратное delay_ms(100); //делаем задержку на 100 миллисекунд } } Program First; begin ddrB:= $FF; //задаём порт B на выход portB:= $FF; //по умолчанию ничего не горит while(1) do begin portB:= not(portB); //переключаем состояние светодиода на обратное delay_ms(100); //делаем небольшую задержку end; end. Список радиоэлементов
На прошлых уроках мы с вами разобрались в том как устроен МК и посмотрели что
такое порты ввода/вывода и их альтернативные функции. Давайте попробуем написать
простенькую программу "Мигание светодиодом". Писать программу будем на языке С.
Конечно многие начнут возмущаться, мол это жлобство, надо только на ассемблере, ну
да и бог с ними. Если я начну рассказывать как писать программу на ассемблере, то
скорее всего часть из вас просто подумает: "Как тут все заморочено! А ну его к
черту". И от части будут правы. Для того чтобы писать программу, нам потребуется
специальная программа. Я пользуюсь CodeVisionAVR V2.04.4a
и найти его
можно . Или прямо у нас на сайте, это . Надеюсь что с установкой вопросов не
возникнет. Запускаем программу.
Рисунок 1.
Теперь давайте создадим новый проект. Для этого нажимаем File->New
.
Рисунок 2.
Появится вот такое окно.
Рисунок 3.
Ну тут все понятно, выбираем Project и давим "Ок". И снова вопрос.
Рисунок 4.
Здесь программа предлагает вам запустить генератор кода. Для начала, а может и
всегда, тут уж сами решайте, давим "Yes".
Рисунок 5.
Вот здесь мы с вами остановимся по подробнее. Это окно, как раз и есть тот самый
генератор кода. Здесь мы выбираем что будет проинициализировано МК перед
выполнением основной программы. Начнем с вкладки Chip
.
Ну тут я думаю все понятно. Выбираем наш контроллер, а именно как с вами
договорились, ATmega8 и частоту кварца 4 МГц.
Рисунок 6.
Больше в этой вкладке ничего трогать не надо. Переходим в вкладку Ports
.
Рисунок 7.
Здесь выбираем Port B
и нулевой бит меняем с In
на Out
. Значение по
умолчанию на выходе оставим 0. Это значит что при первом старте МК на порту B в
нулевом разряде будет висеть логический ноль. В общем смотрите на рисунок выше.
Более подробно по настройкам я напишу в отдельных статьях по программированию в
среде CodeVisionAVR
, а сейчас у нас задача поморгать светодиодом. Ну
вроде ничего не забыли. Далее надо сохранить наш проект. Для этого жмем на иконку
дискетки и выбираем путь куда сохраним наш проект. Я выбрал так:
C:/my_cvavr/project_led
, а проект назвал led
. Получилось как-то так.
Рисунок 8.
|
Популярное:
Новое
- Как удалить пустые строки в Excel
- Подключение светодиодов к микроконтроллеру AVR
- Как преобразовать JPG файлы в меньший размер без потери качества
- Что представляет собой распайка USB-разъема
- Восстановление MicroSD карты памяти
- Как посмотреть исходный код страницы в Google Chrome
- Способы установить приложения Android (установить APK)
- Карта базовых станций сотовых операторов или самостоятельный поиск их расположения и координат
- Радиосвязь Кодирование одним символом двух бит передаваемой информации
- Универсальная система автоматизированного проектирования, строительная конфигурация Работа с многолистовыми чертежами