В любом случае имеется возможность установить загрузчик в «чистый» микроконтроллер ATmega328, используя любой из программаторов, упоминавшихся в предыдущем разделе, или с помощью второй платы Arduino.
Установка загрузчика с помощью AVR Studio и программатора
В папке установки Arduino IDE имеются шестнадцатеричные файлы загрузчиков, которые можно записать в ATmega328 с помощью AVR Studio. Эти файлы находятся в папке hardware/arduino/bootloaders. Там вы найдете шестнадцатеричные файлы для всех видов микроконтроллеров. Если вам требуется установить загрузчик в модель Uno, используйте optiboot_atmega328.hex в папке optiboot (рис. 2.7).
Но имейте в виду следующее: при установке загрузчика есть вероятность того, что ваш микроконтроллер превратится в «кирпич». Микроконтроллеры имеют то, что называют битами защиты, которые можно неправильно запрограммировать без возможности восстановления. Они встраиваются для защиты коммерческих интересов, чтобы предотвратить возможность перепрограммирования. Прежде чем сделать решающий шаг, проверьте внимательно, что биты защиты установлены правильно для той платы Arduino, которую вы собираетесь запрограммировать, и подготовьтесь к худшему. На форуме Arduino (www.arduino.cc/forum)7 вы найдете множество обсуждений этой темы наряду с советами, как избежать неприятностей.
Чтобы записать загрузчик с помощью AVR Studio и программатора AVR Dragon, подключите программатор к колодке с контактами ICSP (рис. 2.6).
Рис. 2.7. Установка загрузчика в плату Uno в среде AVR Studio 4
Обратите внимание на то, что на плате Arduino Uno имеются две такие колодки (вторая используется для программирования интерфейса USB).
В меню Tools (Инструменты) выберите пункт Program AVR (Программировать AVR) и установите соединение с микроконтроллером ATmega328 в плате Arduino. Затем в разделе Flash (Флеш-память) выберите требующийся шестнадцатеричный файл и щелкните на кнопке Program (Программировать).
Установка загрузчика с помощью Arduino IDE и второй платы Arduino
Установка нового загрузчика с другой платы Arduino выполняется очень просто. Этот подход намного проще и безопаснее, чем использование AVR Studio. Среда разработки Arduino IDE включает необходимую функцию. Далее перечислено все, что вам потребуется:
• две платы Arduino Uno;
• 6-проводной шлейф с двумя разъемами «папа–папа» (или шесть изолированных проводов);
• один короткий изолированный провод;
• конденсатор на 10 мкФ и 10 В (также подойдет конденсатор на 100 мкФ).
Сначала нужно соединить платы проводами, как описывается в табл. 2.1.
Таблица 2.1. Соединение контактов двух плат Arduino для записи загрузчика
Плата-программатор
Программируемая плата
GND
GND
5 V
5 V
13
13
12
12
11
11
10
Reset
Конденсатор емкостью 10 мкФ включите между контактами Reset и GND на программируемой плате Arduino (то есть на плате, куда будет записан загрузчик). Более длинный положительный вывод конденсатора должен быть подключен к контакту Reset.
На рис. 2.8 показаны соединенные платы Arduino. Плата справа выступает в роли программатора. Обратите внимание на то, как контакт 10 платы-программатора соединен изолированным проводом с контактом Reset программируемой платы. Соединение выполнено так, что к одному контакту Reset на программируемой плате одновременно подключены провод и положительный вывод конденсатора.
Имейте в виду, что плата, выступающая в роли программатора, управляет программируемой платой, поэтому к порту USB компьютера должна быть подключена только плата-программатор.
На плату-программатор требуется установить специальный скетч. Его можно найти в меню File—>Examples (Файл—>Примеры). Он называется ArduinoISP и находится в конце раздела Examples (Встроенные примеры).
Рис. 2.8. Программирование с помощью второй платы Arduino
Как обычно, выберите тип платы и порт и выгрузите скетч ArduinoISP в плату-программатор. Затем в меню Tools (Инструменты) перейдите в подменю Programmer (Программатор) и выберите пункт ArduinoISP.
Наконец, выберите в меню Tools (Инструменты) пункт Burn Bootloader (Записать Загрузчик). Процедура записи займет одну-две минуты, в течение которых должны мигать светодиоды Rx и Tx на плате-программаторе и светодиод L на программируемой плате.
Когда процедура завершится, в программируемый микроконтроллер будет установлен новый загрузчик.
В заключение
В этой главе мы заглянули под капот платы Arduino и посмотрели, как она работает в действительности. Я показал вам, что скрывается за фасадом окружения Arduino.
В следующей главе мы посмотрим, как пользоваться прерываниями и как заставить Arduino откликаться на внешние события, вызываемые таймером, применяя для этого прерывания.
7 Аналогичные обсуждения можно найти на русскоязычном форуме http://arduino.ru/forum. — Примеч. пер.
3. Прерывания и таймеры
Прерывания позволяют микроконтроллерам откликаться на события без необходимости постоянно проверять выполнение каких-либо условий, чтобы определить момент, когда произошли важные изменения. В дополнение к возможности подключать источники прерываний к некоторым контактам можно также использовать прерывания, генерируемые таймером.
Аппаратные прерывания
Для демонстрации использования прерываний вернемся вновь к цифровым входам. Часто для определения момента некоторого входного события (например, нажатия кнопки) используется такой код:
void loop()
{
if (digitalRead(inputPin) == LOW)
{
// Выполнить какие-то действия
}
}
Этот код постоянно проверяет уровень напряжения на контакте inputPin, и, когда digitalRead возвращает LOW, выполняются какие-то действия, обозначенные комментарием // Выполнить какие-то действия. Это вполне рабочее решение, но что если внутри функции loop требуется выполнить массу других операций? На все эти операции требуется время, поэтому есть вероятность пропустить короткое нажатие на кнопку, пока процессор будет занят чем-то другим. На самом деле пропустить факт нажатия на кнопку почти невозможно, потому что по меркам микроконтроллера она остается нажатой очень долго.
Но как быть с короткими импульсами от датчика, которые могут длиться миллионные доли секунды? Для приема таких событий следует использовать прерывания, определяя функции, которые будут вызываться по этим событиям, независимо от того, чем занят микроконтроллер. Такие прерывания называют аппаратными прерываниями (hardware interrupts).
В Arduino Uno только два контакта связаны с аппаратными прерываниями, из-за чего они используются очень экономно. В Leonardo таких контактов пять, на больших платах, таких как Mega2560, их намного больше, а в Due все контакты поддерживают возможность прерывания.
Далее рассказывается, как работают аппаратные прерывания. Чтобы опробовать представленный пример, вам понадобятся дополнительная макетная плата, кнопка, сопротивление на 1 кОм и несколько соединительных проводов.
На рис. 3.1 изображена собранная схема. Через сопротивление на контакт D2 подается напряжение HIGH, пока кнопка не будет нажата, в этот момент произойдет заземление контакта D2 и уровень напряжения на нем упадет до LOW.