Управление электрическими цепями через USB
Обновлено 23.11.13. Теперь устройство на заводской плате!
Многие из нас наверно хотели бы управлять электрическими цепями через комп. А че? неплохо было бы))) Представь, звонит тебе друг, говорит: "Через 20 мин буду", тут проходит 20 минут, звонок в двери, но как же впадлу вставать из-за компа, идти открывать двери и т.д. А представь иную ситуацию: звонок в двери, тут у тебя на мониторе вылазит сообщение типа "У Вас гости", ты нажимаешь кнопку на компе - открывается магнитный замок на дверях и ты орешь на весь дом: "Заходи", или тебе нужно включить электрочайник, свет или еще что то. В наше время это уже не фантастика а вполне реалистично, только вот из-за хреновой экономики далеко не каждый может позволить себе даже самый простейший "смарт-хаус", но если есть желание и прямые руки, то можно запросто сделать управление электрическими цепями через ПК.
В наше время достаточно много людей умеют программировать, они могут написать программку под комп, которая смогла бы управлять внешними устройствами, но как подключить тот же электрочайник к компу? Ну можно к примеру через LPT порт, только вот его уже редко где можно увидеть, что тогда остается? USB!!!
Давайте сделаем устройство, которое будет подключаться к USB и сможет управлять электроцепями(например, включать освещение), реагировать на замыкание кнопок(например, дверной звонок) и еще что-то.
Итак, из чего же мы будем его делать? Те, кто интересовался данным вопросом, наверно уже слышали об модуле Ke-USB24A.

Модуль Ke-USB24A предназначен для сопряжения внешних цифровых и аналоговых устройств, датчиков и исполнительных механизмов с компьютером через шину USB. Определяется как дополнительный (виртуальный) COM порт. Модуль имеет 24 дискретные линии ввода/вывода (либо лог. 0 либо лог. 1) с возможностью настройки направления передачи данных (вход/выход) и встроенный 10-ти разрядный АЦП. Для управления модулем предусмотрен набор текстовых команд управления (KE - команды).Отличительные особенности:
- интерфейсный модуль для сопряжения по шине USB
- определяется ОС Windows/Linux как виртуальный COM порт
- не требует дополнительных схемных элементов, сразу готов к работе
- 24 дискретные линии ввода/вывода с возможностью независимой настройки направления передачи данных (вход/выход) и сохранения настроек в энергонезависимой памяти модуля
- встроенный 10-ти разрядный АЦП с гарантированной частотой дискретизации до 400 Гц.
- динамический диапазон напряжения входного аналогового сигнала для АЦП от 0 до 5 В
- набор готовых текстовых команд управления высокого уровня (KE - команды)
- удобный форм-фактор в виде модуля с DIP-колодкой и разъемом USB-B
- возможность питания как от шины USB так и от внешнего источника питания (режим выбирается джампером на плате)
- возможность сохранения данных пользователя в энергонезависимой памяти модуля (до 32 байт)
- возможность изменения строкового дескриптора USB устройства
- каждый модуль имеет уникальный серийный номер доступный программно
- поддержка ОС Windows 2000, 2003, XP 32/64 bit, Vista 32/64 bit и Windows 7 32/64 bit
- поддержка OS Linux
Вроде бы это то, что нам нужно, НО... цена этого чуда начинается от $40. Наверно у вас уже пропало желание его покупать))).
Давайте лучше сами соберем подобный модуль, только чтобы он был доступный даже голодному студенту!
Из обязательных критериев: дешевизна и легко доступность компонентов, простота сборки.
В качестве микроконтроллера возьмем широко распространенный ATmega8 (без индекса L в конце). Характеристики нашего модуля будут такие:
- Подключение к ПК через USB.
- определяется ОС Windows как USB HID устройство, не требующее драйверов.
- Сразу готов к работе.
- 7 линий вывода с логическим состоянием (активен/неактивен).
- 2 линии вывода с плавным управлением напряжения от минимума до максимума. Только это не ЦАП(цифрово-аналоговый преобразоватль) а ШИМ (широтно-импульсная модуляция). Но с помощью фильтра можно легко превратить в ЦАП.
- 7 линий ввода с логическим состоянием (активен/неактивен).
- 1 АЦП(аналогово-цифровой преобразователь) с возможностью подключения внешнего источника опорного напряжения (ИОН).
- Возможность заливать новую прошивку прямо через USB.
Почему я выбрал именно HID а не виртуальный COM порт (CDC)? Во первых, не нужны драйвера, во вторых - HID в несколько раз меньше грузит микроконтроллер чем CDC, так как данные запрашиваются не постоянно, а только тогда, когда этого требует хост (компьютер), и вообще, COM порт уже отмирает, сейчас аппаратных COM портов уже практически нет, остались только виртуальные. Логические линии вывода предназначены для управления только двумя состояниями - включенный или выключенный, при выключенном на выходе (ножке микроконтроллера) будет 0В при включенном - 5В, сюда вы можете подключить просто светодиод и управлять ним с ПК, а можете подключить реле (через транзистор) и управлять более мощной нагрузкой (освещение и т.д.). Линии вывода с регулировкой напряжения(ШИМ выход) позволяют плавно менять напряжение на ножке микроконтроллера от 0В до +5В с шагом 5/1024В. Линии ввода с логическим состоянием предназначены для мониторинга состояния кнопок, ключей и т.д. Когда линия замкнута на землю (корпус, GND), ее состояние = 0, если не замкнута - 1. АЦП позволяет измерять напряжение, сюда можно подключить потенциометр, аналоговый термодатчик, или еще что то, только напряжение, на этой ножке не должно превышать напряжение питания. В качестве источника опорного напряжения для АЦП можно использовать как внешний ИОН, так и напряжение питания модуля. Чтобы при перепрошивке не приходилось подключать микроконтроллер к программатору, сделаем возможность заливки прошивки прямо через USB, без использования внешнего программатора.
Схема устройства:

Как видите, схема достаточно проста, только коннекторы я прикрепил на схеме не по порядку, это потому что у ATmega8 ножки каждого порта почему то расположены в разброс, зато на самой плате будет выглядеть красиво))).
Печатная плата:

Ну и в результате получилось вот что:
Теперь разберемся что куда будем подключать:)
USB - Порт. Думаю его все знают.
- Индикатор питания.
- Кнопка сброса (перезагрузка).
- Логический вход 1.
- Логический вход 2.
- Логический вход 3.
- Логический вход 4.
- Логический вход 5.
- Логический вход 6.
- Логический вход 7.
- Вход АЦП.
- Вход для подключения ИОН.
- Этот контакт подключен к питанию устройства. Замкните перемычкой 12 и 13 контакты чтобы напряжение ИОНа было равно напряжения питания.
- Логический выход 1.
- Логический выход 2.
- ШИМ выход 1.
- ШИМ выход 2.
- Логический выход 3.
- Логический выход 4.
- Логический выход 5.
- Логический выход 6.
- Логический выход 7.
Устройство на заводской плате:


В этой версии платы добавлены защитные диоды BAV99 на все входы.
Внимание! В данной версии платы контактный входы немного перебазированы. В файлах прошивка именно для этой платы. Подробнее смотрите в файле main.c начиная с 36 строки.
Что такое GND?
Даже начинающий радиолюбитель знает что такое GND, но некоторым людям это кажется страшным буквами. GND - это, так сказать, общий контакт. Его еще называют землей и массой. Провод обычно черного света (иногда белого или еще какого нить). GND также подключается к металлическому корпусу устройства. На плате в большинстве случаев все свободное место заполняет GND в виде больших полигонов. На нашем модуле есть полигоны в виде сеточки, они так же соединяются с корпусом USB - разъема.
Программа для микроконтроллера.
Так как в статье я хочу рассказать как управлять цепями через USB с помощью готового модуля, то я не буду объяснять как работает программа микроконтроллера, снизу можете скачать исходники и посмотреть, там много комментов. Здесь я напишу просто об идентификаторах устройства.
Итак, в исходниках находится файл usbconfig.h, в нем есть строки
#define USB_CFG_VENDOR_ID 0x10, 0x00
#define USB_CFG_DEVICE_ID 0x01, 0x00
#define USB_CFG_VENDOR_NAME 'k','i','b','e','r','m','a','s','t','e','r','.','p','l','.','u','a'
#define USB_CFG_VENDOR_NAME_LEN 17
#define USB_CFG_DEVICE_NAME 'U','S','B','-','C','o','n','t','r','o','l'
#define USB_CFG_DEVICE_NAME_LEN 11
Первые две строчки - это ID производителя и ID продукта, такие есть у каждого USB устройства, только в этом файл указывается сначала младший байт, потом старший, в проге под комп - наоборот. Дальше идет имя производителя (вендора) и название устройства, также указывается длина строки в байтах. Программа ПК сначала будет искать устройств по ID и потом, среди найденных, будет искать по имени.
Прошивка устройства.
В скачанных файлах в папке MCU\usb_bootloader\ найдите файл main.hex - это usb-bootloader, его нужно залить в МК с помощью внешнего программатора. После заливки также нужно правильно установить фьюзы, в окне программатора STK500 должно выглядеть так:

