Программирование Arduino с помощью ISP программатора

Программировать 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, так как показано на рисунке.

image

Отлично, проект создан. Теперь нужно подключить наш программатор. Я использую Atmel ICE. Это универсальный программатор, который подходит для большинства микроконтроллеров AVR и ARM от Atmel. Подключаем программатор к компьютеру, затем в Atmel Studio выбираем пункт Tools -> Device Programming. Важно! Если у вас русская Windows то не создавайте проект в моих документах и вообще с папках с русским названием. Лучше создайте на диске отдельную папку с названием без кириллицы, например D:\myprog. Так же не забудьте запустить студию с правами администратора.

image

В открывшимся окне выбираем следующие опции: Tool — устройство для программирования\отладки в данном случае Atmel ICE, Device — микроконтроллер, который собираемся программировать, Interface — интерфейс через который наш программатор будет прошивать\отлаживать микроконтроллер, в данном случае доступен только ISP.

Нажимаем кнопочку Read для получения идентификатора устройства и его рабочего напряжения. Если Arduino подключена правильно, то вы должны получить номер устройства, например 0x1E950F и напряжение 4.9V.

Нажимаем Apply. После этого должны появится настройки для программатора так как показано на рисунке ниже.

image

Далее выполняем следующие действия. Меняем ISP Clock на 250. Затем переходим в раздел Memories и нажимаем кнопку Erase now. Важно! После этого действия вы не сможете использовать свой Arduino совместно с Arduino IDE, так как загрузчик будет удален.

image

Теперь у нас все готово для программирования. Давайте напишем небольшую программу для мигания светодиодом.
Вставьте в макетную плату светодиод и подключите его через токоограничивающий резистор. Положительную лапку светодиода соедините с цифровым выходом 5 на Arduino.

Теперь нужно разобраться какая ножка микроконтроллера соответствует выводу на плате. Для этого нам понадобится datasheet.

image

Так как мы хотим управлять светодиодом с помощью 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% от объема памяти контроллера.

image

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 17

    0
    Спасибо за статью!
    На вин8 не было проблем с портом? Я никак не могу прошить arduino pro mini вкупе с usb-serial адаптером PL-23023HX. Драйвера вроде встали, но порт постоянно «занят» и никто из прошивальщиков не может получить к порту доступ. Может сталкивались с такой проблемой?
      0
      Попробуйте более старый драйвер, возможно у вас проблема с китайским PL-2303.
        0
        Я пользуюсь фирменным Atmel программатором. По этому все работает как часы. Если будет время, куплю какой нибудь другой программатор, поиграюсь с ним и отпишусь.
          0
          Спешу отписаться, что я таки осилил эту проблему )
          драйвер для USB-Serial адаптера PL-23023HX, там же в архиве дока по установке, потому что сам он не становится. Ну и плюс ошибка новичка — не знал что кнопку Reset на ардуине нужно именно держать.
        0
        Зачем калечить ардуину? Только из за экономии кода? Вы этим самым лишаетесь всех ардуиновских «плюшек».
        Хотите чистого С на AVR — можно плату под 328ю мегу сделать за час… и кодить ее.

        В дополнение статьи описали бы как потом наигравшись восстановить все обратно. Ну я про залить бутлоадер и выставить фьюзы под ардуину.
          +1
          На ардуинах обычно есть резистор и светодиод для мигания.
            0
            Кстати, да. На 13-м пине ардуины (19 пин атмеги), PB5. Только на схеме я его почему-то не нахожу. Легендарный скетч Blink как раз его задействует.
              +1
              Спрятали
              image
                0
                Блин. Затейники!
              0
              Все верно. У Arduino есть светодиод. Для работы с ним нужно использовать регистр PORTB. Ниже пример.

              #include <avr/io.h>
              #define F_CPU 16000000UL //16MHz
              #include <util/delay.h>
              int main(void) {
              	DDRB  |= 1<<5;
              	PORTB &= ~1<<5;
              	while(1) {
              		PORTB |= 1<<5;
              		_delay_ms(100);
              		PORTB &= ~1<<5;
              		_delay_ms(100);
              	}
              }
              


              В статье я использовал внешний светодиод для наглядности. Хотел сделать фото подключения программатора и горящего светодиода. Но фотоаппарат не вовремя разрядился.
              –1
              Можно поинтересоваться? А какова выгода? Сколько экономии по памяти, сколько по процессорному времени?
                0
                Память экономится довольно существенно. Я уже не помню сколько занимает программа, получаемая из Arduino IDE. В моем случае, на чистом C — Hello World уместился в 186 байт. На ASM можно добиться более хороших показателей.

                По скорости точно сказать не могу. Думаю если вы будете использовать Visual Micro и чистый C (тут статья), без всяких программаторов, то результат будет тот же, но памяти будет занято чуть больше из за загрузчика Arduino.

                Мой коллега в качестве эксперимента мигал светодиодом с помощью Intel Galileo на частоте 400Гц это на библиотеках Arduino, а после переписки на C получилось около 2МГц.
                0
                По памяти: Flash memory: 32 KB (ATmega328) of which 0.5 KB used by bootloader
                По времени: небольшой таймаут при старте (не знаю, сколько).
                Плюс уверенность, что на контроллере выполняются только те инструкции, которые написал, а не какой-то бутлоадер, например, после перезагрузки.
                Плюс возможность использовать watchdog (не обязательно выпиливать загрузчик совсем, но заменить иногда нужно).

                Пользуясь случаем: кто порекомендует avrdude-совместимый загрузчик для atmega328+ft232rl / arduino nano?
                  0
                  devicter.ru/goods/USBtinyISP-Arduino-bootloader-programmer — пользую такой, все работает… но иногда не хватает выбора рабочего напряжения (5 или 3.3В). У этого программатора выбора нет — только 5В.
                    –1
                    Сорри, непонятно объяснил. Не программатор, а бутлоадер. Программатор у меня китайский клон usbasp.
                0
                Прежде, чем затирать загрузчик, было бы полезно сохранить его (и фьюз-биты), чтобы можно было вернуть всё как было. Мне, например, не удалось заставить работать китайский клон с официальным загрузчиком.

                Only users with full accounts can post comments. Log in, please.