четверг, 1 ноября 2018 г.

Знакомство с ATtiny85

ATtiny85
ATtiny85 - это 8-битный AVR микроконтроллер фирмы Atmel, представитель семейства tiny. Микроконтроллеры данного семейства, как следует из его названия, являются младшими в линейке AVR: у них меньшее число линий ввода-вывода, меньший объем памяти и ограниченный набор периферийных устройств по сравнению с микроконтроллерами mega/XMEGA. Но это окупается их меньшей стоимостью и малыми размерами. Кроме того tiny микроконтроллеры имеют ту же производительность, что и старшие микроконтроллеры семейства mega. Это делает их отличным выбором для создания устройств, не требующих широкого набора периферии, где размер и цена микроконтроллера имеют значение: tinyAVR находят применение в портативных навигаторах, плеерах, сотовых телефонах, спортивных гаджетах, бытовой технике, электронных игрушках, пультах дистанционного управления, интеллектуальных датчиках и во многих других устройствах. Но вернемся к ATtiny85 и ознакомимся с характеристиками данного микроконтроллера.

Характеристики ATtiny85

  • Память программ (FLASH) - 8КБ
  • ОЗУ (SRAM) - 512 байт
  • Энергонезависимая память (EEPROM) - 512 байт
  • Тактовая частота - до 20МГц
  • USI (Universal Serial Interface) - универсальный последовательный интерфейс. Может использоваться в двухпроводном (I2C/TWI) и трехпроводном (SPI) режиме
  • 4-х канальный 10-разрядный АЦП
  • Аналоговый компаратор
  • 2 8-битных таймера-счетчика
  • Сторожевой таймер
  • 8 выводов, 6 из которых могут использоваться как линии ввода-вывода
  • Напряжение питания 2.7 .. 5.5В
Более подробная информация о микроконтроллере ATtiny85 приведена в даташите.
Данных параметров вполне достаточно для решения ряда задач. И вы можете найти множество интересных проектов на базе ATtiny85, подтверждающих это (загляните, например, в мою публикацию Игральный кубик на ATtiny85). Также микроконтроллер поддерживает три режима энергосбережения для создания энергоэффективных устройств. Одним словом данный микроконтроллер заслуживает внимания, поэтому сегодня я расскажу о том, как программировать ATtiny85 в привычной нам среде разработки Ардуино.

Программирование ATtiny85 в IDE Arduino

Итак, программировать ATtiny85 будем в IDE Arduino, причем ее версия должна быть не ниже 1.6.4, а для прошивки нам потребуется программатор. В качестве программатора я буду использовать Ардуино Уно. Эта тема подробно описана в статье Arduino as ISP, поэтому сегодня не станем заострять на ней внимание. Можно использовать и другие программаторы, например, рассмотренный недавно USBasp. В этом случае пропустите следующий пункт и переходите к настройке IDE.

Подготовка программатора Arduino as ISP

Запускаем IDE Arduino, открываем скетч ArduinoISP (меню Файл > Примеры > ArduinoISP), подключаем Ардуино к компьютеру и загружаем в нее скетч. На этом плату Ардуино пока можно отложить, займемся настройкой IDE.

Добавление ATtiny85 в список плат IDE Arduino

В среде разработки Ардуино отсутствуют компоненты, необходимые для работы с микроконтроллерами tiny, поэтому сейчас нужно добавить их в IDE. Для этого скопируйте в буфер обмена следующую строку:
https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json

Теперь в IDE открываем меню Файл > Настройки и в появившемся окне нажимаем кнопку рядом с полем ввода дополнительных ссылок для Менеджера плат. В открывшемся окне вставляем скопированную ранее ссылку новой строкой. Нажимаем OK для сохранения изменений и выхода из настроек:

Добавление поддержки ATtiny85 в IDE Arduino

Кстати, в окне ввода дополнительных ссылок можно перейти по ссылке под полем ввода, откроется страница https://github.com/arduino/Arduino/wiki/Unofficial-list-of-3rd-party-boards-support-urls. На ней вы найдете большое количество ресурсов для поддержки различных плат и микроконтроллеров, в том числе и используемый нами пакет от David A. Mellis.

