Atmega48, atmega88, atmega168

Содержание

Средства разработки

Аппаратные средства разработки

Плата разработчика Atmel STK500

AVR Dragon с интерфейсом внутрисхемного программирования, а также добавленной ZIF-панелькой под ИМС.

AVRISP mkII-ISP-Programmer от Atmel

Официальные средства разработки для AVR от Atmel:

  • STK600 starter kit
  • STK500 starter kit
  • STK200 starter kit
  • AVRISP and AVRISP mkII
  • AVR Dragon
  • USBasp — USB
  • JTAGICE mkI
  • JTAGICE mkII
  • JTAGICE3
  • ATMEL-ICE
  • AVR ONE!
  • Butterfly demonstration board
  • AT90USBKey
  • Raven wireless kit

Также существует много сторонних средств, особенно любительских.

Свободные

  • Algorithm Builder — алгоритмическая среда разработки программного обеспечения для микроконтроллеров с архитектурой AVR (последнее обновление в 2010 г).
  • AVR-Eclipse — плагин для среды разработки Eclipse, позволяющий разрабатывать программы на С/С++ и ассемблере, программировать и отлаживать контроллеры, используя внешний набор инструментов (Atmel AVR Toolchain, WinAVR)
  • avra — консольный макро-ассемблер для Linux/MacOS.
  • Avrdude — средство для прошивки микроконтроллеров.
  • AVRDUDE_PROG 3.1 — визуальный редактор.
  • Code::Blocks — кроссплатформенная среда разработки.
  • DDD — графический интерфейс к avr-gdb.
  • eXtreme Burner — AVR — графический интерфейс для USBasp-based USB AVR программаторов.
  • Khazama AVR Programmer — графический интерфейс в Windows для USBasp и avrdude.
  • PonyProg — универсальный программатор через LPT-порт, COM-порт (поддерживается и USB-эмулятор COM-порта).
  • V-USB — программная реализация протокола USB для микроконтроллеров AVR.
  • WinAVR — программный пакет под Windows, включающий в себя компилятор, ассемблер, компоновщик и другие инструменты.
  • Zadig 2.3

Проприетарные

  • Atmel Studio — бесплатная IDE от самой Atmel
  • IAR AVR — коммерческая среда разработки для микроконтроллеров AVR
  • Bascom-avr — среда разработки, основанная на Basic-подобном языке программирования.
  • CodeVisionAVR — компилятор C и программатор — CVAVR, генератор начального кода.
  • Proteus — симулятор электрических цепей, компонентов, включая различные МК и другое периферийное оборудование.

Также архитектура AVR позволяет применять операционные системы при разработке приложений, например, FreeRTOS, uOS, ChibiOS/RT, scmRTOS(C++), TinyOS, Femto OS и др, а также Linux на AVR32.

Схема первая

С помощью этого программатора можно прошивать практически любой AVR-контроллер от ATMEL, надо только свериться с распиновкой микросхемы.

СОМ-разъем на схеме — это «мама».

На всякий случай привожу разводку печатной платы для атмеги8 (скачать), хотя такую примитивную схему проще нарисовать от руки. Плату перед печатью нужно отзеркалить.

Файл печатной платы открывать с помощью популярной программы Sprint Layout (если она у вас еще не установлена, то качайте 5-ую версию или лучше сразу 6-ую).

Как понятно из схемы, для сборки программатора потребуется ничтожно малое количество деталек:

Вместо КТ315 я воткнул SMD-транзистор BFR93A, которые у меня остались после сборки микромощных радиомикрофонов.

А вот весь программатор в сборе:

Питание (+5В) я решил брать с USB-порта.

Если у вас новый микроконтроллер (и до этого никто не пытался его прошивать), то кварц с сопутствующими конденсаторами можно не ставить. Работа без кварцевого резонатора возможна благодаря тому, что камень с завода идет с битом на встроенный генератор и схема, соответственно, тактуется от него.

Если же ваша микросхема б/у-шная, то без внешнего кварца она может и не запуститься. Тогда лучше ставьте кварц на 4 МГц, а конденсаторы лучше на 33 пФ.

