Инструменты пользователя

Инструменты сайта



// QAvr - графический интерфейс для работы с avrdude

Подготовил и выложил пилотную версию 0.1

Подробности: QAvr

В будущем планируется довести до состояние менеджера проекта для совместной работы с geany.

// Arduino как программатор для контроллеров Atmel и сопутствующий софт

За последние дни окончательно убедился, что Arduino не просто игрушка, а настроящие ворота для начинающих постигать мир программирования микроконтроллеров Atmel.

К чему это я, а к тому, что плата Arduino может выступить в роли программатора для самостоятельных конструкций на контроллерах. Как минимум существует два варианта, про которые можно прочитать на сайте http://freeduino.ru: http://freeduino.ru/arduino/isp.html.

Меня больше заинтересовал вариант BitBang программатора, т.к. не нужно каждый раз заливать прошивку в Arduino, когда нужно прошить внешний контроллер. Кроме того, можно прошить сам контроллер в кроватке (допустим если вышел из строя, количество же циклов перезаписи ограничено или залить обновленный boot loader).

В статье выше сказано, что подходят не все платы, это верно, но главное, что бы это была USB плата и на ней был чип FT232R/FT232RL, а вот разьём X3 можно распаять и самому (как это сделал Я - при помощи олово-отсоса очистил отверстия, поставил планочку и пропаял).

Но на этом наши приключения не заканчиваются. Возникает вопрос - чем шить? Ведь BitBang («ножкодрыгание») это достаточно не стандартная для общепринятых API процедура. Соответственно этим нужно заниматься через специализированные библиотеки, коих под Linux я раскопал две для чипов от FTDI:

  • libftd2xx - закрытая (проприетарная) библиотека от производителя, есть в вариантах для i686 и x86_64 (и естественно для Windows), скачать можно тут: http://www.ftdichip.com/Drivers/D2XX.htm, там в же в архиве есть заголовочные файлы, а на сайте можно скачать PDF с руководтством программиста. Вообще, там же рекомендую скачать и документацию на саму микросхему FT232R/FT232RL и информацию про работу в BitBang режиме (дальше потребуется). Библиотека доступна в ArchLinux через AUR.
  • libftdi - библиотека с открытыми исходными кодами, из зависимостей только libusb, а так как последняя может быть собрана и для Windows, теоретически и данная библиотека тоже. Домашняя страница: http://www.intra2net.com/en/developer/libftdi/download.php, имеется так же в репозитории extra в ArchLinux.

Для первой библиотеки (libftd2xx), есть набор патчей для avrdude. На сайте FreeDuino есть ссылка на сборку для Windows. Я выложил в AUR правила для сборки последней версии avrdude с этими патчами: avrdude-serjtag (потому как патчи изначально родились в недрах проекта serjtag).

На сайте libftdi лежит патч для древней версии uisp, поэтому подумав, и потратив 1.5 дня сделал на основе патчей serjtag свой патч ftdi-bitbang-5.10-1.patch, который использует эту библиотеку. Проверил прошивая и устанавливая fuse-биты на ATTiny2313. Естественно сделал правила для сборки и поместил в AUR: avrdude-ftdi. Вариант, если нужно отстроить на архитектуру отличную от x86/x86_64 или если бинарная версия проприетарной библиотеки рушится на вашей системе (тем более, что обновлялась она с 2008 года).

Вот тут товарищ Di Halt более подробно рассказывает про программатор на такой же микросхеме, которая стоит на Arduino. Там он говорит об одной неприятной особенности: после прошивки не отпускается линия RESET и решает проблему аппаратно. Можете поступить так же, но оказалось что, что в исходных кодах avrdude достаточно добавить одну строчку - выставление высокого уровня на линии RESET перед закрытием порта и выходом. Патч делающий это для использования с libftd2xx и набором патчей serjtag можно поглядеть тут: http://aur.archlinux.org/packages/avrdude-serjtag/avrdude-serjtag/clean-reset-pin.diff. При сборке пакетов avrdude-serjtag и avrdude-ftdi изменения отраженные в этом патче уже применены, так что, счастливым обладателям ArchLinux достаточно просто собрать и поставить пакет :)

