Самые свежие схемы на микроконтроллерах atmega8. Только рабочие схемы!: Проекты на ATMega8. GSM сигнализация с оповещением на мобильник

Самые свежие схемы на микроконтроллерах atmega8. Только рабочие схемы!: Проекты на ATMega8. GSM сигнализация с оповещением на мобильник
Самые свежие схемы на микроконтроллерах atmega8. Только рабочие схемы!: Проекты на ATMega8. GSM сигнализация с оповещением на мобильник

Частотомер на АТ90S2313

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

Подробности: http://home.skif.net/~yukol/FMrus.htm

Рекомендую собрать простая конструкция не требует настройки и главное работает! Микроконтроллер программировал программатором PonyProg -отличный программатор, простой, большая номенклатура программируемых микроконтроллеров, работает под Windows, интерфейс русский.


Журнал "Радио" N1 2002г. Для Ni-Cd аккумуляторов. Позволяет заряжать 4 аккумулятора.



Частотомер на Pic 16F84A

Технические характеристики частотомера:

Максимальная измеряемая частота.............30 МГц;

Максимальное разрешение измеряемой частоты.. .10 Гц.

Чувствительность по входу....................250 мВ;

Напряжение питания.........................8... 12 В:

Потребляемый ток............................35 мА


Подробности, прошивка: http://cadcamlab.ru


Паяльная станция на Atmega 8


Переключение паяльника и фена осуществляется переключателями ПК. Управление феном осуществляется тиристором, т.к. фен на 110в вместо R1 диод катодом к в.6.


Подробности, прошивка: http://radiokot.ru/forum


Цифровой измеритель емкости без выпайки из схемы

Описание дано в журнале "Радио" №6 2009 г. Конструкция собрана на AT90S2313, без изменений в прошивке применил Tiny2313. В Поньке выставил галки для SUT1, CKSEL1, CKSEL0, остальные пустые. MAХ631 не ставил, она что то у нас дорогая, решил запитать от блока питания через стабилизатор 7805, R29, R32 , R33 посадил на плюс питания. Кроме измерителя емкости в корпусе смонтирован пробник, для проверки транзисторов без выпайки и генератор НЧ ВЧ сигналов.



Измеритель параметров полупроводниковых приборов на ATmega8

Прибор умеет:

Определять выводы полупроводников;
- определять тип и структуру;
- измерять статические парамеры.
Измеряет диоды, биполярные транзисторы,полевые транзисторы JFET и MOS, резисторы, конденсаторы.


Измеритель выполнен в одном корпусе с измерителем FCL, индикатор переключается между приборами переключателем ПК.

Частотометр, измеритель ёмкости и индуктивности - FCL-meter

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

Технические характеристики:

Напряжение питания, В: 6…15

Ток потребления, мА: 14…17

Пределы измерения:

F1, МГц 0,01…65**

F2, МГц 10…950

С 0,01 пФ…0,5 мкФ

L 0,001 мкГн…5 Гн


Схема выносной головки


Подробнее: http://ru3ga.qrz.ru/PRIB/fcl.shtml


Миниатюрный вольтметр на микроконтроллере ATmega8L


Здесь рассматривается конструкция вольтметра на одном лишь микроконтроллере ATmega8L и индикаторе от электронного медицинского термометра. Диапазон измеряемых напряжений постоянного тока ±50 В. Как дополнительная функция – реализован режим звукового пробника для проверки целостности проводов, ламп накаливания. Устройство автоматически переходит в дежурный режим при отсутствии измерений. Питание микроконтрллера осуществляется от двух миниатюрных щелочных элементов (элементы питания для наручных часов), я поставил 1 элемент на 3в. Необходимости часто менять элементы питания не будет: потребляемый ток в активном режиме составляет всего 330 мкА, в дежурном режиме – менее 300 нА. Благодаря своей миниатюрной конструкции и возможностям устройство полезно и практично. В корпус от термометра не влезла у меня плата, и я сделал в корпусе от фламастера. Плату делал свою, резисторы R5-R7 установил ветикально на шинах. Прошивку из исходника помог сделать VADZZ спасибо ему. Выводы индикатора с лево на право, выводы внизу и лицом к себе.

Схема (для полноформатной схемы сохраните изображение себе на компьютер).

Подробнее смотри: http://www.rlocman.ru/shem/schematics.html?di=63917

ЗУ с функцией измерения емкости

Захотелось померять емкость аккумуляторов, импортные измерители достаточно дорого стоят, нашел интересную схему и собрал. Работает нормально, заряжает, измеряет, но с какой точностью затрудняюсь сказать - нет эталона. Мерял аккумуляторы довольно приличных фирм 2700 ма/ч - намерял 2000. Аккумуляторы от игрушек 700 ма/ч -350, заказывал на EBAY китайские аккумуляторы BTY 2500 ма/ч - 450 ма/ч, но при этом достаточно приличные, неплохо работают в игрушках, гораздо выгоднее батареек.


Устройство предназначено для зарядки NiMH аккумуляторов и контроля их емкости. Переключение режимов заряд/разряд осуществляется кнопкой SА1. Режим работы отображается с помощью светодиодов и десятичными точками двух первых разрядов семисегментного индикатора.
Сразу после включения питания устройство переходит в режим заряд. На индикаторе отображается время заряда. После истечения запрограммированного промежутка времени заряд прекращается. Об окончании заряда (и разряда то же) свидетельствует зажженная точка четвертого разряда. Ток заряда определяется как С/10 где С - емкость батареи, выставляется подстроечником R14.
Принцип действия измерителя основан на подсчете времени за которое напряжение аккумулятора снизится до1,1 В. Ток разряда должен быть равен 450 ма, выставляется R16. Для того чтобы измерить емкость, надо вставить аккумулятор в отсек для разряда и запустить процесс нажатием на кнопку! Устройство способно разряжать только один аккумулятор .

Подробнее: http://cxem.net

Универсальная печь радиолюбителя

Печка для пайки SMD деталей, имеет 4 программируемых режима.

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