После удачной прошивки, можно попробовать прошить устройство через бутлоадер. Как он работает? При включении МК (просто при подаче питания, или после ресета) сразу запускается бутлоадер, он проверяет условие, если оно истинно, то запускается инициализация бутлоадера (комп при этом находит устройство). В качестве условия у нас будет "Логический вход 1 = 0", то есть, чтобы запустить бутлоадер, нужно замкнуть Логический вход 1 на GND и нажать на устройстве кнопку RESET, в диспетчере устройство должно появиться новое HID устройство, так же не требующее драйверов:



Хост
Хост - это то, что будет управлять устройством, в нашем случае - компьютер. Управление устройством с ПК я опишу более подробно.
Для программистов Delphi написать прогу управления HIDом не составит проблем так как в инете куча инфы. А вот программистам C++ Builder не все так сладко, но, как оказалось, не так все и плохо))). В инете я нарыл библиотеку hidlibrary.h, вот с ее помощью мы будет работать с HID устройством.
Скачайте исходники и запустите USB Control.cbproj (C++ Builder 2010).
В файле hidlibrary.h в самом верху есть строка
const char idstring[] = "vid_0010&pid_0001";
Да-да, это те же самые ID, которые мы указывали в usbconfig.h. Если будете менять VID and PID, то не забывайте отредактировать эту строку. Кроме данной строки в файле hidlibrary.h нам больше ничего редактировать не нужно, можете его закрыть.
Открываем main.cpp, вверху указан относительный адрес к файлу usbconfig.h", это нужно чтобы библиотека HID знала имя вендора и продукта.
#include "../MCU/USB_Control/usbdrv/usbconfig.h"
Создадим форму, на форме будет один CheckListBox для управления логическими выходами, 2 ScrollBar для управления ШИМ каналами, один ListBox для отображения логических входов, один Label для отображения состояния АЦП и один таймер. Должно получиться вот такое:

Переименуйте СкрулБары в ScrollBar_PWM1 и ScrollBar_PWM2, в их свойствах установите Max=1023.
Создадим структуру
#pragma pack (push, 1)
struct status_t{
unsigned char logical_outputs;
unsigned char logical_inputs;
unsigned char ADC_DATA;
unsigned short int PWM1;
unsigned short int PWM2;
} ;
struct status_t DeviceStatus;
#pragma pack ( pop)
#pragma pack нужна чтобы компилятор не выравнивал структуру. В logical_outputs хранятся состояние всех логических выходов, в побитном режиме, то есть, первый бит хранит состояние первого выхода, второй - второго и так до седьмого. Аналогично logical_inputs хранит состояние логических входов. В ADC_DATA хранится состояние АЦП, минимальное значение 0, максимальное - 255. В PWM1 хранится состояние первого ШИМ выхода (плавная регулировка напряжения), в PWM2 - состояние второго, минимальное значение 0, максимальное - 1023.
В программе ПК нужно считать с микроконтроллера эту структуру, ну и далее обработать принятые данные. Чтобы установить новые значения выходов, нужно сначала записать в структуру новые значения, а потом отправить измененную структуру на микроконтроллер. При установке новых значений нужно редактировать только первый, 4 и 5 элементы, редактирование остальных двух не даст никакого эффекта.
Далее создаем экземпляр класса
HIDLibrary <status_t> hid;
И добавляем функцию connect().
int connect(void)
{
int i, n, res=0;
string exampleDeviceName = "";
exampleDeviceName += vendorName;
exampleDeviceName += " ";
exampleDeviceName += productName;
n = hid.EnumerateHIDDevices();
for (i=0; i<n; i++) // ищем наше устройство
{
hid.Connect(i);
// GetConnectedDeviceName() возвращает string,
// где через пробел указаны vendor и product Name.
// Сравниваем, если совпало - значить устройство наше
if ( hid.GetConnectedDeviceName() == exampleDeviceName )
{
res = 1;
break;
}
}
return res;
}
Теперь данные с HID-устройства можно запросить с помощью функции hid.ReceiveData, указав в качестве параметра указатель на структуру, только перед запросом нужно проверить, подключено ли устройство:
if ( connect() ) hid.ReceiveData(&DeviceStatus);
Аналогично можно передать данные в устройство:
if ( connect() ) hid.SendData(&DeviceStatus);
А теперь давайте допишем нашу программу (или просто скачайте исходники, там все готовое))).
Добавьте где нить в коде (лучше сразу после структуры) эти строки:
char vendorName[] = {USB_CFG_VENDOR_NAME, 0};
char productName[] = {USB_CFG_DEVICE_NAME, 0};
Так как нужно будет работать с отдельными битами, объявим несколько дефайнов:
#define sbi(reg,bit) reg |= (1<<bit) // установить бит
#define cbi(reg,bit) reg &= ~(1<<bit) // сбросить бит
#define ibi(reg,bit) reg ^= (1<<bit) // инвентировать бит
#define CheckBit(reg,bit) (reg&(1<<bit)) // проверить бит
В свойствах таймера укажите Enabled = True, Interval = 500. Щелкните по нем дважды и в обработчике напишите
if (!connect()) return; // Выходим, если устройство не подключено
hid.ReceiveData(&DeviceStatus); // Читаем данные с устройства
for (char i = 0; i < 7; i++)
CheckListBox_LogOuts->Checked[i] = CheckBit(DeviceStatus.logical_outputs, i);
ScrollBar_PWM1->Position = DeviceStatus.PWM1;
ScrollBar_PWM2->Position = DeviceStatus.PWM2;
ListBox_LogInputs->Clear();
for (char i = 0; i < 7; i++)
ListBox_LogInputs->Items->Add(" Лог. вход "+IntToStr(i+1)+" = "+BoolToStr(CheckBit(DeviceStatus.logical_inputs, i)));
Label_ADC->Caption = DeviceStatus.ADC_DATA;
Думаю, тут все понятно и объяснений не требует.
Кликните дважды по CheckListBox, в обработчике напишите
for (char i = 0; i < 7; i++) {
if (CheckListBox_LogOuts->Checked[i]) sbi(DeviceStatus.logical_outputs, i);
else cbi(DeviceStatus.logical_outputs, i);
}
if ( connect() ) hid.SendData(&DeviceStatus);
Тут копируется состояние чекбоксов в элемент структуры, после чего структура отправляется в МК.
Осталось сделать управление ШИМ выходами. Кликните один раз по ScrollBar_PWM1, зажмите Shift и выбирите ScrollBar_PWM2, короче нужна выделить 2 скрулбара, слева откройте события (Events) и в OnChange укажите тот же обработчик, что и в CheckListBox, а в обработчике пред последней строкой добавьте:
DeviceStatus.PWM1 = ScrollBar_PWM1->Position;
DeviceStatus.PWM2 = ScrollBar_PWM2->Position;
Все, можно компилировать!
Тест-драйв.
Итак, все готово: устройство собрано, микроконтроллер прошит, программа для компа создана, можно протестировать.
Подключите устройство к ПК, запустите программу. Слева в листбоксе отображается состояние всех логических входов, если, к примеру, Логический вход 1 не замкнут на GND, тогда будет написано "Лог. вход 1 = -1", если подключен, то "Лог. вход 1 = 0". Вот скрин:

