Первый ATtiny85 я не убил током — убил нетерпением. Мигалка с delay(1000) на свежем чипе тикала раз в восемь секунд. Я перечитывал скетч, прогонял его в симуляторе — там период был честный, одна секунда. Погуглил «attiny85 delay wrong», наткнулся на слово «фьюзы» и час ломал голову, при чём тут плавкие предохранители: в чипе они ни при каком токе не сгорают.
Это были не предохранители, а конфигурационные биты: заводской ATtiny85 живёт на внутреннем генераторе 1 МГц, а скетч я собрал под 8 МГц. Все тайминги — delay, millis, скорости передачи — уехали ровно в восемь раз. В этом уроке добавим ATtiny85 в Arduino IDE, подключим его к Uno по четырём проводам, запишем фьюзы и зальём скетч — а главное, разберём ловушку, в которую я упал, чтобы вы проскочили мимо. ISP-протокол — история про настоящие провода, в браузерном симуляторе он не живёт; зато живая демонстрация ниже показывает его главный подвох во всей красе.
Восемь килобайт на всё: анатомия ATtiny85
ATtiny85 — восьминогий AVR, в восемь раз скромнее Uno по памяти. Цифры для сравнения: 8192 байта flash против 32 768, 512 байт ОЗУ против 2048, 512 байт EEPROM — вот тут чип даже хорош. Шесть линий ввода-вывода PB0–PB5, но PB5 — это RESET, значит, свободных рук пять. Аналого-цифровой преобразователь — четыре канала, ШИМ — на PB0, PB1 и PB4. Питание от 2,7 до 5,5 вольта: чип счастливо живёт от трёх батареек или литиевой таблетки, а с пина уверенно тянет светодиод с резистором.
Чего нет — аппаратного UART. Монитор порта с ATtiny85 не работает: отладка сводится к светодиоду и его ритму. Моё мнение с границей: для счётчика, ночника, маяка или брелока восьми килобайт за глаза; для библиотек с буферами, String и Serial-логами — тесно: на 512 байтах ОЗУ один неосторожный String съедает половину памяти. Для мигалок и счётчиков это не проблема, для логов — уже компромисс, поэтому отладка здесь строится на ритме светодиода.
Стандартный набор плат Arduino про ATtiny ничего не знает — добавим ядро. Механика та же, что при установке библиотек одной кнопкой из урока про менеджер библиотек, только вместо библиотек — целый пакет плат. В Файл → Настройки → Дополнительные ссылки для менеджера плат вставьте адрес http://drazzy.com/package_drazzy.com_index.json — это ATTinyCore Спенса Конде, самый живой из поддерживаемых пакетов. Потом Инструменты → Плата → Менеджер плат, поиск «attiny», кнопка «Установить».
После установки в списке плат появляется ATtiny25/45/85 (No Bootloader). Приучите себя сразу к паре «плата + частота»: у ATtiny они выбираются раздельно, и пункт Clock — не декорация, а обещание, под которое соберётся скетч. Расплата за невыполненное обещание — та самая восьмикратная резина, с которой я начал урок.
Распиновка: восемь ножек, из которых шесть наши
Распиновка DIP-8: держите чип полумесяцем-ключом влево и считайте ножки против часовой стрелки. Ножка 1 — PB5 и RESET, 2 — PB3, 3 — PB4, 4 — GND, 5 — PB0, 6 — PB1, 7 — PB2, 8 — VCC. Схема подключения к Uno-программатору повторяет урок про запись загрузчика один в один: пин 10 на RESET (ножка 1), 11 на PB0, 12 на PB1, 13 на PB2, плюс 5V и GND. Приятное совпадение: PB0, PB1 и PB2 — это одновременно MOSI, MISO и SCK чипа, поэтому все четыре сигнальных провода садятся на соседние ножки. Полная карта выводов — DIP-8 по ножкам, таблица Digispark P0–P5 с USB-ловушками, где какой АЦП и ШИМ — сведена в отдельный справочник ATtiny85 распиновка: держите его под рукой при разводке платы.
Конденсатор 10 мкФ на RESET программатора обязателен и здесь — механика та же: авто-ресет при открытии порта срывает сессию. И привычка, которая дважды спасала мне вечер: перед сессией сфотографируйте макетку на телефон. Восемь ножек, четыре провода, два питания — перепутать проще, чем кажется, а фотография — самый дешёвый способ понять, что именно вы поменяли, когда чип перестал отвечать. Провода прикладывайте к ножкам чипа плотно, а не держите пальцем: у меня первый экземпляр так и не ответил, пока я не понял, что держал MISO рукой и снимал его ровно на момент чтения сигнатуры.
// Светодиод + резистор 220 Ом на PB0 (ножка 5 чипа)// В списке плат выберите Clock: 8 MHz (internal) — см. текст урока.const int LED = 0; // PB0 void setup() { pinMode(LED, OUTPUT);} void loop() { digitalWrite(LED, HIGH); delay(1000); digitalWrite(LED, LOW); delay(1000);}Порядок из трёх шагов. Первый: Инструменты → Плата → ATtiny25/45/85, процессор ATtiny85, Clock — 8 MHz (internal). Второй: Инструменты → Записать загрузчик. На ATtiny это название обманчиво: никакой загрузчик не ставится, команда записывает фьюзы — переключает внутренний генератор с заводского 1 МГц на 8 МГц — и заодно стирает чип. Третий: Скетч → Загрузить через программатор. Обычная кнопка «Загрузить» полезет в COM-порт, которого у ATtiny нет, и упадёт с ошибкой.
Теперь арифметика той ловушки. delay(1000) не измеряет секунду по часам — он считает такты, и число тактов вкомпилировано под частоту из меню. Скетч, собранный под 8 МГц, на чипе, живущем на заводском 1 МГц, растягивается ровно в восемь раз: мигалка тикает восемь секунд, а любой замер через millis() врёт с тем же коэффициентом — это мы разбирали в уроке про точные замеры. Записали фьюзы на 8 МГц — обещание меню и реальность сошлись, и время скетча стало честным.
| Ножка DIP | Имя | Умеет | Что держать в голове |
|---|---|---|---|
| 1 | PB5 | RESET, ADC0 | задействуете как вход — обычный ISP закончится, нужно высоковольтное программирование |
| 2 | PB3 | I/O, ADC3 | удобный кандидат на SoftwareSerial RX |
| 3 | PB4 | I/O, ADC2, ШИМ | второй конец SoftwareSerial — TX |
| 4 | GND | земля | общая с программатором обязательна |
| 5 | PB0 | I/O, MOSI, ШИМ | традиционное место мигалки; провод MOSI при прошивке |
| 6 | PB1 | I/O, MISO, ШИМ | провод MISO при прошивке |
| 7 | PB2 | I/O, SCK, ADC1 | аналоговые датчики сюда; провод SCK при прошивке |
| 8 | VCC | 2,7–5,5 В | от литиевой таблетки живёт долго, особенно в sleep |
После удачной прошивки у вас в руках самый честный ответ на вопрос «а нужна ли мне вообще большая плата»: отлаженный на Uno проект переезжает на восьминожку с минимальными правками. Схема собирается по классике из урока про светодиод на макетке: резистор, светодиод, питание — и восемь килобайт собственной электроники в кармане.
Дальше два пути. Первый — выжать автономность: sleep-режимы и watchdog — отдельная песня, но ATtiny на батарейке живёт месяцами. Второй — прошивать партиями: перекидывать четыре провода на каждый чип надоедает быстрее, чем шесть на Uno, и тут дешевле один раз купить внешний программатор — про него следующий урок. Отдельная вселенная — платы Digispark с загрузчиком micronucleus: они шьются по USB без программатора, но живут в своём ядре и отдают ему несколько килобайт. А если задержки начнут мешать отзывчивости, millis вместо delay работает и на восьми килобайтах.
- 1. Свежий ATtiny85 без записи фьюзов тактируется от...
- 2. Пункт «Записать загрузчик» на ATtiny85 на самом деле...
- 3. Скетч собран под 8 МГц, чип живёт на 1 МГц. Сколько реально длится delay(1000)?
- 4. Обычная кнопка «Загрузить» с Uno-программатором и ATtiny85...
- 5. PB5 можно спокойно задействовать под обычный вход, если...
- ATtiny85: 8 КБ flash, 512 байт ОЗУ, линии PB0–PB5, из них PB5 — RESET; ШИМ на PB0, PB1, PB4; аппаратного UART нет
- Ядро ATTinyCore добавляется ссылкой в настройках и установкой через менеджер плат — как библиотека, только целый пакет плат
- «Записать загрузчик» для tiny = запись фьюзов: выставили Clock 8 MHz internal → записали → шьём через «Загрузить через программатор»
- Скетч, собранный под 8 МГц, на заводском 1 МГц замедляется ровно в 8 раз: delay, millis и Serial едут вместе
- PB5 держите RESET: его перепрофилирование закрывает обычный ISP и открывает дорогу к 12-вольтовому программированию
Частые вопросы по теме урока
- Свежий ATtiny85 без записи фьюзов тактируется от...
- Заводские фьюзы ATtiny85 — внутренний RC-генератор 8 МГц с делителем на 8, то есть 1 МГц. Внешний кристалл чип не увидит, пока вы его явно не включите фюзами. внутреннего генератора 1 МГц
- Пункт «Записать загрузчик» на ATtiny85 на самом деле...
- Для tiny это историческое название команды: она конфигурирует фьюзы и стирает память. Настоящий загрузчик в 8 КБ места не живёт — потому ядро и называется No Bootloader. записывает фьюзы под выбранный Clock и стирает чип — загрузчика там нет
- Скетч собран под 8 МГц, чип живёт на 1 МГц. Сколько реально длится delay(1000)?
- delay считает такты под частоту, выбранную при сборке: в восемь раз меньше тактов в секунду — в восемь раз дольше пауза. Тот же коэффициент искажает millis() и скорости Serial. около 8 секунд
- Обычная кнопка «Загрузить» с Uno-программатором и ATtiny85...
- Среда попытается говорить по UART с чипом, у которого нет ни UART, ни загрузчика. Единственный путь — Скетч → Загрузить через программатор. полезет в COM-порт и упадёт — нужен пункт «Загрузить через программатор»
- PB5 можно спокойно задействовать под обычный вход, если...
- RESET нужен программатору. Вернуть PB5 роль входа можно, но вернуть его в RESET без 12 вольт уже не выйдет — обычный ISP с ним больше не работает. вы готовы к высоковольтному программированию вместо обычного ISP