Блок питания и управление нагревателем


Собрал данную конструкцию для управления ИК паяльной станцией. Может когда нибудь и печкой управлять буду. Была проблема с запуском генератора, поставил конденсаторы 22 пф с выводов 7, 8 на массу, и стала нормально запускаться. Все режимы нормально отрабатывает, нагружал 250 вт керамическим нагревателем.

Подробнее: http://radiokot.ru/lab/hardwork/11/

Пока печки нет, сделал вот такой нижний подогрев, для небольших плат:

Нагреватель 250 вт, диаметр 12 см, прислали из Англии, покупал на EBAY.


Цифровая паяльная станция на PIC16F88x/PIC16F87x(a)

Паяльная станция с двумя одновременно действующими паяльником и феном. Можно использовать разные МК (PIC16F886/PIC16F887, PIC16F876/PIC16F877, PIC16F876a/PIC16F877a). Применен дисплей от Nokia 1100 (1110). Обороты турбины фена регулируются электронно, так же задействован встроенный в фен геркон. В авторском варианте применен импульсный блок питания, я применил трансформаторный БП. Всем мне нравится эта станция, но с моим паяльником: 60вт, 24в, с керамическим нагревателем, большое забегание и колебание температуры. При этом паяльники меньшей мощности, с нихромовым нагревателем имеют меньшие колебания. При этом мой паяльник, с описаной выше паяльной станцией от Михи-Псков, с прошивкой от Volu, поддерживает температуру с точность до градуса. Так что нужнен хороший алгоритм нагрева и поддержания температуры. В качестве эксперемента сделал ШИМ регулятор на таймере, управляющее напряжение подал с выхода усилителя термопары, отключение, включение от микроконтроллера, Колебание температуры сразу уменьшилось до нескольких градусов, это подтверждает что нужен правильный алгоритм управления. Внешний ШИМ это конечно порнография при наличии микроконтроллера, но хорошую прошивку пока не написали. Заказал другой паяльник если с ним не будет хорошей стабилизации, продолжу свои эксперементы с внешним ШИМ управлением, а может хорошая прошивка появится. Станцию собрал на 4 платах, соединяются между собой на разъемах.

Схема цифровой части устройсква представлена на рисунке, для наглядности показаны два МК: IC1 - PIC16F887, IC1(*) - PIC16F876. Другие МК подключаются аналогично, на соответствующие порты.

Для изменения контрасности нужно найти 67 байт, его значение "0х80" , для начала можно поставить "0х90". Значения должны быть от "0х80" до "0х9F".

По поводу дисплея 1110i (текст отображается зеркально), если не китай, а оригинал,открываем ЕЕПРОМ, ищем 75 байт, меняем его с A0 на A1.

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

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

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

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

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

Микроконроллеры AVR

Ознакомимся с более распространенным и основательно устоявшимся в современном мире техники контроллером, таким как AVR. В его состав входят высокоскоростной RISC-микропроцессор, 2 вида затратной по энергии памяти (Flash-кэш проектов и кэш сведений EEPROM), эксплуатационная кэш по типу RAM, порты ввода/вывода и разнообразные удаленные сопряженные структуры.

  • рабочая температура составляет от -55 до +125 градусов Цельсия;
  • температура хранения составляет от -60 до +150 градусов;
  • наибольшая напряженность на выводе RESET, в соответствии GND: максимально 13 В;
  • максимальное напряжение питания: 6.0 В;
  • наибольший электроток линии ввода/вывода: 40 мА;
  • максимальный ток по линии питания VCC и GND: 200 мА.

Возможности микроконтроллера AVR

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

Обещанное количество оборотов переписи кэша у микроконтроллеров AVR второго поколения равен 11 тысячам оборотов, когда стандартное количество оборотов равно 100 тысячам.

Конфигурация черт строения вводных и выводных портов у AVR заключается в следующем: целью физиологического выхода имеется три бита регулирования, а никак не два, как у известных разрядных контроллеров (Intel, Microchip, Motorola и т. д.). Это свойство позволяет исключить потребность обладать дубликатом компонентов порта в памяти с целью защиты, а также ускоряет энергоэффективность микроконтроллера в комплексе с наружными приборами, а именно, при сопутствующих электрических неполадках снаружи.

Всем микроконтроллерам AVR свойственна многоярусная техника пресечения. Она как бы обрывает стандартное течение русификатора для достижения цели, находящейся в приоритете и обусловленной определенными событиями. Существует подпрограмма преобразования запрашивания на приостановление для определенного случая, и расположена она в памяти проекта.

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

Поделки на базе микроконтроллера AVR

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

"Направлятор"

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

Построение схемы осуществляется на основе микроконтроллера AVR с тактированием от наружного кварцевого резонатора на 11,0598 МГц. За работу с GPS отвечает NEO-6M от U-blox. Это, хоть и устаревший, но широко известный и бюджетный модуль с довольно четкой способностью к установлению местонахождения. Сведения фокусируются на экране от Nokia 5670. Также в модели присутствуют измеритель магнитных волн HMC5883L и акселерометр ADXL335.


Беспроводная система оповещения с датчиком движения

Полезное устройство, включающее в себя прибор перемещения и способность отдавать, согласно радиоканалу, знак о его срабатывании. Конструкция является подвижной и заряжается с помощью аккумулятора или батареек. Для его изготовления необходимо иметь несколько радиомодулей HC-12, а также датчик движения hc-SR501.

Прибор перемещения HC-SR501 функционирует при напряжении питания от 4,5 до 20 вольт. И для оптимальной работы от LI-Ion аккумулятора следует обогнуть предохранительный светодиод на входе питания и сомкнуть доступ и вывод линейного стабилизатора 7133 (2-я и 3-я ножки). По окончанию проведения этих процедур прибор приступает к постоянной работе при напряжении от 3 до 6 вольт.


Внимание: при работе в комплексе с радиомодулем HC-12 датчик временами ложно срабатывал. Во избежание этого необходимо снизить мощность передатчика в 2 раза (команда AT+P4). Датчик работает на масле, и одного заряженного аккумулятора, емкостью 700мА/ч, хватит свыше, чем на год.

