Файлы

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

Микроконтроллер Atmega8 довольно часто используется в радиолюбительских схемах,сделан он с использованием технологии CMOS на AVR RISC архитектуре. За один такт выполняется одна инструкция, на микроконтроллера ATmega8 достигается производительность в 1MIPS на МГц, и тем самым достигается наиболее оптимальная производительность и потребляемая энергия.

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

  • Программная память равна 8 кБ, цикл составляет 10000 раз;
  • объем флеш памяти 512 байт который хранит переменные (цикл перезаписи 100 000);
  • Оперативная память (ОЗУ) 1кб;
  • 32 регистра общего назначения;
  • Два 8-ми разрядных таймера/счетчика с раздельным прескалером, режим сравнения, режим захвата;
  • таймер реального времени с независимым генератором;
  • три канала ШИМ;
  • шесть каналов АЦП, канал 10-ти разрядный;
  • последовательный интерфейс двухпроводной;
  • USART;
  • SPI ;
  • Сторожевой таймер с независимым генератором;
  • аналоговый компаратор;
  • внутренний RC генератор;
  • возможность обработки внешних и внутренних прерываний;
  • режимы с пониженным энергопотреблением: Idle,Power-save,Power-down,Standby,ADC Noise Reduction;
  • напряжение от 4.5 В до 5.5 В;
  • тактовая частота от 0-16 МГц.

Расположение выводов микроконтроллера Atmega8

Порты ввода/вывода

Порты микроконтроллера сгруппированы в 3 группы:

Порт D

  • PD0 — цифровой вход/выход, RxD — вход приемника USART;
  • PD1 — цифровой вход/выход, TxD — выход передатчика USART;
  • PD2 — цифровой вход/выход, INT0 — внешнее прерывание нулевого канала;
  • PD3 — цифровой вход/выход, INT1 — внешнее прерывание первого канала;
  • PD4 — цифровой вход/выход, XCK — внешний такт для USART, T0 — внешний вход Timer0;
  • PD5 — цифровой вход/выход, T1 — внешний вход Timer1;
  • PD6 — цифровой вход/выход, AIN0 — вход аналогового компаратора канал 0;
  • PD7 — цифровой вход/выход, AIN1 — вход аналогового компаратор канал 1.

Порт C

  • PС0 — цифровой вход/выход, ADC0 — аналоговый вход канал 0;
  • PС1 — цифровой вход/выход, ADC1 — аналоговый вход канал 1;
  • PС2 — цифровой вход/выход, ADC2 — аналоговый вход канал 2;
  • PС3 — цифровой вход/выход, ADC3- аналоговый вход канал 3;
  • PС4 — цифровой вход/выход, ADC4- аналоговый вход канал 3;
  • PC5 — цифровой вход/выход, SDA- двух проводной последовательный интерфейс (канал данных);
  • PС6 — цифровой вход/выход, RESET- внешний сброс.

Порт B

  • PB0 — цифровой вход/выход, ICP1 — захват входа 1;
  • PB1 — цифровой вход/выход, OC1A — выход сравнения/ШИМ 1A;
  • PB2 — цифровой вход/выход, OC1B — выход сравнения/ШИМ 1B;
  • PB3 — цифровой вход/выход, OC2 — вход сравнения/ШИМ2, MOSI
  • PB4 — цифровой вход/выход, MISO
  • PB5 — цифровой вход/выход, SCK — тактовый вход;
  • PB6 — цифровой вход/выход, XTAL1- тактовый вход для резонатора;
  • PB7 — цифровой вход/выход, XTAL2- тактовый вход для резонатора, TOSC2 — тактовый вход в случае работы от встроенного резонатора.

Выводы для питания микроконтроллера

  • VCC — вход напряжение питания;
  • GND — это общий «минусовой» вывод, земля;
  • AVcc — вход напряжения питания для модуля АЦП;
  • ARef — вход опорного напряжение для АЦП.

Datasheet микроконтроллера Atmega8

  • < Назад
  • Вперёд >

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