Как видите, я кварц с конденсаторами не ставил, но на всякий случай предусмотрел под них места на плате.

Заливать прошивку лучше всего с помощью программы PonyProg (скачать).

Прошивка с помощью PonyProg

Заходим в меню Setup -> Calibration -> Yes. Должно появиться окошко «Calibration OK».

Далее Setup -> Interface Setup. Выбираем «SI Prog API» и нужный порт, внизу нажимаем «Probe», должно появиться окно «Test OK». Далее выбираем микроконтроллер «Device -> AVR micro ATmega8».

Теперь втыкаем микроконтроллер в панельку программатора, и подаем питание 5 вольт (можно, например, от отдельного источника питания или порта ЮСБ). Затем жмем Command -> Read All.

После чтения появляется окно «Read successful». Если все ок, то выбираем файл с нужной прошивкой для заливки: File -> Open Device File. Жмем «Открыть».

Теперь жмем Command -> Security and Configuration Bits и выставляем фьюзы, какие нужно.

Тщательно все проверяем и жмем «OK». Далее нажимаем Command -> Write All -> Yes. Идет прошивка и проверка. По окончании проверки появляется окно «Write Successful».

Вот и все, МК прошит и готов к использованию!

Имейте в виду, что при прошивке с помощью других программ (не PonyProg) биты могут быть инверсными! Тогда их надо выставлять с точностью до наоборот. Определить это можно, считав фьюзы и посмотрев на галку «SPIEN».

Светодиодная УФ-лампа для изготовления печатных плат

Опубликовано вс, 09/20/2015 — 17:50 пользователем trol

Решил соорудить себе светодиодныю лампу для экспонирования фоторезиста и паяльной маски. Для чего на алиэкспрессе были закуплены в количестве 500 штук
5мм-светодиоды на 2000 милликандел с длиной волны около 400нм.
Питать их решил от блока питания с напряжением 12В. Т.к. на одном светодиоде падает напряжение около 3.5В, то соединять их надо в цепочки по 3
штуки и для тока через светодиод около 20мА сопротивление токоограничивающего резистора будет 68 Ом.

Светодиодную матрицу решил делать размерами 18 х 26 светодиодов с шагом между ними в 1 см. Матрица собрана на двух одиноковых печатных платах
(18 х 13 светодиодов в каждой).

Корпус для лампы фабричный, алюминиевый. Был куплен в «Ашане» занедорого, там он более известен под кодовым названием «противень для выпекания
пирогов» :).

Проекты на основе Arduino ATmega

Микроконтроллер в современной электронике – основа для любого устройства, начиная от простой мигалки на светодиодах, до универсальных измерительных приборов и даже средств автоматизации производства.

Пример 1

Можно сделать тестер с 11 функциями на микроконтроллере atmega32.

Устройство имеет крайне простую схему, в которой использовано немногим более дюжины деталей. Однако вы получаете вполне функциональный прибор, которым можно производить измерения. Вот краткий перечень его возможностей:

  1. Прозвонка цепи с возможностью измерять падение напряжения на переходе диода.
  2. Омметр.
  3. Измеритель ёмкости.
  4. Измерение активного сопротивления конденсатора или ESR.
  5. Определение индуктивности.
  6. Возможность счёта импульсов.
  7. Измерение частоты – пригодится в диагностике, например, для проверки ШИМ источника питания.
  8. Генератор импульсов – тоже полезен в ремонте.
  9. Логический анализатор позволит просмотреть содержимое пачек цифровых сигналов.
  10. Тестер стабилитронов.

Пример 2

Для радиолюбителей будет полезно иметь качественное оборудование, но станция стоит дорого. Есть возможность собрать паяльную станцию своими руками, для этого нужна плата Arduino, имеющая в своем составе микроконтроллер atmega328.

https://youtube.com/watch?v=iICWo_Us77g

Пример 3

Для продвинутых радиолюбителей есть возможность собрать более чем бюджетный осциллограф. Мы опубликуем данный урок в дальнейших статьях.