Минитерминал

Приспособление проявило себя замечательным ассистентом. Плата с микроконтроллером AVR нужна, как фундамент для изготовления аппарата. Из-за того, что экран объединён с контроллером непосредственно, то питание должно быть не более 3,3 вольт, так как при более высоких числах могут возникнуть неполадки в устройстве.


Вам следует взять модуль преобразователя на LM2577, а основой может стать Li-Ion батарея емкостью 2500мА/ч. Выйдет дельная комплектация, отдающая постоянно 3,3 вольта во всём трудовом интервале напряжений. С целью зарядки применяйте модуль на микросхеме TP4056, который считается бюджетным и достаточно качественным. Для того чтобы иметь возможность подсоединить минитерминал к 5-ти вольтовым механизмам без опаски сжечь экран, необходимо использовать порты UART.

Основные аспекты программирования микроконтроллера AVR

Кодирование микроконтоллеров зачастую производят в стиле ассемблера или СИ, однако, можно пользоваться и другими языками Форта или Бейсика. Таким образом, чтобы по факту начать исследование по программированию контроллера, следует быть оснащенным следующим материальным набором, включающим в себя: микроконтроллер, в количестве три штуки - к высоковостребованным и эффективным относят - ATmega8A-PU, ATtiny2313A-PU и ATtiny13A- PU.

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


Чтобы исследовать процедуры коммуникации микроконтроллера с иными приборами, нужно числовое приспособление температуры DS18B20 и, показывающие правильное время, часы DS1307. Также важно иметь транзисторы, резисторы, кварцевые резонаторы, конденсаторы, кнопки.

С целью установки систем потребуется образцовая плата для монтажа. Чтобы соорудить конструкцию на микроконтроллере, следует воспользоваться макетной платой для сборки без пайки и комплектом перемычек к ней: образцовая плата МВ102 и соединительные перемычки к макетной плате нескольких видов - эластичные и жесткие, а также П-образной формы. Кодируют микроконтроллеры, применяя программатор USBASP.

Простейшее устройство на базе микроконтроллера AVR. Пример

Итак, ознакомившись с тем, что собой представляют микроконтроллеры AVR, и с системой их программирования, рассмотрим простейшее устройство, базисом для которого служит данный контроллер. Приведем такой пример, как драйвер низковольтных электродвигателей. Это приспособление дает возможность в одно и то же время распоряжаться двумя слабыми электрическими двигателями непрерывного тока.

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

Устройство выглядит, как печатная плата размером 43 х 43 мм, а на ней сооружена минисхемка радиатора, высота которого 24 миллиметра, а масса – 25 грамм. С целью манипулирования нагрузкой, плата драйвера содержит около шести входов.

Заключение

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

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

Общая информация

Микроконтроллеры встречаются везде. Их можно найти в холодильниках, стиральных машинках, телефонах, заводских станках и большом количестве других технических устройств. Микроконтроллеры бывают как простыми, так и чрезвычайно сложными. Последние предлагают значительно больше возможностей и функционала. Но разбираться сразу в сложной технике не выйдет. Первоначально необходимо освоить что-то простое. И в качестве образца будет взят Atmega8. Программирование на нём не является сложным благодаря грамотной архитектуре и дружелюбному интерфейсу. К тому же он является обладателем достаточной производительности, чтобы использовать в большинстве Более того, они применяются даже в промышленности. В случае с Atmega8 программирование предусматривает знание таких языков как AVR (C/Assembler). С чего же начать? Освоение этой технологии возможно тремя путями. И каждый выбирает сам, с чего начать работу с Atmega8:

  1. Программирование через Arduino.
  2. Покупка готового устройства.
  3. Самостоятельная сборка микроконтроллера.

Нами будет рассмотрен первый и третий пункт.

Arduino

Это удобная платформа, выполненная в виде что подходит для быстрого создания различных устройств. В плате уже есть всё необходимое в виде самого микроконтроллера, его обвязки и программатора. Пойдя по этому пути, человек получит следующие преимущества:

  1. Низкий порог требований. Не нужно обладать специальными навыками и умениями для разработки технических устройств.
  2. Широкий спектр элементов будет доступен для подключения без дополнительной подготовки.
  3. Быстрое начало разработки. С Arduino можно сразу переходить к созданию устройств.
  4. Наличие большого количества учебных материалов и примеров реализаций различных конструкций.

Но есть и определённые минусы. Так, Arduino программирование Atmega8 не позволяет глубже окунуться в мир микроконтроллера и разобраться во многих полезных аспектах. Кроме этого, придётся изучить язык программирования, что отличается от применяемых AVR (C/Assembler). И ещё: Arduino имеет довольно узкую линейку моделей. Поэтому рано или поздно возникнет необходимость использовать микроконтроллер, что не используется в платах. А в целом это неплохой вариант работы с Atmega8. Программирование через Arduino позволит получить уверенный старт в мире электроники. И у человека вряд ли опустятся руки из-за неудач и проблем.

Самостоятельная сборка

Благодаря дружелюбности конструкции их можно сделать самими. Ведь для этого нужны дешевые, доступные и простые комплектующие. Это позволит хорошо изучить устройство микроконтроллера Atmega8, программирование которого после сборки будет казаться более лёгким. Также при необходимости можно самостоятельно подобрать иные комплектующие под конкретную задачу. Правда, здесь есть и определённый минус - сложность. Самостоятельно собрать микроконтроллер, когда нет нужных знаний и навыков, нелегко. Этот вариант мы и рассмотрим.

Что же нужно для сборки?