Следующий шаг - установка файлов для поддержки ATtiny85. Переходим в меню Инструменты > Плата > Менеджер плат... Чтобы не искать в списке интересующий нас пакет, отфильтруем его, введя в текстовом поле слово tiny. Выбираем пакет attiny by David A. Mellis и нажимаем установить. После выполнения установки закрываем окно Менеджера плат:

Добавление поддержки ATtiny85 в IDE Arduino

Подключение ATtiny85 к программатору

Технология внутрисхемного программирования (ISP) использует линии интерфейса SPI. Поэтому выводы MOSI, MISO, SCK ATtiny85 подсоединяем к одноименным выводам Ардуино; вывод RESET ATtiny85 к цифровому выводу 10 Ардуино. Запитываем микроконтроллер от линий 5V и GND Ардуино. И, возможно, потребуется установить электролитический конденсатор между выводами Reset и GND Ардуино, чтобы предотвратить автоматическую перезагрузку. Ниже показаны распиновка микроконтроллера ATtiny85 и схема его подключения к Ардуино.

ATtiny85 pinout

ATtiny85 прошивка



Загрузка скетча в ATtiny85

Откроем скетч Blink из стандартных примеров Ардуино (меню Файл > Примеры > Basics > Blink). Заменим в скетче текст LED_BUILTIN на 0 в трех местах, должно получиться:

void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(0, OUTPUT);
}

void loop() {
  digitalWrite(0, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);             // wait for a second
  digitalWrite(0, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);             // wait for a second
}

Теперь в списке плат выберем ATtiny25/45/85, конкретную модель микроконтроллера укажем в меню Процессор. В меню Clock выберем значение Internal 8MHz. И, поскольку в качестве программатора мы используем Ардуино, выберем значение Arduino as ISP в меню Программатор:

Программирование ATtiny85 в IDE Arduino

Теперь всё готово для загрузки скетча в ATtiny85. Подключаем Ардуино к компьютеру, нажимаем кнопку загрузки и дожидаемся сообщения о завершении операции.

Для проверки работы скетча подключим к микроконтроллеру светодиод: длинным выводом к PB0, коротким к GND. Светодиод начнет мигать, только интервал составит не 1 секунду, а 8 (при условии, что мы имеем дело с новым/чистым микроконтроллером). И вот почему: новые микроконтроллеры идут с завода с запрограммированным фьюзом CKDIV8 (Divide clock by 8), что приводит к делению тактовой частоты на 8. Поэтому сейчас мы сбросим данный фьюз, чтобы микроконтроллер работал на частоте 8МГц.

Изменение тактовой частоты ATtiny85

Работу с фьюзами я уже описывал в статье Что такое фьюзы. Чтение и запись фьюзов Ардуино. Тогда для работы с ними использовалась программа avrdude. Но сейчас для сброса фьюза CKDIV8 мы поступим проще: установка конфигурационных байтов входит в процедуру записи загрузчика, поэтому в IDE Arduino переходим в меню Инструменты и выбираем команду Записать загрузчик. В действительности запись загрузчика в микроконтроллер не произойдет, т.к. его просто нет в используемом нами пакете. Но зато будут перезаписаны конфигурационные байты, новые значения будут взяты из файла boards.txt, в них как раз бит CKDIV8 сброшен. Также будет очищена память программ, поэтому скетч нужно будет загрузить в микроконтроллер еще раз.

После выполнения указанных действий ATtiny85 заработает на частоте 8МГц и светодиод начнет мигать с интервалом в 1 секунду. Микроконтроллер можно отключить от Ардуино и запитать от источника 3-5В.


Когда вы в очередной раз захотите изменить тактовую частоту ATtiny85, нужно будет выбрать соответствующее значение в меню Инструменты > Clock и повторно выполнить команду Записать загрузчик. И, как вы можете видеть, в меню выбора частоты доступно значение 16МГц - оно получается умножением тактовой частоты внутреннего RC-генератора (8МГц). Этой опцией не могут похвастаться даже старшие микроконтроллеры семейства mega. Такой способ тактирования применен в плате Digispark, построенной на ATtiny85.

Вместо заключения