Честно говоря, выбор языка программирования и среды разработки вопрос очень ответственный, навязывать кому-то свои предпочтения и что-то советовать дело довольно-таки трудное.
Давайте попробуем подойти к этому выбору не предвзято, чисто с практической стороны.
1. Существует два основных языка программирования микроконтроллеров — Ассемблер (язык низкого уровня) и Си (язык высокого уровня).
Если мы хотим программировать микроконтроллеры используя полностью все их возможности (а мы это хотим), то необходимо изучать эти два языка.
2. Среда разработки для программирования микроконтроллеров.
Тут выбор большой и очень много мнений. Поэтому можно сказать: «Каждая лягушка хвалит свое болото». Мне, к примеру, очень нравится малораспространенная графическая среда разработки «Algorithm Builder», и «квакать» о ее преимуществах перед другими программами я могу очень долго. Но будем делать выбор, как было сказано выше, не предвзято и практично.
Микроконтроллеры AVR выпускает фирма Atmel, она же предоставляет в наше распоряжение бесплатную среду программирования «Atmel Studio» (бывшая AVR Studio). На ней мы и остановимся.
Интегральная среда разработки (IDE — Integrated development environment) Atmel Studio позволит нам:
— писать программы как на Ассемблере, так и на Си (Почему на Си. Программа «Atmel Studio» позволяет писать программы на трех языках (О чем мы и погорим в первой статье), но есть одно но: программы на Си++ мы рассматривать не будем, по одной причине, и в следующей статье я расскажу об этом
— отладить программу
— перевести программу в машинный код (откомпилировать)
— записать программу в микроконтроллер

Все, выбор мы сделали:

Теперь осталось выполнить два пункта:
1. Обзавестись каким-нибудь стартовым набором (для начала хватит и микроконтроллера ATmega8, нескольких светодиодов, пары кнопок и сопротивлений к ним).
2. Установить (именно установить, а не скачать, и с регистрацией) с официального сайта Atmel (http://www.atmel.com/ru/) программу Atmel Studio.
Программировать микроконтроллеры мы будем с использованием программатора USBASP.
Отдельной статьи по Atmel Studio я писать не буду, будем изучать ее постепенно, по мере надобности и в связке со статьями по устройству и программированию микроконтроллеров.

3. Я добавил в набор очень нужную вещь, она Вам в дальнйшем очень пригодится — USB-TTL преобразователь (конвертер). Почему пригодится:
— русифицируя программу мы установили «Visual Studio-2015», кто не русифицировал программу — установите последнюю версию «Visual Studio», мы не только будем изучать базовую программу «Atmel Studio». К сожалению, на сегодняшний день только программа 2015 года позволяет перейти на русский язык в «Atmel Studio», но а мы с Вами, в «Visual Studio», будем создавать оболочки для работу с МК.

Следующие статьи

Основы программирования микроконтроллеров AVRУстройство и программирование микроконтроллеров AVR в среде Atmel Studio на языках Ассемблер и Си
Published by: Мир микроконтроллеров

Date Published: 10/01/2016

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

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

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

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

  • 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) для автоматизированных систем сборки.

Распиновка Atmega8

На следующей странице публикуется расположение выводов данного микроконтроллера при использовании разных типов корпусов:

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

Внимание!

Обратите внимание на такой факт: микросхема микроконтроллера может иметь (и имеет в данной модели) несколько выводов для подключения источника питания. То есть имеется несколько выводов для подключения «земли» — «общего провода», и несколько выводов для подачи положительного напряжения

Изготовители микроконтроллеров рекомендуют подключать соответствующие выводы вместе, т.е., минус подавать на все выводы, помеченные как Gnd (Ground — Земля), плюс — на все выводы помеченные как Vcc.

При этом через одинаковые выводы МК не должны протекать токи, так как внутри корпуса МК они соединены тонкими проводниками! То есть при подключении нагрузки эти выводы не должны рассматриваться как «перемычки».

_____________________________________________________________________

   Мы хотим, чтобы светодиод моргал с частотой видимой нашему глазу. Это единицы, десятки герц. Допустим, мы выбрали 1 Гц. Мой микроконтроллер работает на частоте 8 МГц, длительность одного такта =1/8000000 Гц = 125 нс. Сигнал частотой 1 Гц имеет период повторения 1 c. Светодиод будет гореть только половину периода — 0,5с. Делим 0,5 с на 125 нс и получаем искомое число тактов – 4000000. Это число укладывается в диапазон типа unsigned long int. Следующая строчка нашей программы – вызов функции:__delay_cycles(4000000);Далее – гасим светодиод и снова вызываем функцию задержки:PORTC = 255;__delay_cycles(4000000);5 шаг алгоритма – вернуться на шаг 2. По сути дела нам нужно повторить кусок программы, зациклить его. Для этих целей в Си существуют три типа циклов: for, while и do. Мы используем while.

________________________________________________________

   Для каждого типа микроконтроллера есть свой заголовочный файл. Для ATMega8535 этот файл называется iom8535.h, для ATMega16 – iom16.h. По идее мы должны в начале каждой программы подключать заголовочный файл того микроконтроллера, который мы используем.  Умные люди немного облегчили нам жизнь и написали заголовочный файл ioavr.h. Препроцессор обрабатывает этот файл и в зависимости от настроек проекта включает в нашу программу нужный заголовочный файл. Итак, следущая строчка программы #include <ioavr.h>    В нашей программе мы будем использовать задержку. Задержку можно реализовать программно и аппаратно. Сейчас нас интересует программная задержка. IAR содержит библиотеку, в которой уже есть готовая функция задержки. Нам нужно подключить к нашей программе эту библиотеку. Как это сделать? Каждая библиотека имеет свой заголовочный файл в котором описано какие фукции она содержит. Этот файл мы и должны включить в программу. Делается это, как вы догадались с помощью директивы #include.#include <intrinsics.h>       Основу любой сишной программы составляют функции, и любая  программа на Си имеет хотя бы одну функцию – main().Вообще-то на примере main() не хотелось бы объяснять синтаксис функций, потому что main() хоть и является функцией, но вызывается не как обычно, а автоматически. С этой функции микроконтроллер начинает выполнение написанной нами программы. Вызовы всех других функций, наших или библиотечных, должны быть записаны в коде. Как вызывается функция, мы увидим дальше.У функции есть заголовок – int main(void) и тело – оно ограниченно фигурными скобками {}. В тело функции  мы и будем добавлять наш код.

Кодировка инструкций

Назначения битов:

  • rrrrr = Исходный регистр
  • rrrr = Исходный регистр (R16 – R31)
  • rrr = регистр источника (R16 – R23)
  • RRRR = пара регистров источника (R1: R0 – R31: R30)
  • ddddd = Регистр назначения
  • dddd = Регистр назначения (R16 – R31)
  • ddd = Регистр назначения (R16 – R23)
  • DDDD = Пара регистров назначения (R1: R0 – R31: R30)
  • pp = пара регистров, W, X, Y или Z
  • y = бит пары регистров Y / Z (0 = Z, 1 = Y)
  • u = FMUL (S (U)) со знаком 0 = со знаком или 1 = без знака
  • s = бит сохранения / загрузки (0 = загрузка, 1 = сохранение)
  • c = вызов / прыжок (0 = прыжок, 1 = вызов)
  • cy = с переносом (0 = без переноса, 1 = с переносом)
  • e = Расширить адрес косвенного перехода / вызова с помощью EIND (0 = 0: Z, 1 = EIND: Z)
  • q = Расширить адрес программной памяти с помощью RAMPZ (0 = 0: Z, 1 = RAMPZ: Z)
  • aaaaaa = адрес пространства ввода / вывода
  • aaaaa = адрес пространства ввода / вывода (только первые 32)
  • bbb = номер бита (0–7)
  • B = битовое значение (0 или 1)
  • kkkk = 4-битная беззнаковая константа (код операции DES)
  • kkkkkk = 6-битная беззнаковая константа
  • KKKKKKKK = 8-битная константа

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

Обзор набора команд Atmel AVR
1 5 1 4 1 3 1 2 1 1 1 0 9 8 7 6 5 4 3 2 1 Инструкция
NOP
1 DDDD RRRR MOVW Rd, Rr Перемещение пары регистров
1 дддд рррр MULS Rd, Rr
1 1 ддд ррр MULSU Rd, Rr
1 1 ддд 1 ррр FMUL Rd, Rr
1 1 1 ддд ты ррр FMULS (U) Rd, Rr
код операции р ддддд рррр 2-операндные инструкции
c̅y̅ 1 р ддддд рррр CPC / CP Rd, Rr
c̅y̅ 1 р ддддд рррр SBC / SUB Rd, Rr
Сай 1 1 р ддддд рррр ADD / ADC Rd, Rr (LSL / ROL Rd, когда Rd = Rr)
1 р ддддд рррр CPSE Rd, Rr
1 р ддддд рррр И Rd, Rr
1 1 р ддддд рррр EOR Rd, Rr
1 1 р ддддд рррр ИЛИ Rd, Rr
1 1 1 р ддддд рррр MOV Rd, Rr
1 1 KKKK дддд KKKK ИПЦ Rd, тыс.
1 opc KKKK дддд KKKK Регистр-немедленные операции
1 c̅y̅ KKKK дддд KKKK SBCI / SUBI Rd, K
1 1 KKKK дддд KKKK ORI Rd, K SBR Rd, K
1 1 1 KKKK дддд KKKK ANDI Rd, K CBR Rd, K
1 k кк s ддддд y ккк LDD / STD Rd через Z + k или Y + k
1 1 s ддддд код операции Загрузка / сохранение операций
1 1 s ддддд LDS rd, i / STS i, rd
16-битный немедленный адрес SRAM i
1 1 s ддддд y 1 LD / ST Rd через Z + / Y +
1 1 s ддддд y 1 LD / ST Rd через −Z / −Y
1 1 ддддд 1 q LPM / ELPM Rd, Z
1 1 ддддд 1 q 1 LPM / ELPM Rd, Z +
1 1 1 ддддд 1 XCH Z, Rd
1 1 1 ддддд 1 1 LAS Z, Rd
1 1 1 ддддд 1 1 LAC Z, Rd
1 1 1 ддддд 1 1 1 LAT Z, Rd
1 1 s ддддд 1 1 LD / ST Rd через X
1 1 s ддддд 1 1 1 LD / ST Rd через X +
1 1 s ддддд 1 1 1 LD / ST Rd через −X
1 1 s ддддд 1 1 1 1 POP / PUSH Rd
1 1 1 ддддд код операции Инструкции с одним операндом:
1 1 1 ддддд COM Rd
1 1 1 ддддд 1 NEG Rd
1 1 1 ддддд 1 SWAP Rd
1 1 1 ддддд 1 1 INC Rd
1 1 1 ддддд 1 (зарезервированный)
1 1 1 ддддд 1 1 ASR Rd
1 1 1 ддддд 1 1 ЛСР Роуд
1 1 1 ддддд 1 1 1 ROR Rd
1 1 1 BBB 1 Бит сброса / установки регистра состояния SEx / CLx
1 1 1 1 код операции 1 Инструкции с нулевым операндом
1 1 1 1 1 RET
1 1 1 1 1 1 РЕТИ
1 1 1 1 1 Икс 1 (зарезервированный)
1 1 1 1 1 Икс Икс 1 (зарезервированный)
1 1 1 1 1 1 СПАТЬ
1 1 1 1 1 1 1 ПЕРЕРЫВ
1 1 1 1 1 1 1 WDR
1 1 1 1 1 1 1 1 (зарезервированный)
1 1 1 1 1 1 q 1 LPM / ELPM
1 1 1 1 1 1 1 1 SPM
1 1 1 1 1 1 1 1 1 SPM Z +
1 1 1 c е 1 1 Косвенный переход / вызов в Z или EIND: Z
1 1 1 ддддд 1 1 DEC Rd
1 1 1 кккк 1 1 1 DES раунд k
1 1 1 ккккк 1 1 c k JMP / CALL abs22
ккккккккккккккк
1 1 1 1 кк pp кккк ADIW Rp, uimm6
1 1 1 1 1 кк pp кккк SBIW Rp, uimm6
1 1 1 B ааааа BBB CBI / SBI a, b (сброс / установка бита ввода / вывода)
1 1 1 B 1 ааааа BBB SBIC / SBIS a, b (битовый тест ввода / вывода)
1 1 1 1 р ддддд рррр MUL, без знака: R1: R0 = Rr × Rd
1 1 1 s аа ддддд аааа ВХОД / ВЫХОД в пространство ввода / вывода
1 1 c 12-битное смещение со знаком RJMP / RCALL к ПК + simm12
1 1 1 KKKK дддд KKKK LDI Rd, K
1 1 1 1 7-битное смещение со знаком BBB Условный переход по биту регистра состояния
1 1 1 1 1 s ддддд BBB Бит регистра BLD / BST в STATUS.T
1 1 1 1 1 1 B ддддд BBB SBRC / SBRS пропускает, если бит регистра равен B
1 1 1 1 1 Икс Икс ддддд 1 BBB (зарезервированный)

3.2 Совет #2 — глобальные переменные и локальные значения

   В большинстве случаев не рекомендуется использовать глобальные переменные. Применяйте локальные переменные везде, где возможно. Если переменная используется только в функции, ее следует объявлять внутри функции как локальную переменную.    Теоретически, выбор между глобальными и локальными переменными должен определяться тем, как она используется.    Если переменная объявлена как глобальная, в оперативной памяти для нее выделяется уникальный адрес. Также для доступа к глобальной переменной, как правило, используются дополнительные байты (по 2 на 16-и разрядный адрес), чтобы получить ее адрес.    Локальные переменные обычно размещаются в регистрах или в стеке. Когда вызывается функция, локальные переменные задействуются. Когда функция завершает свою работу, локальные переменные могут быть удалены.    Два примера в таблице 3-3 показывают эффект применения глобальных и локальных переменных.Таблица 3-3. Пример глобальных и локальных переменных.

   В левом примере мы объявляем однобайтовую глобальную переменную. Avr-size утилита показывает, что мы используем 104 байта памяти программ и один байт памяти данных при оптимизации –Os.

   В правом примере, мы объявляем локальную переменную внутри main() функции и код уменьшается до 84 байтов, а оперативная память не используется совсем.

Платы Arduino

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

Сердце платы – микроконтроллер семейства AVR. Изначально был применён микроконтроллер atmega8, но его возможности не безграничны, и плата подвергалась модернизации и изменениям. Стандартная плата, которая наиболее распространена у любителей – это плата версии UNO, существует много её вариаций, а её размеры сравнимы с кредитной карточкой.

Плата Arduino Nano –  полный аналог большего собрата, но в гораздо меньших размерах, версия arduino atmega168 была самой популярной и недорогой, но её сменила другая модель – arduino atmega328, стоимость которой аналогична, а возможности больше.

Следующей важной деталью является печатная плата. Разведена и запаяна на заводе, позволяет избежать проблем с её созданием, травлением и пайкой

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

Клеммная колодка – отличный способ сделать надёжное разъёмное соединение и быстро выполнить изменения в схеме прототипов ваших устройств. Для тех, кому не хватает стандартных разъёмов, есть более крупные и мощные платы, например, на atmega2560, у которой доступно полсотни портов для работы с периферией.

На фото изображена плата Arduino Mega 2560. На её основе можно собрать довольно сложного робота, систему умного дома или 3d-принтер на ардуино.

Не стоит думать, что младшие версии слабы, например, микроконтроллер atmega328, на котором построены модели Uno, nano, mini и другие, имеет вдвое больше памяти по сравнению с 168 моделью – 2 кб ОЗУ и 32 кб Flash памяти. Это позволяет записывать более сложные программы в память микроконтроллера.

Ардуино своими руками

Atmega2560 – хоть и мощный и продвинутый контроллер, но проще и быстрее собрать первую плату на atmega8 или 168.

Левая часть схемы – это модуль связи по USB, иначе говоря, USB-UART/TTL конвертер. Его, вместе с обвязкой, можно выбросить из схемы, для экономии места, собрать на отдельной плате и подключать только для прошивки. Он нужен для преобразования уровней сигнала.

DA1 – это стабилизатор напряжения L7805. В качестве основы можно использовать целый ряд avr микросхем, которые вы найдете, например, серии, arduino atmega32 или собрать arduino atmega16. Для этого нужно использовать разные загрузчики, но для каждого из МК нужно найти свой.

Можно поступить еще проще, и собрать всё на беспаечной макетной плате, как это показано здесь, на примере 328-й атмеги.

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

3.7 Совет #7 – низко уровневые ассемблерные инструкции

   Ассемблерные команды всегда лучше оптимизированного кода. Единственный недостаток ассемблерного кода – это непереносимый синтаксис, так что это в большинстве случаев его не рекомендуется использовать.   Чтобы улучшить читаемость и портируемость кода, можно использовать ассемблерные макросы. Такими макросами можно заменять функции, которые генерируются в 2-3 ассемблерные строки. В таблице 3-8 показан пример использования ассемблерного макроса вместо функции. Таблица 3-8. Пример использования низкоуровневых ассемблерных инструкций.

   Для более подробной информации относительно использования ассемблера с языком Си на AVR, ознакомьтесь с разделом “Inline Assembler Cookbook” в руководстве на avr-libc.

Ссылки

Atmel AVR4027: Tips and Tricks to Optimize Your C Code for 8-bit AVR MicrocontrollersAVR4027: Трюки и советы по оптимизации Си кода для 8-и разрядных AVR микроконтроллеров. Ч.2Проект к статье — avr4027.zipВольный перевод — ChipEnable.Ru

____________________________________________________________________

Нам нужен бесконечный цикл. Помещаем наши строчки        PORTC = 0;    __delay_cycles(4000000);    PORTC = 255;      __delay_cycles(4000000);внутрь бесконечного цикла, и вот что в итоге должно получиться://первая прога на Си для  AVR#include <ioavr.h>#include <intrinsics.h>int main(void){  DDRC = 255;  while(1){    PORTC = 0;    __delay_cycles(4000000);    PORTC = 255;      __delay_cycles(4000000);  }  return 0;}   Если у вас другой результат – пройдитесь снова по тексту. Может, я что-то полохо объяснил, может, вы что-то плохо поняли.         Кликаем Make на  панели с кнопками (можно нажать F7). Если все сделано правильно, IAR откомпилирует и соберет проект, а внизу откроется окно Messages, в котором будет написано:…..Total number of errors: 0Total number of warnings: 1   Все прошло без ошибок, но компилер выдал warning — statement is unreachable. Ничего страшного – он просто сообщает нам, что функция main() никогда не возвратит значение. Просто у нас в программе бесконечный цикл и микроконтроллер при работе никогда не дойдет до строчки return 0.   Ищем папку проекта на жестком диске. Там, в директории Release лежит файл прошивки led.hex. Грузим в микроконтроллер… Светодиод заморгал? Отлично. А теперь легко проверить правильно ли работает наша программа. Берем механические часы и смотрим, моргает ли светодиод в такт с секундной стрелкой. У меня моргает, а у вас?

3.3 Совет #3 — индекс цикла

   Циклы широко используются при программировании микроконтроллеров. В Си существуют три типа циклов – “while(){}”, “for(){}“ и “do{}while()”. Если включена опция оптимизации –Os, компилятор будет оптимизировать циклы автоматически, чтобы уменьшить размер кода. Однако мы можем сами немного уменьшить его.    Если используется цикл “do{}while()”, то инкремент и декремент индексной переменной цикла будет давать код разного размера. Обычно мы используем инкремент, чтобы подсчитывать количество циклов от нуля до максимального значения. Однако более эффективно делать наоборот – считать от максимального значения до нуля, то есть использовать декремент.    При инкременте, в каждой итерации цикла необходимо выполнять инструкцию сравнения индексной переменной с максимальным значением. Когда мы используем декремент, в этой инструкции нет необходимости. Как только индексная переменная достигнет нуля, в регистре SREG установится флаг Z.   В таблице 3-4 приведены примеры кода, использующего цикл “do {}while()” с инкрементом и декрементом индексной переменной. Таблица 3-4. Пример do{}while() циклов с инкрементом и декрементом индексной переменной

   Чтобы иметь более прозрачный Си код, мы записали этот пример как “do{count—;}while(count);”, а не “do{}while(count—);”, как обычно пишут в книгах по Си. Однако в обоих случаях размер кода будет одинаковым.