Первоначально необходимо заполучить сам Atmega8. Программирование микроконтроллера без него самого, знаете ли, невозможно. Он обойдётся в несколько сотен рублей - обеспечивая при этом достойный функционал. Также стоит вопрос о том, как будет осуществляться программирование Atmega8. USBAsp - это довольно хорошее устройство, что себя зарекомендовало с лучшей стороны. Но можно использовать и какой-то другой программатор. Или же собрать его самостоятельно. Но в таком случае существует риск, что при некачественном создании он превратит микроконтроллер в неработающий кусочек пластика и железа. Также не помешает наличие макетной платы и перемычек. Они не обязательны, но позволят сэкономить нервы и время. И напоследок - нужен источник питания на 5В.

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

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

А что же дальше?

Итак, у нас есть небольшая схема. Теперь осталось подключить к микроконтроллеру программатор и записать в его память прошивку, что была создана. Здесь есть один момент! Выстраивая схему, необходимо её создавать таким образом, чтобы микроконтроллер можно было прошивать без распайки. Это позволит сберечь время, нервы и продлит срок службы элементов. В том числе и Atmega8. Внутрисхемное программирование, нужно отметить, требует знаний и умений. Но оно же позволяет создавать более совершенные конструкции. Ведь часто бывает, что во время распайки элементы повреждаются. После этого схема готова. Можно подавать напряжение.

Важные моменты

Хочется дать новичкам полезные советы про программирование Atmega8. Встроенные переменные и функции не менять! Прошивать устройство созданной программой желательно после её проверки на отсутствие «вечных циклов», что заблокируют любое иное вмешательство, и с использованием хорошего передатчика. В случае использования самоделки для этих целей следует быть морально готовым к выходу микроконтроллера из строя. Когда будете прошивать устройство с помощью программатора, то следует соединять соответствующие выходы VCC, GND, SCK, MOSI, RESET, MISO. И не нарушайте технику безопасности! Если техническими характеристиками предусмотрено, что должно быть питание в 5В, то нужно придерживаться именно такого напряжения. Даже использование элементов на 6В может негативно сказать на работоспособности микроконтроллера и сократить срок его службы. Конечно, батареи на 5В имеют определённые расхождения, но, как правило, там всё в разумных рамках. К примеру, максимальное напряжение будет держаться на уровне 5,3В.

Обучение и совершенствование навыков

На счастье, Atmega8 является очень популярным микроконтроллером. Поэтому найти единомышленников или же просто знающих и умеющих людей не составит труда. Если нет желания изобретать заново велосипед, а просто хочется решить определённую задачу, то можно поискать требуемую схему на просторах мировой сети. Кстати, небольшая подсказка: хотя в русскоязычном сегменте робототехника довольно популярна, но, если нет ответа, то следует его поискать в англоязычном - он содержит на порядок большее количество информации. Если есть определённые сомнения в качестве имеющихся рекомендаций, то можно поискать книги, где рассматривается Atmega8. Благо, компания-производитель берёт во внимание популярность своих разработок и снабжает их специализированной литературой, где опытные люди рассказывают, что и как, а также приводят примеры работы устройства.

Сложно ли начать создавать что-то своё?

Достаточно иметь 500-2000 рублей и несколько свободных вечеров. Этого времени с лихвой хватит, чтобы ознакомиться с архитектурой Atmega8. После небольшой практики можно будет спокойно создавать свои собственные проекты, выполняющие определённые задачи. К примеру, роботизированную руку. Одного Atmega8 должно с лихвой хватить, чтобы передать основные моторные функции пальцев и кисти. Конечно, это довольно сложная задача, но вполне посильная. В последующем вообще можно будет создавать сложные вещи, для которых понадобятся десятки микроконтроллеров. Но это всё впереди, перед этим необходимо получить хорошую школу практики на чем-то простом.

Проекты на АТMega8.

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

Для работы вам понадобится как минимум CodeVision AVR2.04.4a и Proteus 7.2 SP6. Если желаете поработать с "железом", вам понадобится и программатор. Советую вот такой - легко собирается, хорошо работает. Единственная проблема с первоначальной прошивкой ATMega8, это можно сделать либо через порт LPT - 5-provodov-avr , либо купить "зашитый" микроконтроллер, я брал .


Светофор №1.

Простейший светофор на одно направление не требует для создания больших усилий и навыков. Схема собирается за несколько минут. Резисторы подбираются исходя из используемых светодиодов (номинал 470 Ом указан для "советских" АЛ307), следует заметить, что на схеме вывод AVCC подключен к питанию, если его не подключить на реальном микроконтроллере независимо от использования встроенного АЦП (аналого-цифрового преобразователя), то можно вывести микросхему из строя (справедливо для любых контроллеров серии Mega)!!!

Исходный код настолько простой, что я его представлю прямо здесь. Этот код для Си я нашёл в интернете и немного подправил, однако, любой программист скажет вам, что этот код является бестолковым (далее я опишу, как именно требуется писать такие программы), но зато - простым, наглядным и рабочим.

Chip type: ATmega8
Program type: Application

Memory model: Small
Data Stack size: 256


#include

#include

void main(void)
{
// Port B initialization
PORTB=0x00;
DDRB=0x00;

// Port C initialization
PORTC=0x00;
DDRC=0x00;

// Port D initialization
PORTD=0x00;
DDRD=0x07;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;


// Analog Comparator: Off

ACSR=0x80;
SFIOR=0x00;

while (1) {

PORTD.2=1; //зеленый загорается
delay_ms(8000); //горит 8 секунд


delay_ms(500); //Ждем пол секунды


PORTD.2=0; //Выключаем зеленый

PORTD.2=1; //Включаем зеленый

/*delay_ms(500);//Ждем полсекунды
PORTD.2=0; //Выключаем зеленый
delay_ms(500); //Ждем полсекунды
PORTD.2=1; //Включаем зеленый
delay_ms(500); //Ждем полсекунды*/

PORTD.1=1; //Включаем жёлтый
PORTD.2=0; //Выключаем зеленый
delay_ms(3000); //Ждем 3 секунды

PORTD.0=1; //Включаем красный
PORTD.1=0; //выключаем жёлтый
delay_ms(9000); //на 9 секунд

PORTD.1=1; //включаем жёлтый к красному
delay_ms(3000); //ждем 3 секунды
PORTD.0=0; //Выключаем красный
PORTD.1=0; //и жёлтый
};
}