Для этого вам понадобится:

  1. Arduino uno или atmega
  2. Tft дисплей 5 дюйма.
  3. Небольшой набор обвязки.

Или его упрощенный аналог на плате Nano и дисплее от nokia 5110.

https://youtube.com/watch?v=WzzBWPYStcU

Такой осциллографический пробник станет полезным для автоэлектрика и мастера по ремонту радиоэлектронной аппаратуры.

Пример 4

Бывает, что управляемые модули удалены друг от друга или возможностей одной ардуино не хватает – тогда можно собрать целую микроконтроллерную систему. Чтобы обеспечить связь двух микроконтроллеров стоит использовать стандарт RS 485.

На фото приведен пример реализации такой системы и ввода данных с клавиатуры.

Общие принципы работы радиочастотных модулей на 433 МГц

Это самые дешевые из существующих передающие и приемные модули, работающие на частоте 433 МГц. Эти модули передают/принимают данные в последовательном виде по одному радиоканалу.

В спецификации на эти модули указано, что передатчик работает при входном напряжении 3.5-12В и способен передавать данные на дистанцию 20-200 метров. Он использует амплитудную модуляцию (АМ) на частоте 433 МГц. С его помощью можно передавать данные со скоростью 4 Кбит/с с выходной мощностью 10 мВт.

На рисунке выше представлена распиновка контактов передающего модуля. Слева направо мы видим такие контакты как VCC (питание), DATA (данные) and GND (земля). Мы также можем добавить антенну и присоединить (припаять) ее к точке крепления, обозначенной на рисунке.

Приемный модуль работает при напряжении питания 5В и имеет ток покоя 4 мА. Частота приема — 433.92 МГц, чувствительность – минус 105 дБ.

На представленном рисунке можно увидеть распиновку контактов приемного модуля. Слева направо это такие контакты как VCC, DATA, DATA and GND. Средние два контакта (DATA) соединены внутри. Можно использовать только один из этих контактов или сразу два. Но лучше использовать сразу два чтобы уменьшить уровень шумов.

Катушка переменной индуктивности в центре модуля в центре приемного модуля используется для подстройки частоты. Если мы не можем принимать данные это может быть следствием того, что частоты передатчика и приемника не совпадают. Поэтому мы можем изменять частоту настройки приемника чтобы добиться полного соответствия частот. Также как и на передающем модуле, на приемном модуле есть точка для крепления антенны – мы можем прикрепить туда внешнюю антенну чтобы увеличить дальность связи.

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

Генератор тактовой частоты

Но самым важным для нас в настоящее время является блок «Oscillator Circuits/Clock Generation» (Схема генератора/Генератор тактовой частоты).

В программе часто возникает необходимость сделать временную задержку в ее выполнении — паузу. А точную паузу можно организовать только методом подсчета времени. Время считаем исходя из количества тактов генератора микроконтроллера.

Да и не лишним будет заранее просчитать: успеет ли МК выполнить тот или иной фрагмент программы за отведенное для этого время.

В даташите ищем соответствующую главу: «System Clock and Clock Options» (Тактовый генератор и его параметры). В ней видим раздел «Clock Sources» (Источники тактового сигнала), в котором имеется таблица с перечнем видов тактовых сигналов. В этом разделе указано, что данный МК имеет встроенный тактовый RC-генератор. В разделе «Default Clock Source» имеется указание о том, что МК продается уже настроенным для использования встроенного RC-генератора. При этом тактовая частота МК — 1 МГц.

Из раздела «Calibrated Internal RC Oscillator» (Калиброванный RC-генератор) узнаем, что встроенный RC-генератор имеет температурный дрейф в пределах 7,3 — 8,1 МГц. Может возникнуть вопрос: если частота встроенного тактового генератора 7,3 — 8,1 МГц, то как была получена частота 1 МГц? Дело в том, что тактовый сигнал попадает в схемы микроконтроллера через программируемый делитель частоты (Об это рассказано в разделе «System Clock Prescaler»).