Теперь подключите какую то маленькую нагрузку к Логическом выходу 1 (светодиод или просто вольтметр). Поставьте галочку возле "Лог. выход 1" - светодиод загорится.
Подключите вольтметр к первому ШИМ каналу, покрутите ползунок - напряжение будет меняться.
Завершение.
Теперь можете сделать на основе этого модуля управление освещением или ще какими о электроприборами. К логическим входам можно подключить кнопку дверного звонка или какой то другой ключ. К входу АЦП можете подключить аналоговый датчик влажности, термодатчик или фоторезистор (будете занать, ночь на улице или день)))).
Вопросы задавайте в коментах.
Здраствуйте! Пытаюсь собрать данный модуль, прошил МК, собрал на макетной плате схему, но компьютер почему то отказывается его видеть!=( ничего не могу с этим сделать! Подскажите пожалуйста, как проверить прошивку микроконтроллера, потому что после установки фьюзов программатор не видит его!
ОтветитьУдалитьЭто потому, что вы неправильно фьюзы установили. Какие именно фьюзы меняли?
ОтветитьУдалитьС устройством разобрался! Все работает. Но вот не получается сделать передачу от АЦП в 10 разрядов. Подскажите пожалуйста!=) Заранее благодарен!
ОтветитьУдалитьтам всеравно в двух битах мусор
ОтветитьУдалитьмне нужно организовать 10 битную передачу от АУП. Это что нельзя сделать?
ОтветитьУдалитьМожно, но точность будет на уровне 8-бит
ОтветитьУдалитьа как можно узнать параметры элементов схемы или их марку - диоды и конденсатор возле USB-разъема не расписаны
ОтветитьУдалитьто не диоды а стибилитроны. Кондер где то на 10-100 мкф
ОтветитьУдалитьЗамечательное устройство, собрал = работает!
ОтветитьУдалитьРасскажите пожалуйста, как работать с Вашим устройством в Linux?
а я хз, я под винду пишу))))
ОтветитьУдалитьЗаменить Atmega8 на Atmega8515 представляется возможным?
ОтветитьУдалитьлучше на 8535, там просто в настройках проекта выбрать нужный микроконтроллер
ОтветитьУдалитьAtmega8515 лежит пылится хочется задействовать.
ОтветитьУдалитьНемного другие порты и их больше.
С какими проблемами столкнусь?
да проблем не будет. Я просто с 8515 никогда не работал)))))
ОтветитьУдалить1) Подойдет ли Atmega8А и надо ли менять что-то в проекте или можно заливать main.hex из архива как есть?
ОтветитьУдалить1) В STK500 галочка во фъюзе означает, что пишем в него 1 или 0 как в PonyProg и AVRDUDE?
Заранее спасибо, очень интересный проект!
1. Подойдет, менять ниего не надо.
ОтветитьУдалить2. Да просто через аврстудию установите фьюзы как на скрине
Здраствуйте! Хорошая информация очень нужная большое спасибо! Подскажите пожалуйста как выставить фьюзы в СODVISION там для Mega8 такие:CKSELO0,CKSELO1,CKSELO2,CKSEL3, SUT0,SUT1,BODEN,BODEN, BODLEVEL,BOOTRST,BOOTSZ0,BOOTSZ1,EESAVE,CKOPT,WDTON,RSTDISBL. Я полный профан только учусь! И еще мое устройство обнаружил диспечер задач все нормально (виндовс реагирует на нажатие ресет адекватно)но boot.bat не запускается. Я сначала загрузил файл main.hex устройство не определялось но когда загрузил далее USB_Control.hex тогда определилось. Подскажите пожалуйста что дальше сделать что бы запустился boot.bat (фьюз-битов HIGH и LOW где они я не нашол))))) в код висион.в диспечере устройств окончание идентефекатора другие числа наверное это нормально. Большое спасибо за ответ.
ОтветитьУдалитьвообще то, в статье написано, что для того, чтобы запустился бутлоадер (который в main.hex), нужно прижать лог.вход 1 к земле
ОтветитьУдалитьУсловие логически вход1 =0 (третья ножка микросхемы на землю ) я выполняю а "в папке MCU\USB_Control\default\ запускаем файл boot.bat" окошко появляэтся кратковременно если это фюзы подскажите их инициализацию в окне СodеVisionAVR если можно, или что это может быть за неполадка. Спасибо.
ОтветитьУдалитьпопробуйте просо прошить другой програмой, где можно задавать HIGH и LOW, я просто кодевиденом никогда не пльзовался, а программировал всегда через avr studio
ОтветитьУдалитьДа я думал об этом но у меня старый програматор STK200 (на LPT порт) Вчера скачал аврстудио там STK500,может в начальных версиях есть возможность STK200. Я понял что это всетаки фьюзи попробую с другой програмой. Спасибо!
ОтветитьУдалитьв ICC по-мойму можно задавать HIGH и LOW
ОтветитьУдалитьСпасибо попробую.
ОтветитьУдалитьЗдраствуйте. Скажите окошко с цыферками бегающими (запускаем файл boot.bat)если закривается через несколько секунд но цыферки бегают, это означает что все нормально или надо что бы оно вообще не закрывалось?
ОтветитьУдалитьэто значит, что прошилось нормально. А вообще, чтобы было видней, откройте bat файл блокнотом и добавьте в конце "pause" (с новой строки)
ОтветитьУдалитьСпасибо! Движемся дальше) Может кому надо для CodeVision поставить фюзы то ставятся метки только возле: BOOTRST =0, BOOTSZ0=0, BOOTSZ1=0,а возле остальных полей ничего не ставится. Ещераз спасибо!
ОтветитьУдалитьЗдраствуйте. Подскажите пожалуйста по возможности как устранить ошибки в програме при компиляции(редактор Microsoft Visual C++)
ОтветитьУдалитьпишет что ошибка в hidlibrary.h(20)как такое может быть, может дело в редакторе?
Compiling...
портUSB.cpp
c:\портusb\hidlibrary.h(20) : error C2258: illegal pure syntax, must be '= 0'
c:\портusb\hidlibrary.h(51) : see reference to class template instantiation 'HIDLibrary' being compiled
c:\портusb\hidlibrary.h(20) : error C2252: 'datasize' : pure specifier can only be specified for functions
c:\портusb\hidlibrary.h(51) : see reference to class template instantiation 'HIDLibrary' being compiled
C:\портUSB\портUSB.cpp(39) : error C2065: 'USB_CFG_VENDOR_NAME' : undeclared identifier
C:\портUSB\портUSB.cpp(40) : error C2065: 'USB_CFG_DEVICE_NAME' : undeclared identifier
c:\портusb\hidlibrary.h(20) : error C2258: illegal pure syntax, must be '= 0'
C:\портUSB\портUSB.cpp(42) : see reference to class template instantiation 'HIDLibrary' being compiled
c:\портusb\hidlibrary.h(20) : error C2252: 'datasize' : pure specifier can only be specified for functions
C:\портUSB\портUSB.cpp(42) : see reference to class template instantiation 'HIDLibrary' being compiled
Error executing cl.exe.
И еще вопросик, можно ли изменить прогу контролера чтобы выходов было 10, а входов 4 соответственно, насколько велики масштабы изменения кода?
Спасибо.
этот код под с++ builder, а не Microsoft Visual с++.
ОтветитьУдалитьэти изменения внести можно, просто вместо 2 входов сделайте еще 2 выхода
Здравствуйте, сделал это устройство с той лишь разницей, что atmega8 в tqfp корпусе и кварц на 12 МГц (на 16 в продаже не было). Соответственно, соединил лишние ножки 4,6 (vcc) и 3,5,21 (gnd), 19 и 22 остались невостребованными, остальные паял в соответствии с даташитом. Шьется внешним программатором "на ура", фьюзы поменял, как написано в инструкции (шил с помощью avrdude через ft232rl). Но после прошивки (либо bootloader'а с последующим замыканием входа 1 на gnd, либо напрямую usb_control.hex) в системе определяется как неизвестное usb устройство. Что мог сделать не так? (Все ноги и дорожки прозвонил)
ОтветитьУдалитьпрошивка (бутлоадер и основная), расчитаны на частоту именно 16 мгц, на других работать не будут
ОтветитьУдалитьЯсно, не знал, тогда буду переделывать. Спасибо за ответ.
ОтветитьУдалитьЗдравствуйте!
ОтветитьУдалитьСкажите пожалуйста, насколько адекватно работает это устройство, если их подключить большое количество (8-9 штук) через usb hub? И нету ли аналогов с бОльшим количеством входов/выходов/линий ШИМ и АЦП?
дело в том, что для кождого устройства есть отдельный идентификатор, можно подкючить до 127 устройств, только для каждого должен быть свой идентификатор
ОтветитьУдалитьСпасибо за простое и доступное описание устройства!
ОтветитьУдалитьЯ мало разбираюсь, поэтому не пинайте если спрашиваю глупость :)
1) Reset кнопка не соединена с землей на плате, ее вроде развернуть надо?
2) Я прошил МК и программатор (USBasp) больше его не видит. Это нормально?
1) Вообщето, она соединена с землей, на рисунках это хорошо видно.
ОтветитьУдалить2) Конечно не нормально))) программатор должен его видеть.
1) Изучил как работает кнопка))) Действительно все ок ))
ОтветитьУдалить2) Я имел ввиду после установки фьюзов. Полагаю изза установленного SPIEN, как на скрине.
походу вы SPIEN отключили
ОтветитьУдалитьОбьязательно ли ставить бутлоадер в МК или можно залить основную прошивку без него через отдельный программатор? Какую роль выполняет бутлоадер?
ОтветитьУдалитьне обязательно. Он нужен, чтобы при перепрошивке не нужно было пользоваться внешним программатором
ОтветитьУдалитьСпасибо. Скажите, мне нужно немного переделать программу МК. Прием данных с компьютера осушествляется через прерывание "int" но я не смог найти каким образом происходит передача в ПК. В основном цыкле идет запись значений портов и АЦП в структуру но никакого намека на передачу данных, никакие функции передачи там не вызываются. Как именно и где происходит передача данных с структуры в USB?
ОтветитьУдалитьв коде прошивки естьтакая штука:
ОтветитьУдалитьif(rq->bRequest == USBRQ_HID_GET_REPORT){ // если комп запрашивает данные
usbMsgPtr = (unsigned char*)&DeviceStatus; return USB_MESSAGE_LENGTH; // указываем на структуру
Подскажите пожалуйста, реально ли переделать код прошивки под другую архитектуру МК (ARM)?
ОтветитьУдалитьИ ещё какие основные файлы необходимы для создания прошивки (только для работы с USB)?
ОтветитьУдалитьну, это придется основную часть переделывать.
ОтветитьУдалитьmain.c
ОтветитьУдалитьЯ так понимаю придётся переделывать все дефайны? или только main.c?
ОтветитьУдалитьТ.е. все файлы которые лежат в папке usbdrv привязки к конкретному микроконтроллеру не имеют? и нужно переделывать только main.c?
ОтветитьУдалитьна других мк юсб совсем по другом сделан
ОтветитьУдалитьЯ ипользую STM32F100RB на котором нет аппаратного USB. Вот я и хочу сфорганить чтобы он работал как HID устройство, а не как виртуальный сом-порт.
ОтветитьУдалитьПо этому я и спрашиваю есть ли привязка тех инклудников, что в папке usbdrv, к конкретному МК. Я так... мельком просмотрел их, вроде никакой привязанности к Atmega8 я не увидел, хотя может я ошибаюсь
там куча ассемблерских вставок, которые будут работать только на avr
ОтветитьУдалитьКаую версию AVRstudio использовали и нужны ли к ней специальные библиотеки?
ОтветитьУдалитьAVRstudio + тулчейн, больше ничего не нужно
ОтветитьУдалитьЗдравствуйте. Если делать 10 выходов и только 4 входа,какие файлы надо будет изменять?
ОтветитьУдалитьmain.c и main.cpp
ОтветитьУдалитьmain.c, который в папке USB control и main.ccp в папке PC?
ОтветитьУдалитьда
ОтветитьУдалитьтак я не понял, чтобы залить сначала main.hex, нужен другой программатор или это делается собранным по схеме?
ОтветитьУдалитьчтобы залить любой *.hex файл в микроконтроллер, нужен любой ISP программатор. Обычно программируется уже на собранном устройстве
ОтветитьУдалитьа какую программу для этого использовать?
ОтветитьУдалитьэто в зависимости от того, какой программатор вы используете. Вообще, заливка прошивки в AVR очень хорошо описана в инете
ОтветитьУдалитьу меня плата, что приведена на здесь схеме
ОтветитьУдалитья так понял, ее можно использовать и для прошивки тоже, или нет?
да, можно программировать микроконтроллер прямо на этой плате. Вам нужно подключить к ней сигналы MOSI, MISO, SCK, RESET и GND от программатора, первые три выведены справа на штыри
ОтветитьУдалитьтак все-таки программатор иметь нужно?
ОтветитьУдалитьиз статьи я понял, что плата заменяет внешний программатор
в статье написано, что внешний программатор нужен только один раз, для прошивки бутлоадера.
ОтветитьУдалитьЗдравствуйте! Тут http://chip.at.ua/index/upravlenie_vneshnimi_nagruzkami_cherez_usb_s_pomoshhju_ke_usb24a/0-18 описана схема подключения 24-х светодиодов.
ОтветитьУдалить1) Скажите пожалуйста, есть ли подобный микроконтроллер, который бы управлял 80-ю светодиодами, причем каждым отдельно?
2) Можноли как нибудь соединить в параллель два микроконтроллера и тем самым увеличить количество выходов для управления?
если нужно больше выходов, то можно использовать микроконтроллер с большим количеством ножек (мега8535, мега128 и т.д.), или же, использовать блок сдвиговых регистров 595. Как по мне, предпочтительней второй вариант
ОтветитьУдалитьДалековат я пока от всего этого, только пытаюсь вникнуть. 1)А сколько выходов у ATMega8535?
ОтветитьУдалить2)Изменится ли схема по сравнению с той что приведена выше? 3)Появилась идейка сделать светомузыку из 80-ти светодиодов, нужно чтобы на каждый LED можно было подать питание отдельно от остальных. Чтобы программно можно было описать время горения и интервалы между зажиганием светодиода. Возможно ли выполнить такое с помощью ATMega8535?
у ATMega8535 по-мойму 40 ног, схема, конечно, поменяется.
ОтветитьУдалить3) лучше мега8 + 74HC595
Тогда нужно два микроконтроллера по 40 ног, их можно в одну схему запаять, чтобы через один порт подавать на них управление? У мега8 + 74НС595 сколько ног? Ну и вобщемто похоже все равно не решит это проблему, т.к. нет схем у меня на эти микроконтроллеры. Но все равно, хотелосб бы услышать ответы, может быть это меня приблизит к цели хоть на немного )
ОтветитьУдалитьпочитайте в инете, как подключить 595 к атмеге. У 595 есть 8 выхдов и эти микры можно соединять параллельно, можно хоть и 1000 выходов сделать.
ОтветитьУдалитьОк, вариант, спасибо!
ОтветитьУдалитьЗдравствуйте, есть желание собрать сей девайс, но при по пытке открытия файла печатки в DipTrace выдаёт ошибку , изменение графического режима не помогает. Как исправить эту проблему?
ОтветитьУдалить90% что у вас старая версия, скачайте последнюю
ОтветитьУдалитьЗдравствуйте, для тех кому мало 1го АЦП или 8ми входов выходов, есть возможность подключить 2 и более таких устройств и управлять ими из одной программы (ХОСТа), что и было реализовано мною на практике. Делается это очень просто, если интересно, то спрашивайте, по мере возможности подскажу.
ОтветитьУдалитьА теперь вопрос к автору: Какая максимальная частота опроса данного USB устройства, т.е. с какой максимальной частотой мы можем получать и передавать актуальные данные по USB на устройство?
Точно не скажу, но 3 раза в секунду точно можно. Максимальная частота опроса сильно зависит от загруженности МК
ОтветитьУдалитьЗдравствуйте, пара вопросов:
ОтветитьУдалить1. Можно ли купить готовый девайс или хотя бы плату к нему в Киеве?
2. Реально ли без "глубокого погружения" в программирование самому написать программу для управления устройством с помощью обычного usb-геймпада, или это слишком сложно?
1. Сорри, но последний девайс месяц назад продал, если сильно надо, то могу в течении двух недель собрать.
ОтветитьУдалить2. Лучше какой нить обычный геймпад (от денди/сони) подключить к мк, у него интерфейс spi
Нужно собрать систему дистанционного управления. Предполагается, что с одного ноута (идеально - с помощью чего-то вроде геймпада, для удобства, но можно и с клавиатуры) через вайфай и другой ноут управляем юсб-устройством:
ОтветитьУдалить(геймпад) - ноут ->>>>>- ноут - юсби_девайс
Команды управления подавать надо достаточно часто, посему нажимать мышкой на кнопки/чекбоксы на экране не вариант.
Посему хотелось бы купить само устройство или даже два, т.к. нужно передавать более 10 команд. Срочности особой нет, вопрос - какова цена?
Плюс не помешала бы помощь в программировании вышеуказанной связки - ессно, небесплатная.
ну, пример управления входами/выходами есть в статье, как на С++ работать с геймпадом написано в инете(насколько помню, это не сложно).
ОтветитьУдалитьНа счет устройств, напишите мне на имейл admin@kibermaster.net
Где можно поменять надпись Лог.выход? Никак не могу найти.
ОтветитьУдалитьтам прямо в свойствах компонента
ОтветитьУдалитьПоменял текст Лог.вход, а где Лог.выход не найти ( в свойствах не найти. Может не там ищу.
ОтветитьУдалитьв свойстве Items
ОтветитьУдалитьХочу сделать 4 входа и 10 выходов. Можете подсказать что надо поменять в прошивки микропроцессора и какую лучше использовать программу? Спасибо заранее.
ОтветитьУдалитьсоветую немного подучить программирование, а там и вопрос отпадет))
ОтветитьУдалитьХорошо, но не понимаю почему avr studio выкидывает usbdrv/usbdrv.h: No such file or directory если этот файл есть.
ОтветитьУдалитья так понял, вы в проекте что то переделали? Тогда не забудьте добавить в линкер папку usbdrv (через Configuration)
ОтветитьУдалитьЯ поменял пины для линий входа/выхода. добавил в древо проекта файлы (AVR STUDIO 5.0 справа окно), но всё равно ошибка
ОтветитьУдалитьв студии 5 либа usb не кмпилируется
ОтветитьУдалитьРазобрался, но не меняя ничего в коде выкидывает ошибку 'for' loop initial declaration used outside C99 mode
ОтветитьУдалитьничего не меняя, оно бы работало, но вы как то отключили поддержку C99. В конфиге должна быть опция -std=c99
ОтветитьУдалитьПоследний вопрос ) добавил 3 выхода вместо 3 входов, и в проге для компа, на некоторых выходах галочка проподает сразу после нажатия. Менял PORT и DDR
ОтветитьУдалитья так понимаю где то ещё надо дефинировать выходы
ОтветитьУдалитьЯ просто хз что именно вы там переделали)))
ОтветитьУдалитьunsigned char* logical_inputs_PORT[4] = {(u8*)&PIND, (u8*)&PINC, (u8*)&PINC, (u8*)&PINC};
ОтветитьУдалитьunsigned char logical_inputs_PIN[4] = {1, 3, 2, 1};
unsigned char* logical_outputs_PORT[10] = {(u8*)&PIND, (u8*)&PINC, (u8*)&PINC,(u8*)&PORTB, (u8*)&PORTB, (u8*)&PORTB, (u8*)&PORTB, (u8*)&PORTD, (u8*)&PORTD, (u8*)&PORTD};
unsigned char logical_outputs_PIN[10] = {0, 5, 4, 5, 4, 3, 0, 7, 6, 5};
и потом
DDRB = 0b00111111; PORTB = 0b00000000;
DDRC = 0b00110000; PORTC = 0b00001110;
DDRD = 0b11100001; PORTD = 0b00000010;
в проге для компа for (char i = 0; i < 7; i++) вместо 7, 4 и 10 соответственно. и всё
еще нужно сделать, чтобы на комп передавалось не 7, а 10
ОтветитьУдалитьА это где?
ОтветитьУдалитьв прошивке мк и коде программы пк
ОтветитьУдалитьа можете подсказать где именно?
ОтветитьУдалитьstruct status_t{
ОтветитьУдалитьunsigned char logical_outputs; // логические выходы, состояние 7 выходов записано побитно
unsigned char logical_inputs; // логические входы, состояние 7 входов записано побитно
unsigned char ADC_DATA;
unsigned int PWM1;
unsigned int PWM2;
} ;
Здраствуте!
ОтветитьУдалитьПодскажите пожалуйста!
У меня программатор ponyprog схема на LPT(5-проводков)
можно ли на нем прошить?
На ponyprog какие фюзы надо ставит?
У меня кварц 16,368мгц а по схеме 16мгц подойдет ли?
Кто нибудь собрал прогу на дельфи? если есть поделитесь опытом !
Спасибо!
Сорри, но я понипрогом не пользуюсь, советую спросить на форуме по електронике.
ОтветитьУдалитьКварц нужен именно 16, другие работать не будут
Здравствуйте! Собрал сей ваш девайс, пока что только на макетной плате. В системе определяется, всё прошивается-с этим проблем нет. Но есть другая-при попытке установить первый раз на логическом выходе единичку, операция проходит успешно. Когда снимаешь галочку из чекбокса того же бита-светодиод гаснет, тут вроде бы как всё нормально, но если попытаться установить бит снова-то уже ничего не работает... Контроллер как бы "зависает" что ли, и уже не хочет ничего принимать и передавать на хост. Такая же ситуация и с логическими входами. При замыкании его на землю так же ничего не происходит, будто "повис", а нолик в программе на компе появляется только тогда, когда на плате контроллера нажимаешь RESET, не размыкая при этом лог. вход. Если же его разомкнуть, то в проге тоже ничего не изменится(не появляется единичка) до тех пор, пока снова не будет сброс контроллера. Подскажите, в чём тут может быть дело,пожалуйста, второй день голову ломаю. Вместо ATmega8 я применил ATmega8A. В инете нашёл инфу, что они практически идентичны за исключением того, что последняя меньше кушает и обладает улучшенными частотными хар-ками.
ОтветитьУдалитьДа, можно и это мк. Покажите фотки платы с обеих сторон
ОтветитьУдалитьа как мне это сделать? я не вижу тут на сайте каких либо кнопок, чтобы прикрепить файл
ОтветитьУдалитьЗагрузите на радикал и вставьте сюда.
ОтветитьУдалитьЯ спать, завтра отвечу
http://s018.radikal.ru/i504/1303/5c/80d758c6ce39.jpg
ОтветитьУдалитьhttp://s59.radikal.ru/i163/1303/44/1c46e3a2f9a5.jpg
Вот)
Промойте плату, тут же все контакты флюсом забиты, я вообще хз, как оно компом определилось так как на ножках кварца и линиях USB большая частота
ОтветитьУдалитьНе понял...Вы имеете в виду, что я D+ и D- к кварцу припаял что ли?
ОтветитьУдалитьРаспайка в точности по Вашей схеме, которую вы выкладывали, в DipTrace
ОтветитьУдалитья имею ввиду, что плату промыть надо
ОтветитьУдалитьhttp://s018.radikal.ru/i510/1303/20/f68d860fcc0c.jpg
ОтветитьУдалитьhttp://s019.radikal.ru/i614/1303/40/fdc9553f759b.jpg
Ну как то так) Последний растворитель истратил остатки, поэтому местами канифоль осталась, прошу извинить))
ОтветитьУдалитьпоковыряйте чем то между контактов, ато там флюс остался. Потом промойте плату щеткой с мылом под горячей водой
ОтветитьУдалитьhttp://s019.radikal.ru/i607/1303/86/65788321911f.jpg
ОтветитьУдалитьтак лучше)) Теперь заработало?
ОтветитьУдалитьнеа
ОтветитьУдалитьтакая же фигня, что и была
ОтветитьУдалитьhelp me please)
ОтветитьУдалитьНужно еще чтобы стабилитроны стояли прямо на дорожке между резистором и usb разъемом. Если поставить слишком далеко, то иногда не работает.
ОтветитьУдалитьПишите через Reply, иначе буду удалять комменты
а какова их роль? почему именно на 3,6 вольта?
ОтветитьУдалитьнапряжение на ножках мк 5В, а юсб надо 3,3, вот стабилитроны и понижают. Учитывая то время, которое у вас ушло на попытки запуска на макетке, я бы посоветовал собрать на нормальной плате
ОтветитьУдалитьХорошо. Спасибо за помощь)
ОтветитьУдалитьЗдравствуйте ещё раз) Проблема была в стабилитронах) Поставил другие-всё заработало без зависонов) Убрал ШИМ выходы, на место свободных пинов добавил ещё 1 вход и 1 выход, дабы получить полноценную шину приема-передачи данных по 1 байту каждая) Написал свою программу для компа на Делфи, а то Ваша как-то с тормозами работает, да и в Делфи привычней) Спасибо за идею, задумка очень хорошая, респект))))
ОтветитьУдалитьP.S...У вас в статье ШИМ-выходы обозначены неверно.... 15 и 14 пин микросхемы на самом деле они, а не 17-18.
ОтветитьУдалитьизвиняюсь, опечатка вышла с 17-18))) ....а не 16-17(вот так)
ОтветитьУдалитьЗдравствуйте, сделал Ваш девайс, добавил только "штырьки" земли, для удобства подключения нагрузок. Подскажите пожалуйста про АЦП, Подставляю значение 60,перемычка 12-13, в фомулу "Напряжение_ИОН/255*результат_АЦП". 5/255*60=0.00033. Замерял пальчиковую батарейку 1.32В. Составил пропорцию 255=5/60=х х=1.27В. Можно ли мерить 12В, не изменяя схему?
ОтветитьУдалитьМожно. Поставьте на входе резисторный делитель. К примеру, если будет стоять делитель на 3, тогда результат измерения нужно умножить на 3
ОтветитьУдалитьДоброго времени суток.
ОтветитьУдалитьПриятно, когда создатель устройства поддерживает советами начинающих инженеров:)
Я как раз из таких)
я хочу сделать данный девайс.
Вопрос в следующем:
1) У Вас использованы SMD элементы в схеме. Что посоветуете: обычные резаки и кондеры или же лучше SMD?(есть паяльная станция, думаю с припайкой проблем не будет)
2) Для создания печатной платы каким методом пользуетесь обычно(фоторезист или просто утюг и лист с распечатанной схемкой?)
3) Для разводки схемы пользовались PCADом? Почему на схеме есть отличия в креплениях ножек ввода/вывода к МК. На печатке они с одной стороны, а в схематике по разные стороны? А! или в схематике просто ножки не по порядку! Тогда вопрос: при трассировке они станут как на реальном МК по порядку или что?
4)Конденсатор тот что мужду "землей" и питанием он электролитический?Сколько он емкостью поконкретне?
Вопрос уже был, я знаю, но вы ответили на него расплывчато("Кондер где то на 10-100 мкф").
5)У меня 2006 пикад. Если вас не затруднит можете ли вы скинуть библиотеку для атмеги8? В нэте ищу, не могу найти.
Благодарю за потраченное время! Чувствую, придется спрашивать много.
Извиняюсь за неграмотность, но все когда-то учатся;)
1. SMD лучше, так как занимают меньше места и не нужно сверлить дырки. Да и паяются легко обычным паяльником.
ОтветитьУдалить2. Я пользуюсь пленочным фоторезистом, в домашних условиях никаким другим методом лучше не получится. Да и первую плату сделал фоторезистом со второго раза (первая была для теста).
3. Схема и разводка в DipTrace. На схеме в разброс, так как на самом мк пины стоят не по порядку, а чем написано в статье.
4. Любой электролит на 10мкф и выше.
5. DipTrace все есть.
здравствуйте.
ОтветитьУдалитьнабор следующих моментов с которыми я столкнулся.
сейчас сходил в электронику и купил элементы.
1)Резисторы у вас на схеме 200 Ом(11 штук, кажется). в магазине были только на 220 Ом. Пойдут ли, или нужен номинал обязательно в 200 Ом?
2)Купил я эти элементы. Как теперь ориентироваться в библиотеках DipTrace для выбора конкретного элемента? Пример: есть резистор "222"=2,2 кОм. Как найти нужный элемент в библиотеке?
И еще резонатор "16,0RG9-2G".
3)Есть микроконтроллер ATMega 8-16PU. Подойдет? и вопрос касательно его. В статье на сайте у Вас написано "В качестве микроконтроллера возьмем широко распространенный ATmega8 (без индекса L в конце). ". в схеме у Вас как я понял взят элемент "ATmega8L-8PC". Так вот, если корпус один и тот же и номера/названия ножек совпадают, то есть ли разница в выбранном элементе? если есть, то какой элемент нужен для "ATMega 8-16PU".
4)Какой элемент из библиотеки USB розетка?(в библиотеке USB я такого не нашел. Если это самодельный, то не скажите корпус для него?)
ТО же самое касательно "Кнопки reset" и штук, в которые группируются вводы/выводы для внешних устройств(те что по 4, 5, 3 и 2 вывода.)
Очень благодарен за помощь.
1. Можно 220, разницы нет.
ОтветитьУдалить2. В DipbTrace PCB Layout справа есть список компонентов, выбираете нужный вам и кликаете по нему, после чего он отобразится на плате.
3. ATMega8-16PU подойдет.
4. USB есть в библиотеке, я оттуда брал, скачайте последнюю версию диптрейка. Еще можно правым кликом по компоненту на схеме сохранить его в библиотеку
здравствуйте.
ОтветитьУдалить1) на какой частоте программировать?16 МГц?
2) как я понял надо при программировании иметь .hex файл и его указать при программировании через стк500.
3) программируем повышенным напряжением, получается?
4) на схеме стабилитроны на 3,6В. Имеются в наличии стабилитроны "КС 133 А"(3,3В). Я думаю, это не так трагично? Просто 3,6 ваще нигде нет.
5) На всякий случай, даже при условии что 3,3 подойдут напишите марку стабилитронов на 3,6, пожалуйста.
спасибо)
1) Без разницы, какая будет в программе установлена, той и програмирйте.
ОтветитьУдалить2) Да.
3) Повышенным не надо. Программируйте обычным по SPI.
4) Ножка МК может не выдержать такого тока.
5) Просто в магазине спросите стабилитроны на 3,6В.
расскажите процесс создания bootloadera, т.е. как переделать его для другого контроллера, например мега88 (я увидел в библитеках USB при компиляции проекта определяется частота контроллера и максимально возможная 20 Мгц, вот и возникла идея заменить мегу8 на мегу88 и поставить кварц на 20 МГц)? Можно просто открыть проект bootload и изменить в настройках контроллер с меги8 на мегу88 и поставить частоту 20 МГц?
ОтветитьУдалитьв архиве есть проект бутлоадера и основной проект. Вам нужно установить в настройках проектов частоту и микроконтроллер, а в основном проекте еще и поменять названия регистров (смотрите AVR094)
ОтветитьУдалитьспасибо, все понятно, буду пробовать.
ОтветитьУдалитьДоброго дня!
ОтветитьУдалитьЕсть ряд вопросов по вашей разработке:
1. Программа USB Control каким-нибудь образом отображает установившуюся связь с микроконтроллером?
2. Можно ли написать аналог USB Control на Visual Basic?
3. Собрал устройство, прошил, компьютер нашел новое HID устройство, запустил USB Control - управление отсутствует, окно для вывода состояния входных данных чистое, поле вывода ADC так и осталось с меткой Label. Куда копать?
Спасибо.
1. Неа, но можете сделать на таймере.
ОтветитьУдалить2. Я на бейсике не пишу.
3. Походу, вы только бутлоадер прошили
3. Никак нет - прошил бутлоадер, с его помощью прошил USB_Control, все прошло как по маслу, циферки в окне бегали, комп устройство определил, все как на скринах.
ОтветитьУдалитьОднако программа не реагирует на контроллер.
Поэтому и вопрос: почему нет диагностики обмена между программой и контроллером, какой-нибудь индикатор предусмотреть. Помигать выходом на контроллере пару секунд.
Эх, придется залазить в прошивку и программу...
Дома тестировал устройство на Win-7-64 - не работает.
ОтветитьУдалитьПришел на работу - Win-XP-32 - работает.
Ваша программа ОС-зависима?
насколько знаю, то у некоторых юзеров работает и на 64. Я специально использовал HID, чтобы не было зависимости от платформы
ОтветитьУдалитьСпасибо, буду копать дальше.
ОтветитьУдалитьУстановлю С++ Builder, попробую модернизировать вашу программу (изменить внешний вид и сделать 10 выходов).
В планах - сделать какие-нибудь алармы, оповещения на срабатывание логических входов и, возможно, реакцию на них логических выходов.
Кстати, где на http://forum.eldigi.ru/ было обсуждение вашего устройства?
ОтветитьУдалитьээээ, а хз, я не видел)))
ОтветитьУдалитьЛадно, фиг с ним, с форумом. На вашей (данной) страничке весьма обстоятельное обсуждение, я уже почерпнул массу полезного.
ОтветитьУдалитьВы вообще отличаетесь обстоятельностью - исключительно подробно описываете свои проекты! И практически всегда отвечаете на вопросы чайников.
Вот еще один вопрос от чайника в C++ Builder: компилятор я скачал и установил, что нужно сделать с вашим проектом, чтобы получить полноценное приложение? спасибо.
С Праздником Победы!
Открыть файл *.cbproj и нажать Shift+F9
ОтветитьУдалитьKibermaster
ОтветитьУдалитьПодскажите, плиз, в какой версии С++ Builder вы компилировали ваш проект?
Дело в том, что С++ Builder ver.6 при выполнении команды Build Project (USB Control.cbproj) создает совершенно пустой ехе файл,
если предварительно выполнить команду Add to Project добавив в проект main.cpp и USB Control.cpp, выполнение команды заканчивается с ошибками:
[C++ Error] main.h(10): E2209 Unable to open include file 'ButtonGroup.hpp'
[C++ Error] main.cpp(9): E2209 Unable to open include file '../MCU/USB_Control/usbdrv/usbconfig.h'
[C++ Error] main.cpp(30): E2451 Undefined symbol 'USB_CFG_VENDOR_NAME'
[C++ Error] main.cpp(30): E2040 Declaration terminated incorrectly
[C++ Error] main.cpp(30): E2190 Unexpected }
[C++ Error] main.cpp(30): E2190 Unexpected }
[C++ Error] main.cpp(31): E2451 Undefined symbol 'USB_CFG_DEVICE_NAME'
[C++ Error] main.cpp(31): E2040 Declaration terminated incorrectly
[C++ Error] main.cpp(31): E2190 Unexpected }
[C++ Error] main.cpp(31): E2190 Unexpected }
Если будет время, дайте подсказку, что нужно поправить.
Спасибо.
Нужен С++ builer 2010 (по-мойму, этот http://rutracker.org/forum/viewtopic.php?t=2147307)
ОтветитьУдалитьOk.
ОтветитьУдалитьУстановил билдер 2010 по вашей ссылке, все заработало. Спасибо.
ОтветитьУдалитьБуду разбираться, почему Win7/64 не желает работать с устройством.
Обратил внимание, WinXP при установке устройства распознает его как "USB Control", Win7/64 как неизвестное USB HID устройство, но с правильными ID.
Спасибо за статью! Очень помогла, всё работает..
ОтветитьУдалитьТолько не смог скомпилить код контроллера, нужно же и в своей проект (атмега16) всунуть эту штуку..
Эдитор: AVR Studio 6.
Сначала были ошибки (как выяснилось связанные со старой версией эдитора на котором оно создавалось..) типа таких:
usbdrv/usbdrv.h:455:6: error: variable 'usbDescriptorDevice' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
usbdrv/usbdrv.h:461:6: error: variable 'usbDescriptorConfiguration' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
и т. д. Исправилось добавлением const перед всеми: char usbDescriptorHidReport[]; char usbDescriptorString0[]; и так далее где выдавало ошибку..
Но теперь выдает ошибку которую при всем моем умении программировать не удалось устранить..
Error 1 undefined reference to `usbPoll'
Error 2 undefined reference to `usbInit'
Error 3 ld returned 1 exit status
Функции вызываются в коде так:
1) if (CheckBit(tasks,0)) usbPoll();
2) usbInit();
Функции описаны в USB_Control\MCU\USB_Control\usbdrv\usbdrv.h (который я прикрепил к проекту) и выглядят так:
USB_PUBLIC void usbInit(void);
USB_PUBLIC void usbPoll(void);
Почему это пустые функции ничего не делающие? Теоретически тогда можно закомментировать где они вызываются..
Если изменить функции на:
USB_PUBLIC void usbInit(void)
{
}
то код компилируется, но устройство определяется компьютеру с ошибкой. (И почему то hex весит 2-3 кб а не 6 как Ваш.) (может AVR Studio адекватнее компилит)
Прошу Вашей помощи.
Еще нужно добавлять было строку #define F_CPU
Я установил
#define F_CPU 1600000UL
, не знаю правильно ли..
для начала, добавьте в опции линкера:
ОтветитьУдалить-D__PROG_TYPES_COMPAT__
-Wno-deprecated-declarations
Kibermaster, не знаю зачем оно, не помогло, но всё равно спасибо..
ОтветитьУдалитьPS. Всё. Скомпилилось. РАБОТАИТЬ! Оставлю пост как я исправлял, может кому тоже пригодится..
====================================================================================
А насчет своей ошибки я нашел проблему. Я не добавил в проект файл usbdrv.c. А он за собой еще кучу файлов тянет.
С этой ошибкой разобрался. Но появилась еще одна более сложная (или я чего не понимаю).
В файле usbdrv.c используется функция usbCrc16Append(&usbTxBuf[1], len);
ошибка:
Error 1 undefined reference to `usbCrc16Append'
линкер не находит тело функции.
UPD.
Пока писал нашел ошибку.
Я офигел и не до конца понимаю, но кажется к проекту еще ассемблерные коды подключаются..
Как только подключил главный- все пошло..
Только появилась ошибка
Error 1 #error "USB_CFG_CLOCK_KHZ is "USB_CFG_CLOCK_KHZ" not one of the supported non-crc-rates!"
Код:
#ifndef USB_CFG_CLOCK_KHZ
# ifdef F_CPU
# define USB_CFG_CLOCK_KHZ (F_CPU/1000)
# else
# error "USB_CFG_CLOCK_KHZ not defined in usbconfig.h and no F_CPU set!"
# endif
#endif
#if USB_CFG_CHECK_CRC
# if USB_CFG_CLOCK_KHZ == 18000
# include "usbdrvasm18-crc.inc"
# else
# error "USB_CFG_CLOCK_KHZ is not one of the supported crc-rates!"
# endif
#else
# if USB_CFG_CLOCK_KHZ == 12000
# include "usbdrvasm12.inc"
# elif USB_CFG_CLOCK_KHZ == 12800
# include "usbdrvasm128.inc"
# elif USB_CFG_CLOCK_KHZ == 15000
# include "usbdrvasm15.inc"
# elif USB_CFG_CLOCK_KHZ == 16000
# include "usbdrvasm16.inc"
# elif USB_CFG_CLOCK_KHZ == 16500
# include "usbdrvasm165.inc"
# elif USB_CFG_CLOCK_KHZ == 20000
# include "usbdrvasm20.inc"
# else
# error "USB_CFG_CLOCK_KHZ is not one of the supported non-crc-rates!"
# endif
#endif
Значение USB_CFG_CLOCK_KHZ как я выяснил- 0. Хотя в проекте установлено #define F_CPU 1600000
Я просто вручную выполнил код, поставив вместо него
# include "usbdrvasm16.inc"
И подключил все ассемблерные файлы который требовало.
Видимо #define F_CPU мало, и такое чувство что оно прописывается еще и в компиляторе (ходят слухи что в makefile).
Может кому нужно будет, выложу готовый проект для AVR Studio 6.
ОтветитьУдалитьhttps://www.dropbox.com/s/9krk2gc64h92gzo/AtMega8_USB_Control.rar?v=0mcn
Если частота кварца не 16мГц- в конце файла usbdrvasm.S изменить #include «usbdrvasm16.inc» на другую описанную ниже..
Если кто подскажет как автоматически настроить чтоб определяло (описано постом выше)- пишите)
Эти директивы стали нужны в одной с последних версий тулчейна при работе с программной областью.
ОтветитьУдалитьНа счет F_CPU, хз как в студии 6, но в патой в насттройках нигде даже поля не было, где его прописывать, приходилось указывать в каком нить файле.
Пробовал перенести программу с C++ Builder XE3 (2010) на C++ builder 6 (в котором удобнее работать) - не работает. В XE3 работает.
ОтветитьУдалитьЯ получаю пустую hid.GetConnectedDeviceName()
Может "hidlibrary.h" и "usbconfig.h" не хотят работать со старой версией билдера?
чем выше версия билдера, тем он глючнее, я в 2010 пишу, пробовал ХЕ2 и понял, что разработчики скоро станут банкротами. Сам помаленьку на Qt пересаживаюсь.
ОтветитьУдалитьВ «hidlibrary.h» и «usbconfig.h» нет никаких специфических функций, нужно искать где то в другом месте.
Не может в другом месте (я думаю).
ОтветитьУдалитьВ XE3 в Edit1 получаю значение hid.GetConnectedDeviceName(). В Builder6 нет.
В hidlibrary.h она описана как:
string GetConnectedDeviceName()
{
return m_HIDDeviceIdents[m_ConnectedDevice];
}
Как она там обрабатывается разобраться не могу, ибо векторы, нумспейсы, map'ы я не знаю.. Как вывести допустим значиение в String с этого .h файла я не знаю\не умею.
Ладно, если идей больше нету то на XE3 буду работать..
лучше на 2010, все, что после него сильно глючное
ОтветитьУдалить2010 упоротый конечно.. Куча лишних и не удобных приблуд.. После 2006-го куча нервов на этот уходит..
ОтветитьУдалитьТем не мение доработал программку с временными диаграммами http://s48.radikal.ru/i119/1306/eb/9c25ff0d3d7b.png
Kibermaster, помогите!
ОтветитьУдалитьСобрал на монтажке вроде правильно. Единственное - при неподключенном USB к компу с конденсатором который на USB источник питания коротило. Пришлось снять с платы кондер. Без него норм все.
1) Для чего нужен кондер и возможна ли работа без него?
Собрал, подключил, нажал ресет и комп определил устройство...
Попробовал бутлодер - нифига, вырубается сразу.
И после этого когда подключаю устройство в USB - комп вырубается. И теперь даже без кондера (на USB который) источник питания коротит(напряжение падает в 0).
2) Что-то случилось с мк?:( потому как в схеме я ничего не делал.
3) Можно ли это проверить? И можно ли перепрошить мк теперь таким же образом через STK500 ?
4) Питание платы должно быть на протяжении всего времени работы устройства или же после прошивки бутлодером оно питается от USB и источник питания не нужен более?
Нуждаюсь в помощи:(
1. Для сглаживания напряжения, без него будет коряво работать. Если комп вырубается, то что то вы припаяли не так))) Есть подозрения, что кондер подключен не правильно.
ОтветитьУдалитьПокажите фотку спаяной платы с обеих сторон
Разобрался с отключением - USB коротило. Вопрос решен.
ОтветитьУдалитьТеперь проблема в следующем: (прикладываю картинки)
http://s48.radikal.ru/i121/1306/17/47d6fad22fea.jpg
http://s45.radikal.ru/i107/1306/da/d54473abbced.jpg
http://s006.radikal.ru/i215/1306/39/01e514b1b81f.jpg
http://s60.radikal.ru/i170/1306/e5/69c70c4d1653.jpg
в чем может быть проблема? на XP вообще не обнаружился.
может ли быть что на компе чего-то не хватает установленного?
бутлоадер по-прежнему не шьет прогу, его сразу вышибает.
фото платы чуть позже скину.
ОтветитьУдалитькачество исполнения ужасное, если там что-то понятно будет...
первая плата, что поделать(
тогда что то опять не так. Покажи фотки платы и фьюзов.
ОтветитьУдалитьКакой файл прошивал?
MCU\usb_bootloader\ файл "main.hex" заливал через STK500 в мк.
ОтветитьУдалитьФьюзы устанавливал как у вас на принтскрине. Или я не про то говорю?(Вы спросили про фотки фьюзов)
Фото платы минут через 10
http://s019.radikal.ru/i609/1306/89/743de0117461.jpg
ОтветитьУдалитьhttp://s48.radikal.ru/i121/1306/a9/eb8a1673a4f8.jpg
http://s006.radikal.ru/i215/1306/3b/1d405cf54751.jpg
если нужно лучше качество - найду фотик нормальный.
http://s018.radikal.ru/i503/1306/9d/5aea9f841b42.jpg
ОтветитьУдалитьсверху
мда, я удивляюсь даже тому, что программатор его вообще видит после установки фьюзов. Кварц ооооочень далеко. Длина ножек от кварца к мк не более 1см. Да и стабилитроны коряво подключены. Советую вытравить нормальную плату
ОтветитьУдалить1)что вы имеете ввиду под фразой "программатор его вообще видит после установки фьюзов"?
ОтветитьУдалитькакой программатор?или имели ввиду что комп обнаруживает?
так, резонатор подвину ближе.
2)Думаете в нем может быть проблема?
4)а стабилитроны коряво в смысле неправильно или "некрасиво"?
проблема платы в том, что ее не делал ни разу, а времени маловато осталось на выполнение этой вещи:(
У меня такие же симптомы были на ноуте (unknown device), а на компе работало, и то не на всех портах.
ОтветитьУдалитьПросто переставь в другой порт.
2) Нельзя ставить кварц так далеко.
ОтветитьУдалить4) У меня первая плата получилась со второй попытки (фоторезист)
спасибо, но не помогло. пробовал во всех портах - не заработало. По-прежнему пишет что неизвестное:(
ОтветитьУдалитьперепаял - не помогло.
ОтветитьУдалитьподумал сделать на новой монтажке.
1) если устройство "плохо" но обнаруживается, значит ли это, что с прошивкой мк все нормально?(т.е. проблема схемотехническая)
2)все резисторы ввода/вывода не влияют ведь на работу самого устройства?(хочу спаять только необходимые элементы для прошивки через USB, если обнаружится "нормально")
...просто при прошивке мк через STK500 я прошивал на частоте 1 МГЦ.
ОтветитьУдалить3) Это ведь не принципиально(с учетом того что резонатор 16 Мгц)?
1мгц - это частота spi, а не мк. Я всегда прошиваю на стандартной.
ОтветитьУдалить1) 90% что на плате какие то баги.
2) Для проверки можно припаять только кварц с кондерами и usb с обвязкой(3 резика и 2 стабилитрона)
превышен лимит ответов, видимо)
ОтветитьУдалитьв общем - магия!
устройство определилось как "устройство ввода".
далее бутлодером прошил(циферки показались в командной строке)
далее отсоединяю ножку 1 от земли и нажимаю резет и ... ничего. нового хид устройства не обнаруживается:(
в чем может быть дело?(
наверно, не установлен фьюз BOOTSTR не установлен.
ОтветитьУдалитьPS: после подключения той ножки к земле нужно перезагрузить МК(или передернуть питание)
фьюз при прошивке я точно устанавливал(прошивал не в одиночку, да и при этом много раз перепроверял...)
ОтветитьУдалитьпогодите, алгоритм какой тогда?
1)бутлодаером прошил
2)отсоединить лог. выход 1 от земли и нажать ресет
3)?снова подключить ножку к земле?
...запутался:(help:(
и когда нужно передернуть питание?а главное - КАК?тупо выдернуть из USB?
Сначала пох на перемычку. Выставить фьюзы, прошить бутлоадер, отсоединить питание (можно просто отключить usb), подключить перемычку, включить питание, комп найдет новый HID, запустить bat, по окончанию прошивки убрать перемычку и передернуть питание.
ОтветитьУдалитьНапишу как делал я.
ОтветитьУдалитьВзял мк, вставил его в STK500, выставил фьюзы, прошил их. потом выбрал main.hex файл (MCU\usb_bootloader\) и прошил его.
Потом спаял плату. Вставил туда мк. Замкнул ножку 1 лог вывода на землю. Подключил к компу. Нажал ресет. Определилось как "устройство ввода".
В диспетчере до подключения:
(***)<--ссылка внизу.
http://s019.radikal.ru/i610/1306/6c/bb565acf5ae7.jpg
ID до:
http://s017.radikal.ru/i424/1306/47/c7243e33e3c2.jpg
Диспетчер после подключения:
http://s56.radikal.ru/i152/1306/99/3c7f90f840f8.jpg
ID после подключения:
http://s020.radikal.ru/i708/1306/74/ab8f62fceccf.jpg
После этого запустил файл в папке MCU\USB_Control\default\ "boot.bat".
Написал:
http://s001.radikal.ru/i195/1306/fa/0d5bdf930baf.jpg
если до этого все правильно, то тогда что дальше?
После этого я убираю ножку лог выхода 1 с земли и нажимаю ресет.
И изменений нет. В диспетчере такая же картина как и в (***).
Понимаю, что я ничего не понимаю в этом, но не сердитесь(
попробуйте Логический вход 1 подтянуть к питанию
ОтветитьУдалитьподтянуть к питанию - это значит подключить на плате в место, ближе к месту крепления провода 5V?
ОтветитьУдалитьтак, значит если у меня "boot.bat" файл прошился, то дальше что должно произойти?PID и VID должны встать как на картинке (vid_0010, pid_0001)?
1)стало быть, если они не меняются, а какие-то другие, то что это значит?
2)по адресу USB_Control\MCU\usb_bootloader тут находятся какие-то файлы "bootloadHID" и программка "upload". Зачем они?
3)по адресу USB_Control\PC\Debug экзешный файл для управления платкой?типа подключил устройство, запустил прогу и управляй ей? или же надо написать и откомпилить прогу самому на компе?
попробовал на своем устройстве готовый .exe - тщетно:(
подтянуть - значит соеденить с 5v резистором 2-10к
ОтветитьУдалить1. Значит, по какой то причине мк постоянно висит в режиме бутлоадера (он может это делать только если лог 1 равен 0).
2. не помню
3. exe готовый уже.
А можно выложить ваш проект с диаграммами или на почту tsp54 собака мейл.ру - буду весьма признателен!
ОтветитьУдалитьЗаметил еще одну штуку:
ОтветитьУдалитьhttp://s001.radikal.ru/i195/1306/fa/0d5bdf930baf.jpg <-- это то что у меня.
третья строчка не такая же как у вас:
http://kibermaster.net/wp-content/uploads/2011/08/Bootloader-flashing.gif
Это принципиально важно?
это нормальный процесс прошивки мк.
ОтветитьУдалитьуважаемый Kibermaster, мне интереснно - 1,5К резистор именно подключен к 6 ножке или к питанию как обычно это делается
ОтветитьУдалитьк 6, чтобы была возможность управлять дисконектом
ОтветитьУдалитьСпасибо огромное !
ОтветитьУдалитьПожалуй пару вопросов автору.
ОтветитьУдалить1) Зачем используется бутлоадер? Я так понимаю вшить какую-то информацию или настройку в МК. Так и не понял.
2) Почему когда я компилю свой код и вшиваю в МК то всё начинает СРАЗУ работать без бутлоадера и каких либо настроек, и к стати бутлоадер не работает (не видит устройство).
3) У меня подключен USBasp программатор (питание которого подключается с юсб к МК) и подключено это устройство. Получается контакты питания двух разных юсб между собой соединены. Это ничего страшного?
PS. Я безумно! удивлен как ПРОСТО можно добавить свою информацию в передаваемую (кроме АЦП, ШИМ, Входы, Выходы). Просто добавить в структуру (в которых я не очень шарю) свой элемент структуры (в программе в и прошивке МК) и всё! Всё работает!
PS. Большое спасибо за тутор. Будет чем заняться..))
1. Чтобы заливать основную прошивку без внешнего программатора (если будете модернезировать основную прошивку).
ОтветитьУдалить2. Можно прошить основную прошивку без бутлоадера. Не работает потому что что то не так сделали.
3. Контакты питания не соединены, только маса.
уважаемый Kibermaster, большая просьба если нетрудно то покажите пожайлуста какой вид будут иметь фьюзы в CodeBlaster или PonyProg
ОтветитьУдалитьС уважением arnold01
http://avr.roboforum.ru/calc.html?part=ATmega8
ОтветитьУдалитьВведите здесь HIGH и LOW фьюзы (они указаны в статье)
Спасибо огромное
ОтветитьУдалитьуважаемыый Kibermaster, извините за столь многочисленные вопросы но мне интересно - есть возможность повторения вашего устройства на Atmega48PA-Pu и если да то какие будут Ваши рекомендации
ОтветитьУдалитьС уважением arnol01
врятле туда влезет
ОтветитьУдалитьпо габаритам точно влезет, однако по техданным не знаю потому и спросил
ОтветитьУдалитья про размер прошивки
ОтветитьУдалить