Главная - Разное
Мигаем светодиодом 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 , которая модулирует реальную работающую схему.
В AVR Studio 5 редактор, компилятор, отладчик и программатор все в одном флаконе!

Директива – это предписание редактору, с которым мы будем работать. В большинстве своем название директивы и ее функция в разных редакторах совпадают. Например, если сравнить редактор MPLAB IDE для микроконтроллеров PIC, то разницы практически нет!
А вот команды отличаются. Список команд формируется производителем и в какой-то степени зависит от технологии производства. Даже у одного производителя в разных семействах может быть разный список команд по мере изменения их структуры.
Команда – это единичная функция, с помощью которой мы можем управлять микроконтроллером.
Программа - это последовательность команд, соответствующая определенному алгоритму (составленная нами).
Любая программа начинается с “шапки”, где прописывается основные функции программы, ее автор, название контроллера, который будет использоваться, тактовая частота и другие данные. “Шапка” - это “правило хорошего тона” в программировании.
Обычно в “шапке” прописывается файл инициализации.includeххххdef.inc. директивы.device, .list, .nolist, и другие.
В AVR Studio 5 эти директивы прописаны по умолчанию. В предыдущей версии AVR Studio 4 эти директивы нужно было прописывать, поэтому я их оставил в виде комментариев.
Комментарии пишутся произвольно, как вам нравиться и главное, чтобы они для вас оставались понятными. Нередко, из-за неполных комментариев, через некоторый промежуток времени сам автор не может разобраться в собственной программе. Перед комментариями ставиться знак (;) .
Я ввел “шапку” предложенную Джоном Мортоном…

Редактор AVR Studio 5 – понимает написанные, директивы и команды выделяя их в синий цвет, числовые данные остаются черными, непонятные выражения выделяет в красный, комментарии в зеленый.

Прежде чем начать, что-то писать рассмотрим директивы ассемблера микроконтроллеров AVR.
Перед каждой директивой ставиться точка:
Директива Описание.BYTE Резервировать байты в ОЗУ.CSEG Сегмент программы.DB Определить байт – константу во Flash-памяти или EEPROM .DEF Назначить регистру символическое имя.DEVICE Определяет устройство, для которого компилируется программа.DSEG Сегмент данных.DW Определяет слово во Flash-памяти или EEPROM .ENDM Конец макроса.ENDMACRO Конец макроса.EQU Установить постоянное выражение.ESEG Сегмент EEPROM .EXIT Выход из файла.INCLUDE Вложить другой файл.LIST Включить генерацию листинга.LISTMAC Включить разворачивание макросов в листинге.MACRO Начало макроса.NOLIST Выключить генерацию листинга.ORG Установить положение в сегменте.SET Установить для переменной эквивалентное выражение

Полное описание команд и директив ассемблера в русском переводе Руслана Шимкевича можно посмотреть тут:
🕗 24/09/11 ⚖️ 397,28 Kb ⇣ 244 Здравствуй, читатель! Меня зовут Игорь, мне 45, я сибиряк и заядлый электронщик-любитель. Я придумал, создал и содержу этот замечательный сайт с 2006 года.
Уже более 10 лет наш журнал существует только на мои средства.

Хорош! Халява кончилась. Хочешь файлы и полезные статьи - помоги мне!

--
Спасибо за внимание!

Мы еще не раз вернемся к директивам ассемблера, а сейчас попробуем написать небольшой текст программы, где будем включать светодиоды.
Для удобства выберем микроконтроллер ATtiny2313A . Если кто-то пойдет дальше и будет экспериментировать в “железе”, этот контроллер один из самых доступных, очень часто применяется в различных конструкциях, которые можно найти в бескрайних просторах сети.

--
Спасибо за внимание!
Игорь Котов, главный редактор журнала «Датагор»


Нужно лишь распаковать и стартовать его (при условии, что Proteus уже установлен).
Должна появиться вот такая картинка:

Запустим AVR Studio 5 , и в редакторе напишем небольшую программу с подробными комментариями:
.def temp=r16 ; директива.def назначает регистру r16 имя temp ;==================================================== ; Начало программы.cseg ; директива.cseg определяет начало сегмента, где будет расположен; основной код программы. В AVR Studio 5 это директива не; обязательна.org 0 ; начало первой строки программы rjmp Start ; относительный переход к метке Start (в PIC соответствует; команде goto) ; ==================================================== Start: ser temp; устанавливает все биты регистра temp в 1 out DDRB,temp; переводит все биты out DDRD,temp; порта B и D на вывод clr temp; обнуляет регистр temp (устанавливает все биты регистра temp в 0) out PortB,temp; отключает подтягивающие резисторы out PortD,temp; портов B и D Cicle: ldi temp,0b11001100; включает светодиоды out PortB, temp; порта B rjmp Cicle; Возвращаемся к метке Cicle, зацикливаемся