В данном микроконтроллере он имеет несколько коэффициентов деления: 1, 2, 4 и 8. При выборе первого мы получим частоту самого тактового генератора, при включении последнего — в 8 раз меньше, т.е., 8/8=1 МГц. С учетом вышесказанного получаем, что тактовая частота данного МК при включенном делителе с коэффициентом 8 будет в пределах от 7,3/8 = 0,9125 МГц (9125 КГц) до 8,1/8 = 1,0125 МГц.

Обратите внимание на один ну очень важный факт: стабильность частоты дана при температуре МК 25 градусов по шкале Цельсия. Вспомним, что внутренний генератор выполнен по RC схеме

А емкость конденсатора очень зависит от температуры!

Семейства микроконтроллеров

Стандартные семейства:

  • tinyAVR (ATtinyxxx):
    • Флеш-память до 16 КБ; SRAM до 512 Б; EEPROM до 512 Б;
    • Число линий ввода-вывода 4-18 (общее количество выводов 6-32);
    • Ограниченный набор периферийных устройств.
  • megaAVR (ATmegaxxx):
    • Флеш-память до 256 КБ; SRAM до 16 КБ; EEPROM до 4 КБ;
    • Число линий ввода-вывода 23-86 (общее количество выводов 28-100);
    • Аппаратный умножитель;
    • Расширенная система команд и периферийных устройств.
  • XMEGA AVR (ATxmegaxxx):
    • Флеш-память до 384 КБ; SRAM до 32 КБ; EEPROM до 4 КБ;
    • Четырёхканальный DMA-контроллер;
    • Инновационная система обработки событий.

Как правило, цифры после префикса обозначают объём встроенной flash-памяти (в КБ) и модификацию контроллера. А именно — максимальная степень двойки, следующая за префиксом, обозначает объём памяти, а оставшиеся цифры определяют модификацию (напр., ATmega128 — объём памяти 128 КБ; ATmega168 — объём памяти 16 КБ, модификация 8; ATtiny44 и ATtiny45 — память 4 КБ, модификации 4 и 5 соответственно).[источник не указан 3304 дня]

На основе стандартных семейств выпускаются микроконтроллеры, адаптированные под конкретные задачи:

  • со встроенными интерфейсами USB, CAN, контроллером LCD;
  • со встроенным радиоприёмопередатчиком — серии ATAxxxx, ATAMxxx;
  • для управления электродвигателями — серия AT90PWMxxxx;
  • для автомобильной электроники;
  • для осветительной техники.

Кроме указанных выше семейств, ATMEL выпускает 32-разрядные микроконтроллеры семейства AVR32, которое включает в себя подсемейства AT32UC3 (тактовая частота до 66 МГц) и AT32AP7000 (тактовая частота до 150 МГц).

Версии контроллеров

AT (mega/tiny)xxx — базовая версия.
ATxxxL — версии контроллеров, работающих на пониженном (Low) напряжении питания (2,7 В).
ATxxxV — версии контроллеров, работающих на низком напряжении питания (1,8 В).
ATxxxP — малопотребляющие версии (до 100 нА в режиме Power-down), применена технология picoPower (анонсированы в июле 2007), повыводно и функционально совместимы с предыдущими версиями.
ATxxxA — уменьшен ток потребления, перекрывается весь диапазон тактовых частот и напряжений питания двух предыдущих версий (также, в некоторых моделях, добавлены новые возможности и новые регистры, но сохранена полная совместимость с предыдущими версиями). Микроконтроллеры «А» и «не-А» обычно имеют одинаковую сигнатуру, что вызывает некоторые трудности, так как Fuse-bit’ы отличаются.

Номер модели дополняется индексом, указывающим вариант исполнения. Цифры (8,10,16,20) перед индексом означают максимальную частоту, на которой микроконтроллер может стабильно работать при нормальном для него напряжении питания).

Первая буква индекса означает вариант корпуса:

АТxxx-P — корпус DIP
АТxxx-A — корпус TQFP
АТxxx-J — корпус PLCC
АТxxx-M — корпус MLF
АТxxx-MA — корпус UDFN/USON
АТxxx-C — корпус CBGA
АТxxx-CK — корпус LGA
АТxxx-S — корпус EIAJ SOIC
АТxxx-SS — узкий корпус JEDEC SOIC
АТxxx-T — корпус TSOP
АТxxx-TS — корпус (ATtiny4/5/9/10)
АТxxx-X — корпус TSSOP