Код можно ещё несколько сократить, если учесть, что по умолчанию практически все порты и регистры ATMega8 инициализированы в 0. Теперь для начинающих некоторые пояснения:

#include

#include

Это так называемые заголовочные файлы, в них написаны процедуры, которые мы применим из других файлов. Например, процедура delay_ms(X), которая определяет задержку в миллисекундах, была написана другим человеком и содержится в файле delay.с (на самом деле всё может быть не совсем так, или совсем не так, - процедуры может содержать объектный файл типа *.obj, *.asm), а правила её применения описаны в файле delay.h, который мы подключаем.

PORTB=0x00;
DDRB=0x00;

Зарезервированные имена, обозначающие регистры порта контроллера (его ножки сгруппированные байтом - по 8, каждый бит регистра порта соответствует своей ножке) и регистры направления обмена порта (0-вход, 1-выход)

Например, запись DDRB.5=1 означает что ножка PB5 контроллера настроена на выход, и при записи PORTB.5=0 или =1, на данной ножке получим 0 (0...0.8 Вольта) или 1 (4...5 Вольт). Разумеется, можно и сразу целиком присвоить значение порту: PORTB=0xFF, т.е. все ножки порта PB равны 1.

while(1) {expression};

представляет собой бесконечный цикл, так как 1=TRUE.

Светофор №2.


Чтобы получить светофор на два направления, надо модифицировать схему светофора №1:


и код светофора №1:

/*****************************************************
Chip type: ATmega8
Program type: Application
AVR Core Clock frequency: 1.000000 MHz
Memory model: Small
External RAM size: 0
Data Stack size: 256
*****************************************************/

#include
#include

void main(void)
{
// Port B initialization
PORTB=0x00;
DDRB=0x00;

// Port C initialization
PORTC=0x00;
DDRC=0x00;

// Port D initialization
PORTD=0x00;
DDRD=0b00111111;

ACSR=0x80;
SFIOR=0x00;

while (1)
{
PORTD.2=1; //зеленый1 загорается Z1
PORTD.3=1; //красный2 загорается K2
delay_ms(8000); //зеленый1 горит 8 секунд

PORTD.2=0; //выключаем зеленый1 ZM1
delay_ms(500); //ждем пол секунды

delay_ms(500); //ждем полсекунды

delay_ms(500); //ждем полсекунды
PORTD.2=1; //включаем зеленый1
delay_ms(500); //ждем полсекунды

PORTD.1=1; //включаем оранжевый1 J1 K2+J2
PORTD.4=1; //включаем оранжевый2
PORTD.2=0; //выключаем зеленый1


PORTD.0=1; //включаем красный1 K1
PORTD.5=1; //включаем зеленый2 Z2
PORTD.1=0; //выключаем оранжевый1
PORTD.4=0; //выключаем оранжевый2
PORTD.3=0; //выключаем красный2
delay_ms(8000); //ждём 8 секунд

PORTD.5=0; //выключаем зеленый2 ZM2
delay_ms(500); //ждем полсекунды

delay_ms(500); //ждем полсекунды

delay_ms(500); //ждем полсекунды
PORTD.5=1; //включаем зеленый2
delay_ms(500); //ждем полсекунды

PORTD.1=1; //включаем оранжевый1 к красному1 K1+J1
PORTD.4=1; //включаем оранжевый2 J2
PORTD.5=0; //выключаем зеленый2
delay_ms(2000); //ждем 2 секунды
PORTD.0=0; //Выключаем красный1
PORTD.1=0; //и оранжевый1
PORTD.4=0; //и оранжевый2
};
}

комментарии по коду:

DDRD=0b00111111; //0b(b7)(b6)(b5)(b4)(b3)(b2)(b1)(b0)

Справа битовое(двоичное) представление числа в котором слева - самый старший разряд, его же можно было записать в десятичном (DDRD=63;) или в шестнадцатиричном виде (DDRD=0x3F;).

void main(void)

Main главная процедура, с неё начинается выполнение программы, void означает буквально ничего (нулевой тип), вместо void можно подставить (signed или unsigned) int, long; float, double и так далее (и даже указатель на другую переменную, о чём будет рассказано позже). Причём замена void на какой-либо тип в первой позиции обозначает что данная конструкция - функция, а не процедура, и может возвращать значение, т.о. она должна быть дополнена внутри словом return .

int fun(void) {
int a=10;
return(a);
}

Все изменения производились согласно диаграмме работы:


Диаграмма работы светофора на два направления с мигающим зелёным сигналом. Данная диаграмма взята также с просторов интернета, и по-моему: миганий зелёного сигнала должно быть больше.



Светофор №3.


В примерах №1 и №2 было указано на несколько "прямолобое" применение кода, которое позволительно для небольших программ, однако не может быть применено из-за расточительности ресурсами в больших приложениях.
Для упрощения и сокращения кода в технологических применениях программисты обычно используют автоматы. Автомат является упрощённой и достаточной моделью процесса. Например, всю работу светофора можно разбить на некоторое конечное число состояний, которые будут повторятся с некоторым периодом. Для представления автомата потребуется программный счётчик состояний и дешифратор состояний. Светофор №3, который состоит из транспортного светофора на 4 направления, 4-х пешеходных светофоров, 1-го железнодорожного для переезда, 1-го мигающего пешеходного, было бы проблематично создать без автомата.


Код без обработки пешеходных и ж/д светофоров приведен ниже. Несложно понять что процедуры типа
void SetRedT1(void) //Транспортный светофор1 включить красный D3
{
ptc|=0x01;
}
устанавливают либо стирают отдельные биты.

В главном цикле значение счётчика i постоянно увеличивается пока не достигнет 48.
i++;
При этом счётчик обнуляется.
if (i==48) {i=0;}; // 24c=0.5*48