Скомпилируем ее, кликнув по F7
В окошке Output появятся информация о проведенной компиляции, в конце должна быть надпись Build succeeded, которая подтверждает удачную сборку.hex файла.


Этот файл по умолчанию размещен в Моих документах, в проекте 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-битных:

Обратите внимание, что старший байт пишется раньше, младший позже.

r27:r26 называется регистром X,
r29:r28 называется регистром Y,
r31:r30 называется регистром Z
Программа будет так же работать если слово temp будет присвоено любому другому регистру общего назначения от r16 до r31 например.def temp=r20. После компиляции (клавиша F7 в AVR Studio 5), разницы в работе программы никакой нет.
(Можете попробовать, теперь вы знаете, как это сделать!)

Строка:
.cseg ; директива.cseg определяет начало сегмента, где будет расположен основной код программы
В AVR Studio 5 это директива прописана по умолчанию.
В микроконтроллерах AVR выделяют разные области памяти, для хранения программного кода, данных в постоянной памяти или EEPROM, для обозначения этой области существуют директории:
.cseg - Программный сегмент
.dseg – Сегмент данных
.eseg – сегмент EEPROM

Строка:
.org 0 ; начало первой строки программы
Программа начинается со строки указанной директивой.org, и при завершении будет возвращаться к ней.

Строка:
rjmp Start ; относительный переход к метке Start (в PIC соответствует команде goto)
Это команда относительного перехода к метке Start.
Программа выполняется последовательно от верхней стоки к нижней. Если требуется перейти в другую область программы то используется команда rjmp

Строки:
ser temp ; устанавливает все биты регистра temp в 1 clr temp ; обнуляет регистр temp (устанавливает все биты регистра temp в 0)
Команда ser выполняется с регистрами r16…r31, а команда clr может выполнятся ко всем регистрам, в том числе и регистрам ввода-вывода (регистрам специального назначения). Назначение этих регистров мы рассмотрим позже.

Строка:
ldi temp,0b11001100
Команда ldi записывет в регистр temp двоичное число 11001100 (не будет ошибкой если вместо 0b11001100 написать 204 или CCh, в одном случае в десятичной форме в другом в шестнадцатеричной)

Строка:
out DDRB,temp
Команда out выводит значение регистра temp в регистр порта DDRB.

Что такое порт и как он работает?

Если упростить до минимума, то порт можно представить как ножку-вывод микроконтроллера, на который в режиме вывода можно произвольно подать напряжение или отключить, а в режиме ввода определить, есть ли напряжение, поданное извне или нет.
Есть три режима работы порта: это вывод, ввод и отключенное состояние.
Управляют портами регистры PinX, PortX, DDRX.
Х – означает порт, которым управляют эти регистры.
Регистр DDRX управляет режимами ввода-вывода, как реле – включили (записали 1) – подключился на линию вывода, отключили (записали 0) – переключился на линию ввода (по умолчанию).

Чтобы вывести данные в порт Х, нужно регистр DDRX переключить в режим вывода (прописать 1) а данные переслать в регистр PortX.
Считать значение порта Х можно, если регистр DDRX переключить в режим ввода (прописать 0), из регистра PinX. Чтобы подключить подтягивающие резисторы в режиме ввода, надо отправить данные в 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.

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
U1 МК AVR 8-бит

ATmega8535

1 В блокнот
R1-R8 Резистор

220 Ом - 1 кОм

8 В блокнот
R9-R11 Резистор

10 кОм

3 В блокнот
V1-V8 Светодиод 8 В блокнот
Тактовая кнопка 3