Немножно хотел бы остановиться на описании программатора в конфигурационном файле avrdude.conf, особенно назначение цифр для задания линий. Выглядит это примерно так:

#arduino duemilanove
programmer
  id    = "duemilanove";
  desc  = "FT232R Synchronous BitBang";
  type  = ft245r;
  miso  = 3;  # CTS X3(1)
  sck   = 5;  # DSR X3(2)
  mosi  = 6;  # DCD X3(3)
  reset = 7;  # RI X3(4)
;

programmer
  id    = "ft245r";
  desc  = "FT245R Synchronous BitBang";
  type  = ft245r;
  miso  = 1; # D1
  sck   = 0; # D0
  mosi  = 2; # D2
  reset = 4; # D4
;

Не мог понять, пока не почитал внимательно приложение к даташиту FT232R подробно рассказывающее про Bit Bang режимы этой микросхемы. Если коротко: для программатора нужно 4 линии, микросхема предоставляет 8 линий, на которых можно играться уровнями. Естественно в каждом конкретном программаторе могут использоваться любые 4 из этих 8ми линий.

Каждая линия отражает бит с номером от 0 до 7. На Arduino на разъем X3 выведены контакты микросхемы с номерами 11, 9, 10, 6, подключаемых по следущей схеме:

11 - MISO
 9 - SCK
10 - MOSI
 6 - RESET

В документации находим табличку, в которой представлены номера выводов и какой бит они предоставляют, и получаем такую таблицу соответствий:

Имя линии Номер вывода микросхемы Имя вывода Номер вывода разъема X3 Номер/Имя бита (согласно таблицы)
MISO 11 CTS 1 D3
SCK 9 DSR 2 D5
MOSI 10 DCD 3 D6
RESET 6 RI 4 D7

Смотрим на последнюю колонку: вот они откуда и берутся эти самые 3, 5, 6, 7 в описании программатора в avrdude.conf. Т.е. эти номера - это номера битов. С остальными программаторами дело обстоит схожим образом. Одного я не понял, почему этого нет в документации? Или плохо искал?

На этом пока все, сейчас обощаю идеи о среде разработки (на данный момент на базе Makefile) и опубликую заметку.

// Arduino: небольшой отчет по мастер-классу

Итак, в субботу случилось данное событие, всех и себя поздравляю :)

Все исходники по семинару (презентация, схемы, разводка, листинги программ) приложены в конце статьи.

Количество пришедшего народу несколько порадовало, хотя очень расстроило, что не было никого из политена (народное название ДВГТУ), кто сейчас там учится или преподает, особенно электрические машины, ведь, по сути, я продемонстрировал готовый вариант ШИМ управления двигателем, и применить подобную наработку в какой нибудь курсовой или дипломной работе - милое дело.

Вот новых лиц было малова-то: с Русланом Остапенко (учитель информатики из села Раздольного) приехали 4 школьника, надеюсь им было интересно и информация хоть частично осядет в их головах, и было 2 студента из ДВГУ— увидели объявление, заинтересовались.

В общем, главное, что был интерес.

Начал свой рассказ с небольшой демонстрашки, топорной, но да не суть, можно будет после переделать.

В общих чертах рассказал что собой представляет плата Arduino, какие внешние интерфейсы предоставляет.

После беглого знакомства, перешли к демонстрации, того, что я сказал словами.

Первый пример, был типичным из оперы «Hello, world!», я назвал его - «Hello, Arduino!», представляет собой простейшую программку, которая дрыгает 13м цифровым выходом, устанавливая там поочередно высокий и низкий уровень. Сердобольные разработчики подумали о начинающих, что бы они смогли сделать быстро свой первый проект: на 13ю ногу посадили светодиод. Так что, дрыгая ногой, мы заставляем мигать его, получается простейший маячок :)

Далее, усложнили этот пример, оставил программу той же, но на 13 ногу посадили простейший генератор прямоугольных импульсов, и, дабы не нагружать ногу коммутацией, а только управлением, добавил простейший ключик на транзисторе. Схемка прилагается.

Результат - тот же маячок, только звуковой.

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

Сказано - сделано, теперь уже не меняется схема, а меняется программа, которая стала выбивать морзянкой «Hello, world», так что, первый полноценный пример хеловорлда.