Следующая буква означает температурный диапазон и особенности изготовления:

АТxxx-xC — коммерческий температурный диапазон (0 °C — 70 °C)
АТxxx-xA — температурный диапазон −20 °C — +85 °C, с использованием бессвинцового припоя
АТxxx-xI — индустриальный температурный диапазон (-40 °C — +85 °C)
АТxxx-xU — индустриальный температурный диапазон (-40 °C — +85 °C), с использованием бессвинцового припоя
АТxxx-xH — индустриальный температурный диапазон (-40 °C — +85 °C), с использованием NiPdAu
АТxxx-xN — расширенный температурный диапазон (-40 °C — +105 °C), с использованием бессвинцового припоя
АТxxx-xF — расширенный температурный диапазон (-40 °C — +125 °C)
АТxxx-xZ — автомобильный температурный диапазон (-40 °C — +125 °C)
АТxxx-xD — расширенный автомобильный температурный диапазон (-40 °C — +150 °C)

последняя буква R означает упаковку в ленты (Tape & Reel) для автоматизированных систем сборки.

Что такое АЦП (аналого-цифровой преобразователь)

В электронике под АЦП (в переводе с англ. от ADC — analog-to-digital converter) понимают устройство которое конвертирует аналоговый сигнал (например, ток или напряжение) в цифровой код (двоичную форму). В реальном мире большинство сигналов являются аналоговыми, но все микроконтроллеры и микропроцессоры способны понимать только двоичные (бинарные) сигналы – 0 или 1. То есть чтобы заставить микроконтроллер понимать аналоговые сигналы необходимо конвертировать их в цифровую форму – это и делает АЦП. Существуют различные типы АЦП, каждый тип удобен для конкретных приложений. Наиболее популярные типы АЦП используют такие типы аппроксимаций как приближенная, последовательная и дельта-аппроксимацию. 

Самые дешевые АЦП – с последовательной аппроксимацией, их мы и будем рассматривать в данной статье. В данном случае для каждого фиксированного аналогового уровня последовательно формируется серия соответствующих им цифровых кодов. Внутренний счетчик используется для их сравнения с аналоговым сигналом после конверсии. Генерация цифровых кодов останавливается когда соответствующий им аналоговый уровень становится чуть-чуть больше чем аналоговый сигнал на входе АЦП. Этот цифровой код и будет представлять собой конвертированное значение аналогового сигнала.

Мы в данной статье будем использовать встроенный в микроконтроллер AVR ATmega16 аналого-цифровой преобразователь – практически все микроконтроллеры семейства AVR оснащаются встроенным АЦП. Но вместе с тем следует помнить о том, что существуют и другие типы микроконтроллеров, у которых нет собственных АЦП – в этом случае необходимо использовать внешний АЦП. Как правило, внешние АЦП сейчас выпускаются в виде одной микросхемы.

Программирование Atmega8 для начинающих на примере


Давайте рассмотрим, как в общих чертах осуществляется создание какого-то устройства. Итак, допустим, что у нас есть микроконтроллер, светодиод, резистор, программатор, соединительные провода, макетная плата и источник питания. Первый шаг – это написание прошивки. Под нею понимают набор команд для микроконтроллера, что представлен в качестве конечного файла, имеющего специальный формат. В нём необходимо прописать подключение всех элементов, а также взаимодействие с ними. После этого можно приступать к сборке схемы. На ножку VCC следует подать питание. К любой другой, предназначенной для работы с устройствами и элементами ,подключается сначала резистор, а потом светодиод. При этом мощность первого зависит от потребностей в питании второго. Можно ориентироваться по такой формуле: R=(Up-Ups)/Is. Здесь p – это питание, а s – светодиод. Давайте представим, что у нас есть светодиод, потребляющий 2В и требующий ток питания на уровне 10 мА, переводим в более удобный для математических операций вид и получаем 0.01А. Тогда формула будет выглядеть следующим образом: R=(5В-2В)/0.01А=3В/0.01А=300 Ом. Но на практике часто оказывается невозможным подобрать идеальный элемент. Поэтому берётся наиболее подходящий. Но нужно использовать резистор с сопротивлением выше значения, полученного математическим путём. Благодаря такому подходу мы продлим срок его службы.