В цикле постоянно происходит сравнение значения счётчика с константами, и производится работа с портами. Хоть данный код и более совершенный, чем предыдущие два, но он также более подходит для наглядности чем для работы. Профессионалы чаще всего не используют наборы отдельных операций сравнения, а пользуются операторами switch-case, или вовсе записывают заранее рассчитанные данные в массивы - пользуются готовой таблицей:

flash unsigned char sw[N]={
//G1Y1R1G2Y2R2 XX
0b10000100, //1 Х периодов горят Зелёный1 и Красный2
0b10000100, //2
...
0b00000100, // Х периодов Зелёный1 мигает,

0b10000100, //
...
0b01001100, //K-1 Зелёный1 гаснет, загораются Жёлтый1 и Жёлтый2
0b00110000, //K Загорается Красный1, загорается Зелёный1, гаснут Жёлтый2 и Красный2

...
0b01101000 //N
};

while (1)
{
i++;


PORTC=(sw[i]>>x) | mask;
PORTD=(sw[i]>>x) | mask;
delay_ms(500);
};
}

Разумеется, выражения (sw[i]>>x) | mask описаны условно, всё зависит от положения информации о сигналах в константе sw.

/*****************************************************
Chip type: ATmega8
Program type: Application
AVR Core Clock frequency: 1.000000 MHz
Memory model: Small
External RAM size: 0
Data Stack size: 256
*****************************************************/

#include
#include

unsigned char ptb=0;
unsigned char ptc=0;
unsigned char ptd=0;

void SetRedT1() //Транспортный светофор1 включить красный D3
{
ptc|=0x01;
}

void ResetRedT1() //Транспортный светофор1 выключить красный D3
{
ptc&=~0x01;
}

void SetYelT1() //Транспортный светофор1 включить жёлтый D2
{
ptc|=0x02;
}

void ResetYelT1() //Транспортный светофор1 выключить жёлтый D2
{
ptc&=~0x02;
}

void SetGrnT1() //Транспортный светофор1 включить зелёный D1
{
ptc|=0x04;
}

void ResetGrnT1() //Транспортный светофор1 выключить зелёный D1
{
ptc&=~0x04;
}

void SetRedT2() //Транспортный светофор2 включить красный D6
{
ptc|=0x08;
}

void ResetRedT2() //Транспортный светофор2 выключить красный D6
{
ptc&=~0x08;
}

void SetYelT2() //Транспортный светофор2 включить жёлтый D5
{
ptc|=0x10;
}

void ResetYelT2() //Транспортный светофор2 выключить жёлтый D5
{
ptc&=~0x10;
}

void SetGrnT2() //Транспортный светофор2 включить зелёный D4
{
ptc|=0x20;
}

void ResetGrnT2() //Транспортный светофор2 выключить зелёный D4
{
ptc&=~0x20;
}


void SetRedT3() //Транспортный светофор3 включить красный D9
{
ptd|=0x01;
}

void ResetRedT3() //Транспортный светофор3 выключить красный D9
{
ptd&=~0x01;
}

void SetYelT3() //Транспортный светофор3 включить жёлтый D8
{
ptd|=0x02;
}

void ResetYelT3() //Транспортный светофор3 выключить жёлтый D8
{
ptd&=~0x02;
}

void SetGrnT3() //Транспортный светофор3 включить зелёный D7
{
ptd|=0x04;
}

void ResetGrnT3() //Транспортный светофор3 выключить зелёный D7
{
ptd&=~0x04;
}


void SetRedT4() //Транспортный светофор2 включить красный D12
{
ptd|=0x08;
}

void ResetRedT4() //Транспортный светофор2 выключить красный D12
{
ptd&=~0x08;
}

void SetYelT4() //Транспортный светофор2 включить жёлтый D11
{
ptd|=0x10;
}

void ResetYelT4() //Транспортный светофор2 выключить жёлтый D11
{
ptd&=~0x10;
}

void SetGrnT4() //Транспортный светофор2 включить зелёный D10
{
ptd|=0x20;
}

void ResetGrnT4() //Транспортный светофор2 выключить зелёный D10
{
ptd&=~0x20;
}

// Declare your global variables here

void main(void)
{
unsigned char i=0;

PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0xFF;
PORTD=0x00;
DDRD=0xFF;
ACSR=0x80;

while (1)
{
if (i==0) {ResetYelT1();ResetRedT1();SetGrnT1();
ResetYelT2();SetRedT2();
ResetYelT3();ResetRedT3();SetGrnT3();
ResetYelT4();SetRedT4();

}; //0s
if (i==16) {ResetGrnT1();
ResetGrnT3();

}; //8s
if (i==17) {SetGrnT1();
SetGrnT3();

};
if (i==18) {ResetGrnT1();
ResetGrnT3();

};
if (i==19) {SetGrnT1();
SetGrnT3();

};
if (i==20) {ResetGrnT1();SetYelT1();
SetYelT2();
ResetGrnT3();SetYelT3();
SetYelT4();

}; //10s
if (i==24) {ResetYelT1();SetRedT1();
ResetYelT2();ResetRedT2();SetGrnT2();
ResetYelT3();SetRedT3();
ResetYelT4();ResetRedT4();SetGrnT4();

}; //12s
if (i==40) {ResetGrnT2();
ResetGrnT4();

}; //20s
if (i==41) {SetGrnT2();
SetGrnT4();

};
if (i==42) {ResetGrnT2();
ResetGrnT4();

}; //21s
if (i==43) {SetGrnT2();
SetGrnT4();

};
if (i==44) {SetYelT1();
ResetGrnT2();SetYelT2();
SetYelT3();
ResetGrnT4();SetYelT4();

}; //22s
i++;
if (i==48) {i=0;}; // 24c=0.5*48 - цикл

//PORTB=ptb;
PORTC=ptc;
PORTD=ptd;
delay_ms(500);
};
}

Столбчатый индикатор.

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

Столбчатый индикатор отображает входное напряжение в виде столбца светящихся сегментов (или просто отдельных излучателей), что очень полезно для всяких индикаторов, примерами могут являться столбчатые индикаторы уровня записи (ИУЗ).

