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