Создание проекта для Atmega8 в программной среде CodeVision

Необходимо выполнить следующую последовательность действий.

Шаг 1. Создайте новый проект в CodeVision, выбрав пункт меню File -> New -> Project. В появившемся диалогом окне нажмите Yes.

Шаг 2. Откроется CodeWizard. Кликните в ней на первой опции, то есть AT90, затем нажмите OK.

Шаг 3. Выберите свой микроконтроллер, в нашем случае им будет Atmega8.

Шаг 4. Кликните на Ports (порты). В нашем проекте на передающей стороне мы будем подсоединять кнопку на вход и 4 линии будем использовать на выход. То есть мы должны сконфигурировать 4 контакта Atmega8 на выход. Кликните на Port D, сконфигурируйте в нем биты 7, 6, 5 и 4 на выход.

Шаг 5. Выберите Program -> Generate, Save and Exit. Теперь более половины вашей работы по программированию микроконтроллера Atmega8 можно считать выполненной.

Шаг 6. Создайте новую папку на рабочем столе чтобы записывать туда наши файлы.

У нас будет 3 диалоговых окна (будут появляться последовательно одно за другим) для сохранения наших файлов.

Сделайте то же самое (что и на представленном рисунке) с двумя другими диалоговыми окнами – то есть сохраните предлагаемые ими файлы.

После этого рабочая область программы будет выглядеть примерно следующим образом:

Теперь большая часть работы по программированию микроконтроллера Atmega8 нами выполнена с использованием такой удобной программной среды как CodeVision. Теперь нам необходимо только дописать несколько строк кода для передающей и приемной части чтобы закончить проект.

Для приемной стороны повторите рассмотренные шаги, отличие будет состоять только в том, чтобы сконфигурировать контакт B0 PortB на выход потому что мы будем подключать к нему светодиод.

Обозначения индексов микроконтроллеров

После обозначения базовой версии и серии микроконтроллера, через дефис идет индекс, указывающий вариант исполнения микроконтроллера.Индекс состоит из 1-2 цифр, которые означают максимальную частоту, на которой микроконтроллер может стабильно работать при нормальном для него напряжении питания, и из 1-3 букв, которые обозначают вариант корпуса, температурный диапазон работы, и особенности изготовления.Первая буква (или две буквы) после частоты обозначает тип корпуса:P — корпус DIP (PDIP)A — корпус TQFPM — корпус MLFTS — корпус SOT-23 (ATtiny4/5/9/10)J — корпус PLCCA — корпус UDFN/USONC — корпус CBGACK — корпус LGAS — корпус EIAJ SOICSS — узкий корпус JEDEC SOICT — корпус TSOPX — корпус TSSOP

Следующая буква означает температурный диапазон и особенности изготовления:C — коммерческий температурный диапазон (0 °C — 70 °C)A — температурный диапазон −20 °C — +85 °C, с использованием бессвинцового припояI — индустриальный температурный диапазон (-40 °C — +85 °C)U — индустриальный температурный диапазон (-40 °C — +85 °C), с использованием бессвинцового припояH — индустриальный температурный диапазон (-40 °C — +85 °C), с использованием NiPdAuN — расширенный температурный диапазон (-40 °C — +105 °C), с использованием бессвинцового припояF — расширенный температурный диапазон (-40 °C — +125 °C)Z — автомобильный температурный диапазон (-40 °C — +125 °C)D — расширенный автомобильный температурный диапазон (-40 °C — +150 °C)
Еще в самом конце может быть буква R, которая означает, что микроконтроллеры упакованы в ленты для автоматизированных систем сборки