Как видите, программирование ATtiny85 в IDE Arduino не составляет труда. А после записи загрузчика оно станет еще проще и сможет быть выполнено без использования программатора. О том как это сделать читайте в статье Прошиваем загрузчик micronucleus в ATtiny85.

23 комментария:

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

    ОтветитьУдалить
  2. Здравствуйте, подскажите пожалуйста почему на атини85 на 1 ноге всегда постоянные 5в и никак не могу поменять на 0 программно через атмель и дудку. В чем причина, вроде пин цифровой и должен управляться???

    ОтветитьУдалить
    Ответы
    1. Добрый день!
      Первый пин совмещён со входом внешнего сброса. И если внешний сброс разрешен (фьюзом RSTDISBL), то он всегда подтянут к питанию внутренним резистором.
      Вам нужно запретить внешний сброс, тогда можно будет использовать первый вывод как и все остальные. Только вы уже не сможете ничего залить в микроконтроллер через isp программатор. Поэтому на этапе отладки удобнее использовать загрузчик micronucleus: он позволяет загружать скетчи, не используя reset. А когда скетч уже отлажен, восстановить фьюзы таким способом: https://tsibrov.blogspot.com/2019/04/unlocking-attiny85.html?m=1
      Затем залить скетч без загрузчика и снова запретить внешний сброс

      Удалить
    2. Спасибо за ответ) и за офигенный сайт!

      Удалить
    3. Уточнение: Первый вывод можно использовать не как все остальные, а только как вход.

      Удалить
  3. Добрый день. Подскажите как работать с EEPROM на атини85? Скачал библиотеки для нее, но там пример только с внешним EEPROM. На стандартные команды компилятор ругается. 'eeprom_update_int' was not declared in this scope

    ОтветитьУдалить
    Ответы
    1. Добрый день!
      А зачем качали библиотеку для EEPROM? Она же входит в состав IDE Arduino. И стандартные примеры нормально компилируются для tiny85.

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

    ОтветитьУдалить
    Ответы
    1. Да, есть такое дело. Спрос в основном на ATmega328P. Их полно, продавцы, конкурируя, снижают цены, а менее популярные контроллеры остаются дорогими.

      Удалить
  5. Этот комментарий был удален автором.

    ОтветитьУдалить
    Ответы
    1. Давно ничего не заказывал на али. 328P последний раз брал в июле прошлого года по 75р в корпусе qfp32. Сегодня зашел посмотреть - стало дороже. Причем дороже и в долларах (я привык ориентироваться на цены в долларах; на 328p считал хорошим ценник ~1.15$), а с учетом текущего курса в рублях получается еще дороже.

      Удалить
  6. Добрый вечер! Помогите пожалуйста с Attiny85. Вот уже второй день "сражаюсь" с ней с простым скетчем Blink. Все делал по вашей статье. Прошивается без ошибок, но результата нет. Ощущение что что-то упустил... какую-то мелочь... но я новичок в этом... Так же собрал схему сброса ... но не помогло...
    С уважением Дмитрий.

    ОтветитьУдалить
    Ответы
    1. Добрый день!
      К сожалению, нет возможности оперативно отвечать на комментарии. Вопрос ещё актуален?

      Удалить
  7. " Но это окупается их меньшей стоимостью... "
    Не совсем так. ATTiny85 стоит сейчас на алике около 2 USD, когда Arduino mini с ATMega168 стоит меньше 1 USD.

    ОтветитьУдалить
    Ответы
    1. Думается, что это тоже ненадолго. Все цены растут на глазах... Хотя еще можно найти хорошие цены. Кстати, совсем недавно покупал WAVGAT Pro Mini ATMega168 по 0.96, а сейчас "К сожалению, этот товар уже недоступен".

      Удалить
  8. Здравствуйте! Спасибо за статью, блинк у меня заработал, а вот с аналоговыми сигналами как то не разобрался. Хочу подключить фоторезистор, использую для него ножку PB4, но ничего не происходит, подскажите, есть ли вообще возможность работать с аналоговым сигналом?

    ОтветитьУдалить
    Ответы
    1. Добрый день!
      Да, конечно, с аналоговым сигналом работать можно. Для PB4 - analogRead(A2)

      Удалить