Входное напряжение не должно превышать напряжение питания, и в качестве опорного напряжения используется источник питания микроконтроллера на 5 вольт, в качестве фильтра используется внешний конденсатор на выводе AREF.

Код программы приведен ниже:

/*****************************************************
Chip type: ATmega8
Program type: Application
AVR Core Clock frequency: 4.000000 MHz
Memory model: Small
External RAM size: 0
Data Stack size: 256
*****************************************************/

#include
#include

#define ADC_VREF_TYPE 0x40 //5V Vcc + C 4.7uF AREF

//PD0 LED1
//PD1 LED2
//PD2 LED3
//PD3 LED4
//PD4 LED5
//PD5 LED6
//PD6 LED7
//PD7 LED8
//PB0 LED9
//PB1 LED10
//PB2 LED11
//PB3 LED12
//PB4 LED13
//PB5 LED14

//PC4 LED15
//PC5 LED16

const
unsigned char PD=
{
0b00000000, //0
0b00000001, //1
0b00000011, //2
0b00000111, //3
0b00001111, //4
0b00011111, //5
0b00111111, //6
0b01111111, //7
0b11111111, //8
//_____________
0b11111111, //9
0b11111111, //10
0b11111111, //11
0b11111111, //12
0b11111111, //13
0b11111111, //14
0b11111111, //15
0b11111111 //16
};
unsigned char PB=
{
0b00000000, //0
0b00000000, //1
0b00000000, //2
0b00000000, //3
0b00000000, //4
0b00000000, //5
0b00000000, //6
0b00000000, //7
0b00000000, //8
//_____________
0b00000001, //9
0b00000011, //10
0b00000111, //11
0b00001111, //12
0b00011111, //13
0b00111111, //14
//_____________
0b00111111, //15
0b00111111 //16
};

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

void ADC_init()
{
// ADC initialization
// ADC Clock frequency: 125.000 kHz
// ADC Voltage Reference: Vcc, cap. on AREF
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x85;
}

void Decode(int signal)
{
PORTD=PD;
PORTB=PB;

if (signal==15) {PORTC |= 0b00010000;PORTC &= 0b11011111;}
else if (signal==16) {PORTC |= 0b00110000;}
else {PORTC &= 0b11001111;}
}

void SetupIO ()
{
// Input/Output Ports initialization
PORTB=0b00000000;
DDRB= 0b00111111;

PORTC=0b00001100;
DDRC= 0b00110000; //PC0,PC1 = ADC0,ADC1, PC2,PC3 setup pins with PUP

PORTD=0x00;
DDRD=0xFF;
}

void main(void)
{
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

SetupIO();
ADC_init();

while (1)
{
Decode(read_adc(0)*0.049*0.32);
delay_ms(100);
};
}

Практически все приёмы, используемые в данном коде, были рассмотрены выше. Единственно хотелось бы отметить расширенную конструкцию с оператором if:
if () {} //если (условие соблюдается) то { }
else if () {} //иначе если (условие соблюдается) то { }
else {} //иначе { }

И выражение read_adc(0)*0.049*0.32
дело в том, что АЦП выдаёт свои значения по шкале 0-1023 (2^10), что соответствует шкале 0-5 вольт (т.к. опорное напряжение 5 вольт), а нам нужно получить сначала вольты, а потом перевести в количество сегментов. 1024*0.049*0.32=16 т.е. вся шкала АЦП, это 16 сегментов.
Число 0.049 взято кратным числу 5 вольт /1024 отсчёта =0.0048828 (~10 отсчётов АЦП), а потом домножено на 0.32 экспериментальным методом, чтобы получить зажигание последнего сегмента при нужном входном напряжении.



Последовательный порт.

А теперь предлагаю окунуться в мир интерфейсов. Самый простой и широко используемый до недавних пор последовательный протокол RS232, хоть и считается устаревшим, но всё ещё входит в состав выпускаемых современных микроконтроллеров - и не в количестве одного, как правило теперь их не менее 4-х. Также, многие устройства, всё еще используют данный интерфейс (например, некоторые экраны VFD NoritakeItron, медленные устройства для производств и т.п.). Данный пример позволяет оценить, насколько легко и просто настроить и использовать RS232 (USART) в микроконтроллерах.


Ниже приведен код, который осуществляет передачу символа 0.

/*****************************************************
Chip type: ATmega8
Program type: Application
AVR Core Clock frequency: 1.000000 MHz
Memory model: Small
External RAM size: 0
Data Stack size: 256
*****************************************************/

#include

// Standard Input/Output functions
//#include

#define BAUDRATE 57600
#define BaudValue ((11059200UL/(BAUDRATE*16UL))-1)