К примеру:ATmega8L-8AU — максимальная частота — 8 мегагерц, корпус — TQFP, индустриальный температурный диапазон (-40 °C — +85 °C), с использованием бессвинцового припояATmega8-16PN — максимальная частота — 16 мегагерц, корпус — PDIP, расширенный температурный диапазон (-40 °C — +105 °C), с использованием бессвинцового припоя

Если вы знаете, что обозначают буквы и цифры в маркировке микроконтроллера, значит знаете основные параметры микроконтроллеров, и всегда сможете подобрать для своей конструкции наиболее оптимальный вариант микроконтроллера.

Линейка микроконтроллеров ATmegaЛинейка микроконтроллеров ATtiny

Маркировка микроконтроллеров AVR ATmega и ATtinyМаркировка микроконтроллеров AVR семейства ATmega и ATtiny, базовые версии и версии микроконтроллеров, индекс микроконтроллеров
Published by: Мир микроконтроллеров

Date Published: 04/27/2015

Исходный код программы на языке C (Си) с пояснениями

Программа для рассматриваемой схемы представлена следующим фрагментом кода на языке C (Си). Комментарии к коду программу поясняют принцип работы отдельных команд.

Программа на передающей стороне

C++

#include <avr/io.h>
//заголовок чтобы разрешить контроль данных на контактах
#define F_CPU 1000000UL
//задание тактовой частоты микроконтроллера
#include <util/delay.h>
//заголовок чтобы задействовать функции задержки в программе

