Tuesday, September 4, 2012

ISP программатор из Arduino. Разберемся и с ATtiny

Хочу описать опыт по программированию микроконтроллера семейства ATTiny используя в качестве программатора уже полюбившуюся мне Arduino UNO (да-да, она и такое умеет) и среду разработки Arduino IDE.


Никаких плясок с avrdude и другими сложными штуками - это я гарантирую. 

Единственное что, если решите как и я использовать микроконтроллер в SOIC корпусе как и я - понадобится переходник из моего прошлого поста.

Минутка истории

Пол года назад закупая очередную мелочевку на радиорынке я решил купить себе микроконтроллер с мыслью о том, что может быть, когда-нибудь, в лучшие времена я соберусь с мыслями и выйду за пределы Arduino как единственного решения.
Мне не хотелось брать что-то большое и мощное, а скорее наоборот - искал что-то очень простое. Одним из таких решений были микроконтроллеры семейства ATtiny. Поспрашивав у продавцов мне удалось найти ATtiny85. Одна проблема - она была только в SOIC корпусе, штука очень мелкая.
Я решил была не была и все равно купил себе одну штучку, просто попробовать. При цене в 2,5$ - это не было большим вложением.
Ну, вот прошло время и заскучав я решил попробовать запрограммировать эту кроху. 

ATTiny85

Как я уже говорил в моем случае мне попалась ATtiny85, а если быть совсем уж точным, то ATTiny85-20SU. Характеристики у микроконтроллера следующие:
  • CPU: AVR 8 бит
  • Напряжение питания: от 4.5 до 5.5 В
  • Flash: 8 КБайт
  • EEPROM: 512 Байт
  • RAM: 512 Байт
Всего у этой малышки 8-мь ножек. Две отведены на питание, а остальные шесть могут быть использованы нами как входы, так и как выходы. Причем на двух мы можем получить ШИМ, и до четырех из них может быть использовано в качестве аналоговых входов (как A0-A5 в Arduino).
С другой стороны - это конечно не так и много, но что-то сделать все же можно.
Распиновка у чипа следующая
ATtiny pinout

Понадобится

В этот раз все достаточно безобидно:

  • Arduino UNO
  • ATTiny (если в SOIC корпусе, то еще и переходник)
  • Макетная плата
  • Проводки
  • Конденсатор на 10мкФ 16В
  • Светодиод и резистор на 220Ом (если захотите полностью повторить мой опыт, то два резистора и два светодиода, но это скорее для менее скучного видео я сделал)
Все достаточно обыденно и если вы уже пробовали что-то делать, то скорее всего у вас уже где-то все это завалялось.

Подготовим Arduino IDE

Для того, чтобы наша IDE узнала о существовании новых чипов необходимо провести пару нехитрых манипуляций. Для начала нам необходимо скачать один маленький zip файл отсюда http://code.google.com/p/arduino-tiny/ - Google Code группа которая занимается сбором информации под разные чипы семейства ATtiny, за что им огромное спасибо.
На момент написания последним набором был arduino-tiny-0100-0015.zip (на всякий случай скопировал его себе, если что-то случится с группой, то качаем тут).
Теперь необходимо посмотреть где наша IDE прячет от нас скетчбут. Для этого откроем File - Preserences
Arduino - File - Preserences
и там посмотрим поле Sketchbook Location и скопируем его себе.

Перейдем в эту папку и создадим там подкаталог с названием "hardware". После этого скопируем в только что созданный каталог папку из скачанного ранее архива (arduino-tiny-0100-0015.zip) под названием tiny со всем её содержимым.
Перезагрузим IDE.
После этого в разделе Tools - Board у вас должно появится сразу несколько ATTiny. Пока что ничего не выбираем в этом списке. Значение должно быть установлено в Arduino UNO, если у вас выбрано что-то другое - поменяйте.

Arduino UNO превращается... В элегантный ISP программатор...