void USART_Transmit(unsigned char data)
{
//{while (!(UCSRA & (1<
UDR = data;
while(!(UCSRA & (1<
//UDR = data; //Начало передачи данных
}

void USART_init(void)
{
UBRRH = BaudValue >> 8;
UBRRL = BaudValue & 0xFF;
//
UCSRB=(1<
DDRD=0x02;
UCSRC = (1<
//UCSRA = (1<
}

void main(void)
{
ACSR=0x80;
SFIOR=0x00;
USART_init();
while (1) { USART_Transmit(0x30); };
}


Учтите, что Proteus не поддерживает эмуляцию UCSRC (установка параметров связи порта), поэтому установите частоту генератора 3500000, а в терминале поставьте следующие параметры:




Здравствуйте, датагорцы!

После публикации моей первой статьи, меня завалили вопросами о микроконтроллерах, как, что, куда, почему…

Чтобы вы смогли разобраться, как этот чёрный ящик работает, я расскажу вам, о микроконтроллере (далее МК) ATmega8. В принципе фирма Atmel выпускает целую серию МК семейства AVR – это подсемейства Tiny и Mega. Я не буду расписывать достоинства тех или иных МК, это уж вам решать, что вам больше всего подходит. Некоторые представители большой семьи:

Итак, ATmega8, самый простой МК из всех ATmega:

Начнем изучать внутренности по упрощенной структурной схеме:

Это обобщённая схема всех ATmega.

Все микроконтроллеры AVR построены по так называемой Гарвардской архитектуре, то есть использована раздельная адресация памяти программ и памяти данных. Преимущества этой архитектуры заключаются в повышенном быстродействии, например ATmega выполняет одну инструкцию за один тактовый импульс, то есть при частоте 16МГц МК выполняет 16 миллионов операций в секунду.

А теперь о требухе по порядку.
1. Тактовый генератор выполняет синхронизацию всех внутренних устройств.
2. ПЗУ – постоянное запоминающее устройство, используется для хранения программы и неизменяемых данных (констант).
3. Дешифратор команд – он тут самый главный, управляет всем, что ему под руку попадётся.
4. АЛУ – арифметико-логическое устройство, выполняет арифметические (сложение, вычитание и т.д.) и логические (И, ИЛИ, НЕ, Исключающее ИЛИ) операции над числами.
5. РОН – регистры общего назначения, ими АЛУ оперирует, а так же используются для временного хранения данных. Регистры РОН могут объединяться в регистровые пары:
r26: r27 – X;
r28: r29 – Y;
r30: r31 – Z.

Регистровые пары используются для косвенной адресации данных в ОЗУ.
6. ОЗУ – оперативное запоминающее устройство, используется для хранения данных, массивов и стека.
7. PORTA-PORTn – связь с внешним миром, порты ввода/вывода, ну енто понятно для чего…
8. Спец. УВВ – специальные устройства ввода/вывода, контроллеры разной периферии, например USART (по другому СОМ-порт), иногда USB, АЦП, ЦАП, I2C, короче, чего только там нет…

Ну да это всё теория, а вам не терпится что-то склеить, попробовать, и чтобы енто дело работало! Тогда перечислим что нам нужно:

1. Программатор с соответствующим софтом, об этом я писал в прошлой статье;
2. Компилятор языка Си, Code Vision AVR, имеет неплохой инструментарий для разработки программ для МК;

Перед тем как начать программирование на Си, неплохо бы ознакомиться с какой-нибудь литературой по этому языку, например есть замечательная книга Кернигана и Ритчи «Язык С».

Ну да ладно, начнём…

Тестовая схема.

Давайте соберём такую схему:

Это будет базовая модель. Кстати схему лучше собрать на макетной плате, а МК сунуть в панельку. Но такая схема бессмысленна. Добавим, например, светодиод, и не забудем про токоограничивающий резистор. Подключим его к нулевому выводу порта В.
Схема будет иметь следующий вид:

Включим питание… НОЛЬ!!! А что вы хотели без программы?
Значит…

Пишем программу!

Итак, вы запустили CVAVR, что нужно сделать первым делом? Запускаем мастер Code Wizard AVR, нажав на кнопочку с шестерёнкой в панели инструментов, появится окно мастера:

Здесь выбираем тип МК и тактовую частоту. Далее переходим на вкладку Ports:

И настраиваем, какой бит какого порта у нас будет настроен на ввод или вывод, порт В бит 0 у нас будет выдавать сигнал, а остальные принимать.
Чтобы сохранить настройки выбираем меню File / Generate Save and Exit, вводим имена файлов на все последующие запросы, желательно чтобы они были одинаковые, ну например «prj». Всё, мы сгенерировали исходный текст программы с установками заданными в мастере.

Давайте посмотрим что у нас вышло. Первые 22 строки это комментарий, то есть на действия программы он не имеет никакого влияния, таким образом, всё, что находится между «/*» и «*/» является комментарием, и компилятор всё это дело игнорирует. В 24 сроке у нас подключается заголовочный файл, в нём описано как какие регистры называются и по какому адресу находятся. Для программирования на Си подробности здесь излишни.
С 28 строки у нас начинается основная программа определением функции main() ,

Прокрутим ниже. Обратите внимание на строки 36 и 37, здесь присваивается значение порту В и выбирается направление передачи. Вообще наглядно это выглядит так:

То есть, если в какой-нибудь бит регистра DDRB записать единичку, то соответствующий бит порта В будет работать на вывод. В нашем случае это бит 0.
Кстати, у портов в ATmega есть одна приятная особенность, даже если порт настроен на ввод, а в регистр PORTx записать единички, то подключатся внутренние подтягивающие резисторы к плюсу питания, что исключает использование внешних навесных резисторов. Это удобно при подключении всяких датчиков и кнопок.

Скомпилируем программу, для этого нажмём кнопочку Make the Project, или через меню Project / Make. Ошибок быть не должно, если вы что-нибудь не подправили.

Откроем папку C:\cvavr\bin\, найдём там файл prj.hex. Это и есть скомпилированная нами программа для МК. Подключим программатор к ПК и МК. Запустим программу Pony Prog и перетащим в её окно файл prj.hex. Включите питание МК и залейте в него нашу программу… Опять ничего? А проблема в том что мы ничего на нулевой разряд порта В не вывели, вернее вывели, только это ноль. А чтобы наш светодиод загорелся, надо вывести единицу. Так и сделаем, заменим в 36 строке «PORTB=0x00;» на «PORTB=0x01;». Скомпилируем заново программу. А в программе Pony Prog перезагрузим файл при помощи сочетания клавиш Ctrl+L или меню File / Reload Files. Сотрём МК и снова зальём «прошивку» в него. УРА!!! ОНО РАБОТАЕТ!!!

Кстати, Pony Prog поддерживает скрипты, и чтобы не мучаться с перезагрузкой, стиранием и записью, можно просто написать скрипт с расширением.e2s, и обозвать его, например, prog.e2s. Сделать это можно с помощью блокнота. Содержимое у него будет такое:

SELECTDEVICE ATMEGA8
CLEARBUFFER
LOAD-ALL prj.hex
ERASE-ALL
WRITE-ALL

Поместить скрипт следует в одну папку с.hex-файлом, и запускать его двойным щелчком мыши. Можно поместить ярлык на рабочий стол, это уж кому как удобно…

Продолжение следует…