int main(void)
{
DDRD |= 1 << PIND1;//контакт 1 portD устанавливаем на вывод данных
DDRD &= ~(1 << PIND0);//контакт 0 portD устанавливаем на ввод данных
PORTD |= 1 << PIND0;

int UBBRValue = 25;// установка бодовой скорости

//записываем это значение в верхнюю часть регистра (8 бит из 11)
UBRRH = (unsigned char) (UBBRValue >> 8);

// записываем оставшуюся часть регистра
UBRRL = (unsigned char) UBBRValue;

// задействуем передатчик и приемник
UCSRB = (1 << RXEN) | (1 << TXEN);

//устанавливаем 2 стоповых бита и 8-битную длину передаваемого символа
UCSRC = (1 << USBS) | (3 << UCSZ0);

while (1)
{
if (bit_is_clear(PINC,0))// если кнопка нажата
{

while (! (UCSRA & (1 << UDRE)) );
{
UDR = 0b11110000;//когда передатчик готов посылаем 8 бит данных
}

_delay_ms(220);
}
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

#include <avr/io.h>
//заголовок чтобы разрешить контроль данных на контактах
#define F_CPU 1000000UL
//задание тактовой частоты микроконтроллера
#include <util/delay.h>
//заголовок чтобы задействовать функции задержки в программе

intmain(void)

{

DDRD|=1<<PIND1;//контакт 1 portD устанавливаем на вывод данных

DDRD&=~(1<<PIND0);//контакт 0 portD устанавливаем на ввод данных

PORTD|=1<<PIND0;

intUBBRValue=25;// установка бодовой скорости

//записываем это значение в верхнюю часть регистра  (8 бит из 11)  

UBRRH=(unsignedchar)(UBBRValue>>8);

// записываем оставшуюся часть регистра

UBRRL=(unsignedchar)UBBRValue;

// задействуем передатчик и приемник  

UCSRB=(1<<RXEN)|(1<<TXEN);

//устанавливаем 2 стоповых бита и 8-битную длину передаваемого символа                    

UCSRC=(1<<USBS)|(3<<UCSZ0);

while(1)

{

if(bit_is_clear(PINC,))// если кнопка нажата

{

while(!(UCSRA&(1<<UDRE)));

{

UDR=0b11110000;//когда передатчик готов посылаем 8 бит данных

}

_delay_ms(220);

}

}

}

Программа на приемной стороне

C++

#include <avr/io.h>
#define F_CPU 1000000UL
#include <util/delay.h>
int main(void)
{
DDRD |= (1 << PIND0);//устанавливаем контакт 0 PORTD на ввод данных
DDRC=0xFF;//устанавливаем PORTC на вывод данных

int UBRR_Value = 25; // скорость 2400 бод/с
UBRRH = (unsigned char) (UBRR_Value >> 8);
UBRRL = (unsigned char) UBRR_Value;
UCSRB = (1 << RXEN) | (1 << TXEN);
UCSRC = (1 << USBS) | (3 << UCSZ0);

unsigned char receiveData;
while (1)
{
while (! (UCSRA & (1 << RXC)) );

receiveData = UDR;
if (receiveData == 0b11110000)
{
PORTC ^= (1 << PINC0);
_delay_ms(220);
}
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

#include <avr/io.h>
#define F_CPU 1000000UL
#include <util/delay.h>

intmain(void)

{

DDRD|=(1<<PIND0);//устанавливаем контакт 0 PORTD на ввод данных

DDRC=0xFF;//устанавливаем PORTC на вывод данных

intUBRR_Value=25;// скорость 2400 бод/с

UBRRH=(unsignedchar)(UBRR_Value>>8);

UBRRL=(unsignedchar)UBRR_Value;

UCSRB=(1<<RXEN)|(1<<TXEN);

UCSRC=(1<<USBS)|(3<<UCSZ0);

unsignedcharreceiveData;

while(1)

{

while(!(UCSRA&(1<<RXC)));

receiveData=UDR;

if(receiveData==0b11110000)

{

PORTC^=(1<<PINC0);

_delay_ms(220);

}

}

}

Пояснение части кода программы

Мы напишем программу для включения/выключения светодиода удаленно, использую связь через радиочастотные модули. В этой части статьи мы рассмотрим лишь ключевые особенности кода программы, текст всей программы будет приведен в конце статьи.

Код для передающей части

Первым делом подключите заголовочный файл delay.h чтобы использовать функции задержки в программе.

Теперь рассмотрим главный цикл в конце тела программы. В этом цикле While мы будем передавать 0x10 байт на PORTD когда кнопка нажата и байт 0x20 когда кнопка не нажата. Можно использовать любые другие значения – но их необходимо будет изменить и на приемном конце.

Код для приемной части

Первым делом здесь необходимо объявить переменные, которые будут использоваться для хранения символов, принимаемых от приемного радиочастотного модуля.

Теперь рассмотрим главный цикл в конце программы. В этом цикле мы будем хранить принимаемые байты в переменной символьного типа (char) и сравнивать их с теми, которые мы передавали на передающей стороне. Если результат сравнения положительный, то мы в соответствии с их значениями будем включать/выключать светодиод, подключенный к PORTB.0.

Работа схемы

Схема для передающей стороны приведена на следующем рисунке.

В схеме необходимо сделать следующие соединения:

  • Pin D7 of atmega8 -> Pin13 HT12E.
  • Pin D6 of atmega8 -> Pin12 HT12E.
  • Pin D5 of atmega8 -> Pin11 HT12E.
  • Pin D4 of atmega8 -> Pin10 HT12E.
  • Кнопка to Pin B0 of Atmega.
  • Резистор 1 МОм между pin15 и 16 of HT12E.
  • Pin17 of HT12E к контакту данных передающего модуля.
  • Pin 18 of HT12E to 5V.
  • GND pin 1-9 and Pin 14 of HT12E and Pin 8 of Atmega.

Схема для приемной стороны приведена на следующем рисунке.

В схеме необходимо сделать следующие соединения:

  • Pin D7 of atmega8 -> Pin13 HT12D.
  • Pin D6 of atmega8 -> Pin12 HT12D.
  • Pin D5 of atmega8 -> Pin11 HT12D.
  • Pin D4 of atmega8 -> Pin10 HT12d.
  • LED to Pin B0 of Atmega.
  • Pin14 of HT12D к контакту данных приемного модуля.
  • Резистор 47 кОм между pin15 и 16 of HT12D.
  • GND pin 1-9 of HT12D and Pin 8 of Atmega.
  • Светодиод к pin 17 of HT12D.
  • 5V to pin 7 of Atmega and pin 18 of HT12D.

Общий вид конструкции приведен на следующем рисунке: