Arduino без кварца

Есть ли жизнь на марсе без кварца? Конечно же есть! В чипе Atmega328P, который стоит в Arduino, есть встроенный RC-генератор на 8 МГц. Он не очень точный, и его частота может плавать в зависимости от таких параметров, как температура окружающей среды. Тем не менее, для некоторых задач может быть не важна точность тактирования, а отсутствие кварца и его обвязывающих конденсаторов может сыграть существенную роль. Сегодня в номере разберем много полезного: как настроить FUSE-биты, как подключить программатор к Arduino, как добавить собственный девайс в список плат Arduino IDE, не переключайтесь!

 

FUSE-биты

FUSE-биты это такие специальные биты в отдельной области памяти контроллеров семейства AVR, которые отвечают за конфигурацию нeкоторых функций. В основном они касаются источников тактирования, интерфейсов программирования и режимов перезагрузки. FUSE-биты объединяются в байты, таким образом получаются три байта: LOW (младший), HIGH (старший), EXTENDED (дополнительный). У разных моделей чипов AVR могут быть разные FUSE-биты, их выставлять всегда надо очень внимательно. Неправильная запись FUSE-битов может привести к окирпичиванию чипа - он перестанет работать и перепрошиваться.

FUSE-битыми задается и настраивается в том числе источник тактирования. Поэтому, чтобы переключить его на внутренний генератор, придется повозиться с FUSE-битами. Для вычисления FUSE-байтов лучше всего пользоваться онлайн-калькуляторами. Самый удобный FUSE-калькулятор, на мой взгляд, вот этот.

Давайте забьем в него значения FUSE-битов по умолчанию и посмотрим, как настроена Ардуина. Значения следующие: LOW - FF, HIGH - DA, EXT - 05.

Видим, что в качестве источника тактирования используется Кварц с частотой от 8 МГц (до 20-ти) и самым долгим временем старта, что разрешен SPI (это важно!) и что включен бутлоудер размером 2 КБ.

Мы хотим сделать по другому. Мы хотим внутренний генератор в качестве источника тактирования с самым долгим временем старта и убрать вообще бутлоудер.

Выставляем вот это вот всё и получаем следующие значения: LOW - E2, HIGH - DF, EXT - 05. Запоминаем эти значения.

 

Добавление платы в Arduino IDE

Задача: хотим сделать так, чтобы в Arduino IDE при открытии списка плат можно было выбрать нашу специальную плату, у которой настроена частота на 8 МГц и выставлены FUSE-биты как нам надо.

Вообще за список плат и конфигурацию инструментов к ним отвечает файл C:\Program Files (x86)\Arduino\hardware\arduino\avr\boards.txt, но его мы трогать не будем. Во-первых - редактировать системные файлы - не по-пацански, во-вторых - он все равно затрется при обновлении Arduino IDE. Вместо этого мы в домашней папке создадим клон системного дерева и подсунем туда собственное "дополнение" к файлу boards.txt.

В домашней папке у нас уже есть папка Arduino, в которой мы храним скетчи. Создадим там теперь подпапки, скачаем и положим туда файл boards.txt и бинарник бутлоудера так, чтобы получилась структура:

Arduino\hardware\arduinonsk\avr\boards.txt

Arduino\hardware\arduinonsk\avr\bootloaders\atmega\ATmegaBOOT_168_atmega328_pro_8MHz.hex

Если лень делать все вручную, можно скачать архив, из которого достать папку hardware и просто положить ее себе домой в папку Arduino.

"Стоп-стоп! - скажете вы - Мы же FUSE-битами запретили использование бутлоудера, на кой черт мы его теперь качаем и куда-то кладем?" И будете совершенно правы. Бутлоудер нам нужен не для прошивки кода, а для прошивки FUSE-битов. Дело в том, что в Arduino все настроено так, что FUSE-биты прошиваются только вместе с бутлоудером. Не трогая системные файлы поправить это проблематично, поэтому пока не будем этим заниматься. Просто положим бутлоудер там, где он должен быть.

Далее взглянем все-таки внутрь нашего файла boards.txt, чтобы узнать, что же там творится:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
##############################################################
 
atmega328nq.name=ATmega328 no Quartz
 
atmega328nq.upload.protocol=arduino
atmega328nq.upload.maximum_size=30720
atmega328nq.upload.speed=57600
 
atmega328nq.bootloader.low_fuses=0xE2
atmega328nq.bootloader.high_fuses=0xDF
atmega328nq.bootloader.extended_fuses=0x05
 
atmega328nq.bootloader.file=atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex
atmega328nq.bootloader.unlock_bits=0x3F
atmega328nq.bootloader.lock_bits=0x0F
 
atmega328nq.build.mcu=atmega328p
atmega328nq.build.f_cpu=8000000L
atmega328nq.build.core=arduino:arduino
atmega328nq.build.variant=arduino:standard
 
atmega328nq.bootloader.tool=arduino:avrdude
atmega328nq.upload.tool=arduino:avrdude

В принципе, интуитивно все понятно. Задается имя платы, протокол загрузки, максимальный размер прошивки, скорость загрузки, FUSE-байты, местоположение бутлоудера, LOCK-байты, модель чипа, частота кварца, программное ядро, конфигурация платы, инструменты для прошивки.

По сути, весь огород мы нагородили ради вот этих пунктов:

1
2
3
4
5
atmega328nq.bootloader.low_fuses=0xE2
atmega328nq.bootloader.high_fuses=0xDF
atmega328nq.bootloader.extended_fuses=0x05
 
atmega328nq.build.f_cpu=8000000L

P.S.: Если что, nq означает no quartz. Можете поменять название, как хотите.

Теперь открываем среду разработки, и voilla!

У нас появился пункт меню с нашей платой без кварца! (А также гордое ARDUINONSK Boards перед этим)

 

Подключение Программатора USBAsp

USBAsp - это такой экстремально дешевый программатор для AVR. Он использует шину SPI для программирования и совместим с большинством инструментов (если не со всеми) для разработки под AVR или Arduino.

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

На этом месте я для удобства приведу таблицу для подключения USBAsp к Arduino:

USBAsp Arduino
5V 5V
GND GND
MOSI 11
RES RESET
SCK 13
MISO 12

Теперь аккуратненько соединяем наш программатор с платой:

 

Время прошиваться!

Для начала выберем программатор USBAsp из списка:

Теперь нажмем "Прошить бутлоудер", чтобы выставить FUSE-биты в порядке, указанном нами в файле boards.txt:

После этого в консоли мы увидим (при установке подробного вывода), что процесс пошел так, как нам надо:

1
2
3
[Stino - Start burning bootloader...]
"c:\program files (x86)\arduino\hardware\tools\avr/bin/avrdude" "-Cc:\program files (x86)\arduino\hardware\tools\avr/etc/avrdude.conf" 
-v -patmega328p -cusbasp -Pusb -e -Ulock:w:0x3F:m -Uefuse:w:0x05:m -Uhfuse:w:0xDF:m -Ulfuse:w:0xE2:m

Проверим, что FUSE-биты прошились. Прочитаем их сторонней программой:

Всё окей, прошилось как надо. Теперь можно спокойно писать код и зашивать его в плату Arduino, на которой нет кварца. Прошивать плату будем тем же USBAsp, выбирая пункт "Загрузить через программатор":

На сегодня всё.

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

Удачи!

 

UPD: мы пошли дальше, и сделали Arduino без Arduino!

Метки: hack, хардкор, mini, FUSE, ATmega328, конфиг, USBAsp

Добавить комментарий