Программировать Arduino Uno на «чистом» C или на Ассемблере не намного сложнее, чем с использованием стандартного языка программирования для Arduino. При этом вы можете сильно выиграть в производительности и сократить размер вашей программы. Далее речь пойдет о том, как перепрошить Arduino Uno R3 с использованием ISP программатора и AVR Studio 6.2.
Итак, нам понадобится Arduino Uno R3, любой ISP программатор совместимый с Atmel Studio 6, один светодиод и резистор, например, на 250 Ом. Для программирования Arduino я использую универсальный программатор Atmel ICE. Как я уже говорил, вы можете использовать любой программатор ISP для программирования Arduino. Список поддерживаемых программаторов вы можете посмотреть прямо в Atmel Studio.
Все знают, что в Arduino Uno R3 используется микроконтроллер ATmega328P-PU. Именно его мы и будем программировать. Фактически после записи нашей программы у нас будет уже не Arduino, а просто микроконтроллер с обвязкой. Так как мы сотрем загрузчик Arduino.
К сожалению, микроконтроллер ATmega328P-PU не поддерживает «продвинутую» отладку через JTAG. Вы, конечно, можете дебажить свой Arduino в Arduino Micro с точками останова и выводом значений в output (нужно явно запрашивать, что хотите получить), но такой подход не всегда удобен, к тому же в Atmel Studio есть значительно более совершенные средства отладки (просмотр состояний регистров, мониторинг памяти, и т.д.). По этому мы ограничимся тем, что будем просто прошивать наш контроллер по ISP.
Откройте Atmel Studio и выберите проект GCC C Exacutable Project, так как показано на рисунке.
Отлично, проект создан. Теперь нужно подключить наш программатор. Я использую Atmel ICE. Это универсальный программатор, который подходит для большинства микроконтроллеров AVR и ARM от Atmel. Подключаем программатор к компьютеру, затем в Atmel Studio выбираем пункт Tools -> Device Programming. Важно! Если у вас русская Windows то не создавайте проект в моих документах и вообще с папках с русским названием. Лучше создайте на диске отдельную папку с названием без кириллицы, например D:myprog. Так же не забудьте запустить студию с правами администратора.
В открывшимся окне выбираем следующие опции: Tool — устройство для программированияотладки в данном случае Atmel ICE, Device — микроконтроллер, который собираемся программировать, Interface — интерфейс через который наш программатор будет прошиватьотлаживать микроконтроллер, в данном случае доступен только ISP.
Нажимаем кнопочку Read для получения идентификатора устройства и его рабочего напряжения. Если Arduino подключена правильно, то вы должны получить номер устройства, например 0x1E950F и напряжение 4.9V.
Нажимаем Apply. После этого должны появится настройки для программатора так как показано на рисунке ниже.
Далее выполняем следующие действия. Меняем ISP Clock на 250. Затем переходим в раздел Memories и нажимаем кнопку Erace now. Важно! После этого действия вы не сможете использовать свой Arduino совместно с Arduino IDE, так как загрузчик будет удален.
Теперь у нас все готово для программирования. Давайте напишем небольшую программу для мигания светодиодом.
Вставьте в макетную плату светодиод и подключите его через токоограничивающий резистор. Положительную лапку светодиода соедините с цифровым выходом 5 на Arduino.
Теперь нужно разобраться какая ножка микроконтроллера соответствует выводу на плате. Для этого нам понадобится datashit.
Так как мы хотим управлять светодиодом с помощью 6-го вывода на Arduino мы будем использовать регистр PORTD и 5-й бит который подаст напряжение на 11 ножку нашего микроконтроллера.
Поместите следующий код в файл с кодом проекта.
#include <avr/io.h>
#define F_CPU 16000000UL //16MHz
#include <util/delay.h>
int main(void) {
DDRD |= 1<<6;
PORTD &= ~1<<6;
while(1) {
PORTD |= 1<<6;
_delay_ms(100);
PORTD &= ~1<<6;
_delay_ms(100);
}
}
Нажимаем «Ctrl + Alt + F5» или выбираем в меню пункт Debug -> Start Without Debugging. Светодиод начнет мигать!
Вот, собственно, и все… Обратите внимание на скорость прошивки и на размер программы. Данный пример занимает около 186 байт, что составляет 0.6% от объема памяти контроллера.
Автор: Boniface
Можно ли превратить Arduino в программатор для AtmelStudio?