На прошлых уроках мы с вами разобрались в том как устроен МК и посмотрели что такое порты ввода/вывода и их альтернативные функции. Давайте попробуем написать простенькую программу "Мигание светодиодом". Писать программу будем на языке С. Конечно многие начнут возмущаться, мол это жлобство, надо только на ассемблере, ну да и бог с ними. Если я начну рассказывать как писать программу на ассемблере, то скорее всего часть из вас просто подумает: "Как тут все заморочено! А ну его к черту". И от части будут правы. Для того чтобы писать программу, нам потребуется специальная программа. Я пользуюсь 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.
Но это еще не все. Теперь давайте попросим программу сгенерить нам наш стартовый код. Для этого жмем на иконку "шестеренка" и дважды под тем же именем, а именно led сохраняем проект. Все. Программа с генерировала нам код и теперь давайте взглянем на него. Расписывать весь код не буду, так как это другая тема, а вот на что мы обратим внимание. Смотрим на картинку ниже. Рисунок 9.
Строка: #include В этой строке мы просим компилятор подключить файл с описаниями всех регистров МК ATmega8. Это сделано для понимания. Что проще понять PORTB или 0x18 . По моему тут все очевидно. Просто в этом файле прописаны эквиваленты понятные простому человеку. Легче понять название порта не же ли его адрес. Строка: PORTB=0x00; Помним, мы хотели чтоб у нас был ноль на выходе по умолчанию, вот он. Правда здесь выстрел и пушки по воробьям, так как это выражение выводит нули в весь порт. А можно по проще PORTB.0=0x00; но это не суть важно. Строка: DDRB=0x01; Вспоминаем предыдущий урок, кто не читал вам сюда . Так как цифра 0x01 в hex равна 0b00000001 и bin. Учимся переводить из шестнадцатеричной системы в двоичную! То мы видим что в нулевой разряд регистра направления DDRB записали 1. То есть будем выводить данные через нулевой разряд порта В . Ну вот, просмотрев код мы убедились что генератор кода с генерировал код как нам надо. Заметьте, очень удобно и быстро. Теперь давайте посмотрим где же нам-то писать код. Для этого бежим вниз до вот этих строк. Рисунок 10.
Да, да. Внутри этого бесконечного цикла и будет наш код. О чем говорит коментарий написанный в теле цикла. Кажется мы хотели поморгать светодиодом. Ну давайте. Так как светодиодом мы будем управлять через нулевой разряд порта "В", то пишем вот такой код. PORTB.0 = 0x01; PORTB.0 = 0x00; Это самый простой способ. Сначала мы записываем в нулевой разряд порта, о чем говорит точка с нулем после порта, единицу, а затем ноль. Вроде светодиод сначала включится, а потом погаснет. А так как это все в бесконечном цикле, то все завертится по кругу. Но к сожалению если мы соберем схему и включим ее, наш светодиод будет гореть постоянно. А почему же, спросите вы. А вот почему. Помните мы выбрали частоту кварца 4 МГц. Во... 4 миллиона импульсов за секунду. И вы хотите уследить за ними. Не получится! Что же делать? А выход есть и даже не один. Вставить паузы длинной, ну к примеру в пол секунды. Вариант первый, использовать аппаратный таймер с прерыванием, но для нашего примера я думаю рановато. Вариант два, мы же работаем в такой замечательной программе как CodeVisionAVR . И для нас сделали хорошую библиотеку полезных функций. И одна из них пауза delay_ms(int x) или delay_us(int x) . Первая задает паузу длинной х миллисекунд, а вторая х микросекунд. Но чтоб ей воспользоваться давайте вернемся на самый верх и после строки #include и напишем под ней #include . Тем самым мы подключили библиотеку и можем смело пользоваться функциями пауз. Давайте допишем наш код. PORTB.0 = 0x01; delay_ms(500); PORTB.0 = 0x00; delay_ms(500); Теперь собираем наш проект. Project->Build All После сборки мы увидим окно Рисунок 11. в котором говорится, что все сделано без ошибок и нет предупреждений. Две строки No errors No warnings Рисунок 12. Вот и все. Для тех кто все же не понял что куда подключать. Рисунок 13.
На схеме отсутствуют питание, кварц и конденсаторы. Я их не стал рисовать так как мы про них уже распинались в предыдущих уроках. Просто эта обвязка обязательна в любом проекте и в дальнейшем не будем рисовать, а при сборке не забудем о них. В следующем уроке мы сваяем программатор и прошьем наш МК.

 


Читайте:



Программы для очистки компьютера от ненужных файлов Скачать программу для очистки компьютера виндовс 10

Программы для очистки компьютера от ненужных файлов Скачать программу для очистки компьютера виндовс 10

«Чистилка» для Windows 10 – это программа, позволяющая совершать очистку системы от вредоносного ПО, вирусной рекламы, всплывающих окон в браузере...

Удержание предметов в Steam Как узнать на сколько дается бан трейда

Удержание предметов в Steam Как узнать на сколько дается бан трейда

Предисловие В конце ноября 2015 г. стало известно о том, что Valve собирается ввести сервис «Escrow» в системе обмена Steam. Информация появилась...

Прошивка планшетов: пошаговая инструкция

Прошивка планшетов: пошаговая инструкция

Большинство владельцев ультрамодных смартфонов телефона или смартфона DNS модель s s4003 на операционной системе Android 4.1 с экраном цветной TFT,...

Huawei Firmware Finder – программа поиска прошивок для смартфонов Huawei и Honor Как перепрошить телефон хайвей

Huawei Firmware Finder – программа поиска прошивок для смартфонов Huawei и Honor Как перепрошить телефон хайвей

Huawei - известная китайская компания-производитель смартфонов. Бренд не только популярен в Китае, но и имеет хорошую долю рынка в мире. Как и...

feed-image RSS