Далее, думаем, а ведь дергая ногой мы тоже формируем прямоугольные импульсы, а следовательно… А следовательно, что бы издавать звук морзянки, нам даже не нужна никакая внешняя схема!

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

После этого перешли к ШИМ 7), и опять таки, ничего сложного, по сути, то же дерганье ногой.

Демонстрационный стенд представлял собой ключ на мощном полевом транзисторе, для коммутации силовой цепи, кулер на 12В от старого компьютерного блока питания и сам блок питания стандарта АТ.

Программная часть была реализована с помощью программного ШИМ (без задержек) и с помощью ШИМ на таймере (используя только стандартную библиотеку Arduino 8)). Там же было реализовано базовое взаимодействие с пользователем через терминальную программу (в демонстрации использовал screen /dev/ttyUSB0 9600).

К этому времени, мы уже задергались ногами, пора уже что-то и вводить. Для этих целей применил обычную PS/2 клавиатуру, но стандартная AT или даже XT вполне тоже подойдут для этих целей, программа только читает скан-коды, все остальное можно почерпнуть в интернет, в частности таблицу этих самых скан-кодов.

Затем перешли к вопросу: а можно сделать гирлянду на новый год? Можно, вот только 14ти светодиодов будет явно маловато, в случае индивидуального управления. Как быть? А так же, как быть, если для управления не хватает 14 цифровых выходов? Ответ находим листая даташиты (по русски - спроврочные листки) на микросхемы логики 74й серии (можно и любую другу, главное фантазия и предоставляемые возможности), находим там чудный образец 74HC595 - сдвиговый регистр 9).

Из всего умного: при помощи трех интерфейсных проводков (стробирование, клок и данные), накачиваем побитово байт в микруху, после чего переключаем состояние строба с высокого на низкий уровень, и заданные байтом биты становятся активными на выходах микросхемы. В итоге имеем преобразование - 3 выхода в 8. Но и это не все! Есть чудный выход 7', туда начинает вылазить, что не поместилось в 8 бит, а следовательно, мы можем их цеплять последовательно, получая на тех же самых 3х выходах 8-16-24 и т.д., главное, что бы быстродействия хватило :)

Подробнее популярно про сдвиговый регистр можно прочитать на сайте http://easyelectronics.ru, там же есть хак, как можно управлять регистром по 2м и даже 1 проводу (встречу в производстве - убью, такая фраза про это решение :))

Для демонстрационного стенда нарисовал схемку (gschem10)), сделал разводку (pcb11)) и по технологии ЛУТ сделал печатную плату, сделал с таким расчетом, что бы можно однотипные наращивать в каскады без пайки.

Программная часть представила собой 1 функцию для вывода байта в сдвиговый регистр и вывод цифр от 0 до 255 (от 0b00000000 до 0b11111111 в бинарном виде), индикация - светодиодами.

Теперь можно и собрать гирлянду и управлять сегментными индикаторами, на которые нужно много ног. Но помимо сегментных индикаторов, есть и LCD дисплеи на чипе HD4478012), по сути является стандартом де-факто. Демонстрационный стенд для подключения этого индикатора по 8битной и 4битной шине был следующим после сдвигового регистра. Программная часть была сделана на собственных функциях (полностью своя реализация работы с дисплеем, используя только справочный листок) и на библиотеки LiquidCrystal, идущий вместе с ПО Arduino.

Уже после семинара, я подключил данный индикатор через сдвиговый регистр, сделав так, что теперь на индикатор тратится 4 вывода, 3 из которых управляют сдвиговым регистром, а 1 заведен на Enable вывод LCD (без этого работа получалась не стабильной, где-то слетали тайминги и индикатор начинал сходить с ума).

На этом мои демонстрационные примеры закончились, и сделали небольшой экспромт: Руслан Остапенко, привез свой модуль Arduino с подключенным цифровым температурным датчиком DS18B20 с выводом строки с температурой на последовательный порт. Соединили RX/TX выходы Arduino, на моем модуле, настроил прием строки и вывод её на дисплей. Монстрообразно, нннно :)

На этом закончили и разошлись, не успел сделать демонстрацию работы по шине i2c, для чего прикупил часы реального времени PCF8583, но, думаю, не последний раз собираемся.

