Использование Arduino UNO в качестве программатора

в 20:59, , рубрики: arduino, attiny2313, avr, diy или сделай сам, isp, метки: , , ,

Появилась у меня идея сделать внешний интерфейс для счетчика воды, чтобы не лазать в подвал для снятия показаний. После некоторых размышлений я остановился на ATTiny2313A(стоит ~80р, а ставить для этого Arduino ценой в ~1000р. мне жаба не дает) + несколько резисторов, кнопок и 7-ми сегментный индикатор. Но остановился перед проблемой — в отличии от Arduino здесь нужен программатор. Поскольку я не сильно увлекаюсь МК, то программаторов у меня как-то не водится. Arduino теоретически можно использовать в этом качестве, но реально я этого никогда не делал.

В интернетах на эту тему есть много статей. Но, на текущий момент, они способны запутать неподготовленного человека. Проблема в следующем — на предыдущих версиях Arduino (Duemilanove, Diecimila) стоял чип FT232RL, который является преобразователем USB -> UART(специальный протокол применяемый в основном для программирования МК). На Uno этот чип убрали, заменив на Atmega8U2(МК запрограммированный на преобразование USB -> Serial). Соответственно большинство инструкций нам не подходят. Я уже думал что эта идея неосуществима, но неожиданно встретил подходящий вариант. С ним я вас и ознакомлю. Приступим:

1. Открываем Arduino IDE( у меня это v1.0) и заливаем на нашу Arduino Uno sketch называющийся ArduinoISP (File -> Examples -> Arduino ISP). Прошу обратить внимание на первый строчки файла — там содержится важная подсказка как подключать наш программатор к МК:

// this sketch turns the Arduino into a AVRISP
// using the following pins:
// 10: slave reset
// 11: MOSI
// 12: MISO
// 13: SCK

// Put an LED (with resistor) on the following pins:
// 9: Heartbeat - shows the programmer is running
// 8: Error - Lights up if something goes wrong (use red if that makes sense)
// 7: Programming - In communication with the slave

Собственно, после этого этапа мы уже имеем программатор типа avrisp, но нужно еще подключить к нему наш МК.

2. Смотрим в datasheet к нужному МК(у меня это ATTiny2313A) и ищем pinout. На следующей картинке я отметил интересующие нас ноги.
Использование Arduino UNO в качестве программатора

3. Теперь пришел самый интересный этап — подключаем наш программатор к МК. Собственно схема подключения не представляет из себя ничего сложного, но есть одна хитрость — нужно подключить конденсатор в 10мкФ(uF) между выходами RESET и GND у Arduino. Причем выход "-" (отмечен белой полосой) должен быть подключен к GND. Данный трюк предотвратит перезагрузку Arduino при заливке прошивки в МК.
Использование Arduino UNO в качестве программатора
Соединяем ноги МК и пины Arduino в соответствии с функционалом из pinout и sketch (Pin10 с ногой PA2, Pin11 с ногой PB5 и тд). Помним что VCC это питание, а в нашем случае — +5V. Для индикации я выбрал следующие светодиоды:
9: Heartbeat — Зеленый. Показывает что программатор работает. В процессе простоя постоянно мигает.
8: Error — Красный. Теоретически загорается при ошибках, но еще ни разу не видел.
7: Programming — Синий. Мигает аналогично Arduino'вским RX/TX при заливке прошивки в МК.
Повесил их через резисторы 220 Ом.
Собранная схема будет выглядеть примерно вот так:
Использование Arduino UNO в качестве программатора

4. Подготавливаем прошивку для нашего МК. Для тестирования я решил использовать обычное мигание светодиодом:

#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>

void init_io(void);

void init_io(void)
{
  DDRB = (1<< PB0);
}

int main(void)
{
  init_io();
  for (;;)
  {
      PORTB |= (1 << 0);
      _delay_ms(100);
      PORTB = 0;
      _delay_ms(100);
  }
}

Компилируем в hex (выдрал команды из какого-то Makefile от WinAVR):

avr-gcc -c -mmcu=attiny2313 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=blink_led.lst  -std=gnu99 blink_led.c -o blink_led.o

avr-gcc -mmcu=attiny2313 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=blink_led.o  -std=gnu99 blink_led.o   --output blink_led.elf -Wl,-Map=blink_led.map,--cref -lm

avr-objcopy -O ihex -R .eeprom blink_led.elf blink_led.hex

И заливаем на MK:

avrdude -p t2313 -P /dev/ttyACM0 -c avrisp -b 19200 -U flash:w:blink_led.hex

Хочу обратить внимание на ограничение скорости заливки в 19200. Без этого параметра я долго пытался что-то залить, но avrdude мне упорно возвращал ошибки типа «programmer is not responding» или «not in sync».

После этого можно подключить светодиод к ноге PB0 МК(через резистор конечно) и посмотреть как он мигает.

Исходный материал для статьи:
hlt.media.mit.edu/?p=1229
hlt.media.mit.edu/?p=1695
arduino.cc/en/Tutorial/ArduinoToBreadboard
iamsuhasm.wordpress.com/tutsproj/avr-gcc-tutorial/
www.instructables.com/id/ATtiny-programmer-using-Arduino-ISP/

Автор: Alex2ndr

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js