Небольшой ликбез. ISP (In-system programming) - это способность микроконтроллера получать прошивку находясь уже непосредственно в собранной схеме. Другими словами, несмотря на то, что к микроконтроллеру могут быть уже подключены всякие там светодиоды и кнопки, мы все еще будем иметь возможность залить на него новую прошивку.
Программатором (устройством передающим прошивку от компьютера в контроллер) в нашем случае будет выступать Arduino UNO. Чтобы Arduino стала ISP программатором на нее необходимо залить специальную прошивку. Эта прошивка поставляется вместе с Arduino IDE.
Итак, еще без какой-либо периферии Arduino подключаем к компьютеру и загружаем Arduino IDE.
Выбираем File - Examples - ArduinoISP

Внимание! Если у вас Arduino IDE версии 1.0, то в полученный код необходимо будет внести изменения, а конкретно в функции heartbeat() найти строчку "delay(40);" и заменить её на "delay(20);". Это известный баг. В Arduino IDE версии 1.0.1 (последней на момент написания статьи) эта проблема уже исправлена и ничего менять не нужно.
Нажимаем кнопку Upload и ждем, пока прошивка не попадет на Arduino. Поздравляю, у вас есть ISP-программатор.

Соберем схему

Для того, чтобы залить код в нашу ATtiny нужно собрать несложную схемку. На картинке я нарисовал вариант с микросхемой в DIP корпусе - так немного нагляднее, но нужно понимать, что разницы с SOIC+переходник никакой.
На первой схеме изображено только соединение с программатором (этого достаточно, чтобы залить код на микроконтроллер, но недостаточно для демонстрации работы), на второй - пример с двумя светодиодами (мне показалось что чтобы хоть как-то развеселить схему, два светодиода + ШИМ будет то, что надо, заодно чуть больше раскрываются возможности).



Особое внимание стоит уделить пожалуй лишь конденсатору между reset и GND на нашей Arduino. Это необходимо чтобы препятствовать программному сбросу контроллера после заливки в него прошивки предназначающейся для нашей ATtiny который автоматически вызывается каждый раз.
Вот что получилось у меня.


Пишем код

Практически все готово, осталось только написать очень простенькую прошивку для нашей ATTiny. Открываем Arduino IDE и пишем
int led1 = 0;
int led2 = 1;

void setup() {                
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
}

void loop() {
  analogWrite(led1,64);
  delay(500);
  analogWrite(led1,128);
  delay(500);
  analogWrite(led1,255);
  delay(500);
  digitalWrite(led1,LOW);
  
  analogWrite(led2,64);
  delay(500);
  analogWrite(led2,128);
  delay(500);
  analogWrite(led2,255);
  delay(500);
  digitalWrite(led2,LOW);
  
  digitalWrite(led2, HIGH);
  delay(100);
  digitalWrite(led2, LOW);
  delay(500);
}
Код очень простой, в начале включает светодиод на нулевой ножке (соответсвует PB0 в разпиновке) в три этапа, каждый раз увеличивая значение в analogWrite(...), что вызывает увеличение яркости свечения диода, потом гасит его и проделаывает то же самое на первой ножке (PB1). Именно эти выходы способны работать как ШИМ, что и демонстрируется в примере.
Осталось поменять значение в Tools - Board в новое, которое будет соответствовать вашей ATtiny и припиской @ 1 MHz (возможно еще какие-то слова после, нас они сильно не интересуют сейчас). В моем случае это ATTiny85 @ 1 MHz (internal oscilliator; BOD disabled)
Осталось изменить тип программатора на Arduino as ISP, сделать это можно выбрав Tools - Programmer соответствующий пункт.
Нажимает кнопку Upload.
Скорее всего в консоли Arduino IDE вы увидите пару ругательств.
avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny85
avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny85
Да, признаю, слукавил, мы все же пользовались avrdude, только все за нас делала Arduino IDE, так что думаю вы не в обиде.
Ну и презентация работающей версии, конечно.