В общем, Arduino хороший способ окунуться в мир микроконтроллеров, без опасности утонуть :)

PS Фото предвидятся.:

Материалы по мастер-классу

  • arduino_seminar_files.tar.bz2 - презентация, схемы, разводка печатных плат, исходные коды для Arduino, схема модуля Arduino 2009 + бонусом мои компоненты для schem и pcb
  • Справочные листки используемых компонент:

Полезные ссылки

7)
ШИМ (или PWM) - Широтно Импульсная Модуляция (Pulse Width Modulation)
8)
Подробнее - EN/RUS
9)
Что такое и с чем едят, а так же варианты другой логики - EN/RU
12)
Подробности - EN/RUS

// 0b00100100

Покрутил тут ардуино,точнее прикручивал к нему ЖКИ, для него хоть и есть готовая библиотека, но хотелось разобраться с даташитом и сделать по описанию (задача удалась процентов на 90, т.к. подглядывать в исходники библиотеки пришлось, но, как в итоге оказалось, из-за небольшой ошибки в схемотехнике,так бы моё работать начало).

Но суть не в том, там команды формируются битами и битами же в байте задаются её параметры. По классике жанра делаются примерно такие дефайны в шестнадцатеричном виде:

#define BIT0 0x01
#define BIT1 0x02
#define BIT2 0x04
#define BIT3 0x08
#define BIT4 0x10
#define BIT5 0x20
#define BIT6 0x40
#define BIT7 0x80

или в восьмеричном:

#define BIT0 0001
#define BIT1 0002
#define BIT2 0004
#define BIT3 0010
#define BIT4 0020
#define BIT5 0040
#define BIT6 0100
#define BIT7 0200

тут нетрудно проследить закономерности, разделив биты в группы по 4 (в hex представлении) или по 3 (начиная с нулевого, в oct представлении).

Но голова не резиновая, решил поискать, а не придумали что в C/C++ для непосредственного задания констант в битовом представлении.

Оказалось - придумали, по крайней мере в компиляторах GCC и GCC-AVR можно задавать непосредственно битовое число, используя префикс 0b:

#define BIT0 0b00000001
#define BIT1 0b00000010
#define BIT2 0b00000100
#define BIT3 0b00001000
#define BIT4 0b00010000
#define BIT5 0b00100000
#define BIT6 0b01000000
#define BIT7 0b10000000

или (кому как более наглядно):

#define BIT0 0b1
#define BIT1 0b10
#define BIT2 0b100
#define BIT3 0b1000
#define BIT4 0b10000
#define BIT5 0b100000
#define BIT6 0b1000000
#define BIT7 0b10000000

Не ручаюсь абсолютно на совместимость с другими компиляторами (да и нет её скорее всего), но интересно было бы узнать как там обстоят дела с подобной bin-нотацией констант.

PS да, объединять потом в нужное число или исключать нужные биты:

unsigned char c1 = BIT0 | BIT4 | BIT7; /* включить биты */
unsigned char c2 = c1 ^ BIT4; /*выключить биты */
if(c1 & BIT4) {} /* проверить установку бита */

UPD:
Вот выдержка из документа по GCC, страница 556:

6.56 Binary constants using the ‘0b’ prefix
nteger constants can be written as binary constants, consisting of a sequence of ‘0’ and ‘1’ digits, prefixed by ‘0b’ or ‘0B’. This is particularly useful in environments that operate a lot on the bit-level (like microcontrollers).

Секция 6 этого документа зовется «Extensions to the C Language Family», в начале этой секции говорится:

GNU C provides several language features not found in ISO standard C. (The ‘-pedantic’ option directs GCC to print a warning message if any of these features is used.) To test for the availability of these features in conditional compilation, check for a predefined macro GNUC, which is always defined under GCC.
These extensions are available in C and Objective-C. Most of them are also available in C++. See Chapter 7 [Extensions to the C++ Language], page 547, for extensions that apply only to C++.
Some features that are in ISO C99 but not C89 or C++ are also, as extensions, accepted by GCC in C89 mode and in C++.

сиречь, если захотите публиковать программу, скомпилируйте её с параметром -pedantic, проверьте все предупреждения и… или давайте рекомендации или используйте препроцессорные директивы.