Управление электрическими цепями через 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 ножки каждого порта почему то расположены в разброс, зато на самой плате будет выглядеть красиво))).

Печатная плата:



Ну и в результате получилось вот что:


Теперь разберемся что куда будем подключать:)

  1. USB - Порт. Думаю его все знают.

  2. Индикатор питания.

  3. Кнопка сброса (перезагрузка).

  4. Логический вход 1.

  5. Логический вход 2.

  6. Логический вход 3.

  7. Логический вход 4.

  8. Логический вход 5.

  9. Логический вход 6.

  10. Логический вход 7.

  11. Вход АЦП.

  12. Вход для подключения ИОН.

  13. Этот контакт подключен к питанию устройства. Замкните перемычкой 12 и 13 контакты чтобы напряжение ИОНа было равно напряжения питания.

  14. Логический выход 1.

  15. Логический выход 2.

  16. ШИМ выход 1.

  17. ШИМ выход 2.

  18. Логический выход 3.

  19. Логический выход 4.

  20. Логический выход 5.

  21. Логический выход 6.

  22. Логический выход 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 должно выглядеть так:

Если вы пользуетесь другой программой, то можете просто ввести значения фьюз-битов HIGH и LOW (смотрите на скрин).

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

Такс, теперь в папке MCU\USB_Control\default\ запускаем файл boot.bat, должно выскочить окошко, в котором будут бегать циферки:

Если окно сразу же закрылось, тогда вы сделали что то не правильно. Если же все ок, тогда внешний программатор для этого устройства Вам уже не понадобится. Теперь можете отключить Логический вход 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". Вот скрин:

Под этим листбоксом отображается результат преобразования АЦП. Замкните вход АЦП на минус, тогда результат будет равен 0, замкните на + питания, результат будет 255. Можно подключить сюда потенциономер, или еще что. Напряжение на ножке АЦП можно вычислить по формуле: Напряжение_ИОН/255*результат_АЦП.

Теперь подключите какую то маленькую нагрузку к Логическом выходу 1 (светодиод или просто вольтметр). Поставьте галочку возле "Лог. выход 1" - светодиод загорится.

Подключите вольтметр к первому ШИМ каналу, покрутите ползунок - напряжение будет меняться.

Завершение.


Теперь можете сделать на основе этого модуля управление освещением или ще какими о электроприборами. К логическим входам можно подключить кнопку дверного звонка или какой то другой ключ. К входу АЦП можете подключить аналоговый датчик влажности, термодатчик или фоторезистор (будете занать, ночь на улице или день)))).

Вопросы задавайте в коментах.

Приобрести устройство можно в нашем интернет-магазине
Скачать файлы статьи.

Комментарии

  1. Здраствуйте! Пытаюсь собрать данный модуль, прошил МК, собрал на макетной плате схему, но компьютер почему то отказывается его видеть!=( ничего не могу с этим сделать! Подскажите пожалуйста, как проверить прошивку микроконтроллера, потому что после установки фьюзов программатор не видит его!

    ОтветитьУдалить
  2. Это потому, что вы неправильно фьюзы установили. Какие именно фьюзы меняли?

    ОтветитьУдалить
  3. С устройством разобрался! Все работает. Но вот не получается сделать передачу от АЦП в 10 разрядов. Подскажите пожалуйста!=) Заранее благодарен!

    ОтветитьУдалить
  4. там всеравно в двух битах мусор

    ОтветитьУдалить
  5. мне нужно организовать 10 битную передачу от АУП. Это что нельзя сделать?

    ОтветитьУдалить
  6. Можно, но точность будет на уровне 8-бит

    ОтветитьУдалить
  7. а как можно узнать параметры элементов схемы или их марку - диоды и конденсатор возле USB-разъема не расписаны

    ОтветитьУдалить
  8. то не диоды а стибилитроны. Кондер где то на 10-100 мкф

    ОтветитьУдалить
  9. Замечательное устройство, собрал = работает!
    Расскажите пожалуйста, как работать с Вашим устройством в Linux?

    ОтветитьУдалить
  10. а я хз, я под винду пишу))))

    ОтветитьУдалить
  11. Заменить Atmega8 на Atmega8515 представляется возможным?

    ОтветитьУдалить
  12. лучше на 8535, там просто в настройках проекта выбрать нужный микроконтроллер

    ОтветитьУдалить
  13. Atmega8515 лежит пылится хочется задействовать.
    Немного другие порты и их больше.
    С какими проблемами столкнусь?

    ОтветитьУдалить
  14. да проблем не будет. Я просто с 8515 никогда не работал)))))

    ОтветитьУдалить
  15. 1) Подойдет ли Atmega8А и надо ли менять что-то в проекте или можно заливать main.hex из архива как есть?
    1) В STK500 галочка во фъюзе означает, что пишем в него 1 или 0 как в PonyProg и AVRDUDE?
    Заранее спасибо, очень интересный проект!

    ОтветитьУдалить
  16. 1. Подойдет, менять ниего не надо.
    2. Да просто через аврстудию установите фьюзы как на скрине

    ОтветитьУдалить
  17. Здраствуйте! Хорошая информация очень нужная большое спасибо! Подскажите пожалуйста как выставить фьюзы в С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 где они я не нашол))))) в код висион.в диспечере устройств окончание идентефекатора другие числа наверное это нормально. Большое спасибо за ответ.

    ОтветитьУдалить
  18. вообще то, в статье написано, что для того, чтобы запустился бутлоадер (который в main.hex), нужно прижать лог.вход 1 к земле

    ОтветитьУдалить
  19. Условие логически вход1 =0 (третья ножка микросхемы на землю ) я выполняю а "в папке MCU\USB_Control\default\ запускаем файл boot.bat" окошко появляэтся кратковременно если это фюзы подскажите их инициализацию в окне СodеVisionAVR если можно, или что это может быть за неполадка. Спасибо.

    ОтветитьУдалить
  20. попробуйте просо прошить другой програмой, где можно задавать HIGH и LOW, я просто кодевиденом никогда не пльзовался, а программировал всегда через avr studio

    ОтветитьУдалить
  21. Да я думал об этом но у меня старый програматор STK200 (на LPT порт) Вчера скачал аврстудио там STK500,может в начальных версиях есть возможность STK200. Я понял что это всетаки фьюзи попробую с другой програмой. Спасибо!

    ОтветитьУдалить
  22. в ICC по-мойму можно задавать HIGH и LOW

    ОтветитьУдалить
  23. Здраствуйте. Скажите окошко с цыферками бегающими (запускаем файл boot.bat)если закривается через несколько секунд но цыферки бегают, это означает что все нормально или надо что бы оно вообще не закрывалось?

    ОтветитьУдалить
  24. это значит, что прошилось нормально. А вообще, чтобы было видней, откройте bat файл блокнотом и добавьте в конце "pause" (с новой строки)

    ОтветитьУдалить
  25. Спасибо! Движемся дальше) Может кому надо для CodeVision поставить фюзы то ставятся метки только возле: BOOTRST =0, BOOTSZ0=0, BOOTSZ1=0,а возле остальных полей ничего не ставится. Ещераз спасибо!

    ОтветитьУдалить
  26. Здраствуйте. Подскажите пожалуйста по возможности как устранить ошибки в програме при компиляции(редактор 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 соответственно, насколько велики масштабы изменения кода?
    Спасибо.

    ОтветитьУдалить
  27. этот код под с++ builder, а не Microsoft Visual с++.
    эти изменения внести можно, просто вместо 2 входов сделайте еще 2 выхода

    ОтветитьУдалить
  28. Здравствуйте, сделал это устройство с той лишь разницей, что atmega8 в tqfp корпусе и кварц на 12 МГц (на 16 в продаже не было). Соответственно, соединил лишние ножки 4,6 (vcc) и 3,5,21 (gnd), 19 и 22 остались невостребованными, остальные паял в соответствии с даташитом. Шьется внешним программатором "на ура", фьюзы поменял, как написано в инструкции (шил с помощью avrdude через ft232rl). Но после прошивки (либо bootloader'а с последующим замыканием входа 1 на gnd, либо напрямую usb_control.hex) в системе определяется как неизвестное usb устройство. Что мог сделать не так? (Все ноги и дорожки прозвонил)

    ОтветитьУдалить
  29. прошивка (бутлоадер и основная), расчитаны на частоту именно 16 мгц, на других работать не будут

    ОтветитьУдалить
  30. Ясно, не знал, тогда буду переделывать. Спасибо за ответ.

    ОтветитьУдалить
  31. Здравствуйте!
    Скажите пожалуйста, насколько адекватно работает это устройство, если их подключить большое количество (8-9 штук) через usb hub? И нету ли аналогов с бОльшим количеством входов/выходов/линий ШИМ и АЦП?

    ОтветитьУдалить
  32. дело в том, что для кождого устройства есть отдельный идентификатор, можно подкючить до 127 устройств, только для каждого должен быть свой идентификатор

    ОтветитьУдалить
  33. Спасибо за простое и доступное описание устройства!
    Я мало разбираюсь, поэтому не пинайте если спрашиваю глупость :)

    1) Reset кнопка не соединена с землей на плате, ее вроде развернуть надо?
    2) Я прошил МК и программатор (USBasp) больше его не видит. Это нормально?

    ОтветитьУдалить
  34. 1) Вообщето, она соединена с землей, на рисунках это хорошо видно.
    2) Конечно не нормально))) программатор должен его видеть.

    ОтветитьУдалить
  35. 1) Изучил как работает кнопка))) Действительно все ок ))
    2) Я имел ввиду после установки фьюзов. Полагаю изза установленного SPIEN, как на скрине.

    ОтветитьУдалить
  36. походу вы SPIEN отключили

    ОтветитьУдалить
  37. Обьязательно ли ставить бутлоадер в МК или можно залить основную прошивку без него через отдельный программатор? Какую роль выполняет бутлоадер?

    ОтветитьУдалить
  38. не обязательно. Он нужен, чтобы при перепрошивке не нужно было пользоваться внешним программатором

    ОтветитьУдалить
  39. Спасибо. Скажите, мне нужно немного переделать программу МК. Прием данных с компьютера осушествляется через прерывание "int" но я не смог найти каким образом происходит передача в ПК. В основном цыкле идет запись значений портов и АЦП в структуру но никакого намека на передачу данных, никакие функции передачи там не вызываются. Как именно и где происходит передача данных с структуры в USB?

    ОтветитьУдалить
  40. в коде прошивки естьтакая штука:
    if(rq->bRequest == USBRQ_HID_GET_REPORT){ // если комп запрашивает данные
    usbMsgPtr = (unsigned char*)&DeviceStatus; return USB_MESSAGE_LENGTH; // указываем на структуру

    ОтветитьУдалить
  41. Подскажите пожалуйста, реально ли переделать код прошивки под другую архитектуру МК (ARM)?

    ОтветитьУдалить
  42. И ещё какие основные файлы необходимы для создания прошивки (только для работы с USB)?

    ОтветитьУдалить
  43. ну, это придется основную часть переделывать.

    ОтветитьУдалить
  44. Я так понимаю придётся переделывать все дефайны? или только main.c?

    ОтветитьУдалить
  45. Т.е. все файлы которые лежат в папке usbdrv привязки к конкретному микроконтроллеру не имеют? и нужно переделывать только main.c?

    ОтветитьУдалить
  46. на других мк юсб совсем по другом сделан

    ОтветитьУдалить
  47. Я ипользую STM32F100RB на котором нет аппаратного USB. Вот я и хочу сфорганить чтобы он работал как HID устройство, а не как виртуальный сом-порт.
    По этому я и спрашиваю есть ли привязка тех инклудников, что в папке usbdrv, к конкретному МК. Я так... мельком просмотрел их, вроде никакой привязанности к Atmega8 я не увидел, хотя может я ошибаюсь

    ОтветитьУдалить
  48. там куча ассемблерских вставок, которые будут работать только на avr

    ОтветитьУдалить
  49. Каую версию AVRstudio использовали и нужны ли к ней специальные библиотеки?

    ОтветитьУдалить
  50. AVRstudio + тулчейн, больше ничего не нужно

    ОтветитьУдалить
  51. Здравствуйте. Если делать 10 выходов и только 4 входа,какие файлы надо будет изменять?

    ОтветитьУдалить
  52. main.c, который в папке USB control и main.ccp в папке PC?

    ОтветитьУдалить
  53. так я не понял, чтобы залить сначала main.hex, нужен другой программатор или это делается собранным по схеме?

    ОтветитьУдалить
  54. чтобы залить любой *.hex файл в микроконтроллер, нужен любой ISP программатор. Обычно программируется уже на собранном устройстве

    ОтветитьУдалить
  55. а какую программу для этого использовать?

    ОтветитьУдалить
  56. это в зависимости от того, какой программатор вы используете. Вообще, заливка прошивки в AVR очень хорошо описана в инете

    ОтветитьУдалить
  57. у меня плата, что приведена на здесь схеме
    я так понял, ее можно использовать и для прошивки тоже, или нет?

    ОтветитьУдалить
  58. да, можно программировать микроконтроллер прямо на этой плате. Вам нужно подключить к ней сигналы MOSI, MISO, SCK, RESET и GND от программатора, первые три выведены справа на штыри

    ОтветитьУдалить
  59. так все-таки программатор иметь нужно?
    из статьи я понял, что плата заменяет внешний программатор

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

    ОтветитьУдалить
  61. Борис Кравченко2 декабря 2012 г. в 04:48

    Здравствуйте! Тут http://chip.at.ua/index/upravlenie_vneshnimi_nagruzkami_cherez_usb_s_pomoshhju_ke_usb24a/0-18 описана схема подключения 24-х светодиодов.
    1) Скажите пожалуйста, есть ли подобный микроконтроллер, который бы управлял 80-ю светодиодами, причем каждым отдельно?
    2) Можноли как нибудь соединить в параллель два микроконтроллера и тем самым увеличить количество выходов для управления?

    ОтветитьУдалить
  62. если нужно больше выходов, то можно использовать микроконтроллер с большим количеством ножек (мега8535, мега128 и т.д.), или же, использовать блок сдвиговых регистров 595. Как по мне, предпочтительней второй вариант

    ОтветитьУдалить
  63. Борис Кравченко2 декабря 2012 г. в 10:17

    Далековат я пока от всего этого, только пытаюсь вникнуть. 1)А сколько выходов у ATMega8535?
    2)Изменится ли схема по сравнению с той что приведена выше? 3)Появилась идейка сделать светомузыку из 80-ти светодиодов, нужно чтобы на каждый LED можно было подать питание отдельно от остальных. Чтобы программно можно было описать время горения и интервалы между зажиганием светодиода. Возможно ли выполнить такое с помощью ATMega8535?

    ОтветитьУдалить
  64. у ATMega8535 по-мойму 40 ног, схема, конечно, поменяется.
    3) лучше мега8 + 74HC595

    ОтветитьУдалить
  65. Борис Кравченко2 декабря 2012 г. в 13:10

    Тогда нужно два микроконтроллера по 40 ног, их можно в одну схему запаять, чтобы через один порт подавать на них управление? У мега8 + 74НС595 сколько ног? Ну и вобщемто похоже все равно не решит это проблему, т.к. нет схем у меня на эти микроконтроллеры. Но все равно, хотелосб бы услышать ответы, может быть это меня приблизит к цели хоть на немного )

    ОтветитьУдалить
  66. почитайте в инете, как подключить 595 к атмеге. У 595 есть 8 выхдов и эти микры можно соединять параллельно, можно хоть и 1000 выходов сделать.

    ОтветитьУдалить
  67. Борис Кравченко2 декабря 2012 г. в 22:55

    Ок, вариант, спасибо!

    ОтветитьУдалить
  68. Здравствуйте, есть желание собрать сей девайс, но при по пытке открытия файла печатки в DipTrace выдаёт ошибку , изменение графического режима не помогает. Как исправить эту проблему?

    ОтветитьУдалить
  69. 90% что у вас старая версия, скачайте последнюю

    ОтветитьУдалить
  70. Здравствуйте, для тех кому мало 1го АЦП или 8ми входов выходов, есть возможность подключить 2 и более таких устройств и управлять ими из одной программы (ХОСТа), что и было реализовано мною на практике. Делается это очень просто, если интересно, то спрашивайте, по мере возможности подскажу.
    А теперь вопрос к автору: Какая максимальная частота опроса данного USB устройства, т.е. с какой максимальной частотой мы можем получать и передавать актуальные данные по USB на устройство?

    ОтветитьУдалить
  71. Точно не скажу, но 3 раза в секунду точно можно. Максимальная частота опроса сильно зависит от загруженности МК

    ОтветитьУдалить
  72. Здравствуйте, пара вопросов:
    1. Можно ли купить готовый девайс или хотя бы плату к нему в Киеве?
    2. Реально ли без "глубокого погружения" в программирование самому написать программу для управления устройством с помощью обычного usb-геймпада, или это слишком сложно?

    ОтветитьУдалить
  73. 1. Сорри, но последний девайс месяц назад продал, если сильно надо, то могу в течении двух недель собрать.
    2. Лучше какой нить обычный геймпад (от денди/сони) подключить к мк, у него интерфейс spi

    ОтветитьУдалить
  74. Нужно собрать систему дистанционного управления. Предполагается, что с одного ноута (идеально - с помощью чего-то вроде геймпада, для удобства, но можно и с клавиатуры) через вайфай и другой ноут управляем юсб-устройством:

    (геймпад) - ноут ->>>>>- ноут - юсби_девайс

    Команды управления подавать надо достаточно часто, посему нажимать мышкой на кнопки/чекбоксы на экране не вариант.

    Посему хотелось бы купить само устройство или даже два, т.к. нужно передавать более 10 команд. Срочности особой нет, вопрос - какова цена?
    Плюс не помешала бы помощь в программировании вышеуказанной связки - ессно, небесплатная.

    ОтветитьУдалить
  75. ну, пример управления входами/выходами есть в статье, как на С++ работать с геймпадом написано в инете(насколько помню, это не сложно).
    На счет устройств, напишите мне на имейл admin@kibermaster.net

    ОтветитьУдалить
  76. Где можно поменять надпись Лог.выход? Никак не могу найти.

    ОтветитьУдалить
  77. там прямо в свойствах компонента

    ОтветитьУдалить
  78. Поменял текст Лог.вход, а где Лог.выход не найти ( в свойствах не найти. Может не там ищу.

    ОтветитьУдалить
  79. Хочу сделать 4 входа и 10 выходов. Можете подсказать что надо поменять в прошивки микропроцессора и какую лучше использовать программу? Спасибо заранее.

    ОтветитьУдалить
  80. советую немного подучить программирование, а там и вопрос отпадет))

    ОтветитьУдалить
  81. Хорошо, но не понимаю почему avr studio выкидывает usbdrv/usbdrv.h: No such file or directory если этот файл есть.

    ОтветитьУдалить
  82. я так понял, вы в проекте что то переделали? Тогда не забудьте добавить в линкер папку usbdrv (через Configuration)

    ОтветитьУдалить
  83. Я поменял пины для линий входа/выхода. добавил в древо проекта файлы (AVR STUDIO 5.0 справа окно), но всё равно ошибка

    ОтветитьУдалить
  84. в студии 5 либа usb не кмпилируется

    ОтветитьУдалить
  85. Разобрался, но не меняя ничего в коде выкидывает ошибку 'for' loop initial declaration used outside C99 mode

    ОтветитьУдалить
  86. ничего не меняя, оно бы работало, но вы как то отключили поддержку C99. В конфиге должна быть опция -std=c99

    ОтветитьУдалить
  87. Последний вопрос ) добавил 3 выхода вместо 3 входов, и в проге для компа, на некоторых выходах галочка проподает сразу после нажатия. Менял PORT и DDR

    ОтветитьУдалить
  88. я так понимаю где то ещё надо дефинировать выходы

    ОтветитьУдалить
  89. Я просто хз что именно вы там переделали)))

    ОтветитьУдалить
  90. 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 соответственно. и всё

    ОтветитьУдалить
  91. еще нужно сделать, чтобы на комп передавалось не 7, а 10

    ОтветитьУдалить
  92. в прошивке мк и коде программы пк

    ОтветитьУдалить
  93. а можете подсказать где именно?

    ОтветитьУдалить
  94. struct status_t{
    unsigned char logical_outputs; // логические выходы, состояние 7 выходов записано побитно
    unsigned char logical_inputs; // логические входы, состояние 7 входов записано побитно
    unsigned char ADC_DATA;
    unsigned int PWM1;
    unsigned int PWM2;
    } ;

    ОтветитьУдалить
  95. Здраствуте!
    Подскажите пожалуйста!
    У меня программатор ponyprog схема на LPT(5-проводков)
    можно ли на нем прошить?
    На ponyprog какие фюзы надо ставит?
    У меня кварц 16,368мгц а по схеме 16мгц подойдет ли?
    Кто нибудь собрал прогу на дельфи? если есть поделитесь опытом !
    Спасибо!

    ОтветитьУдалить
  96. Сорри, но я понипрогом не пользуюсь, советую спросить на форуме по електронике.
    Кварц нужен именно 16, другие работать не будут

    ОтветитьУдалить
  97. Здравствуйте! Собрал сей ваш девайс, пока что только на макетной плате. В системе определяется, всё прошивается-с этим проблем нет. Но есть другая-при попытке установить первый раз на логическом выходе единичку, операция проходит успешно. Когда снимаешь галочку из чекбокса того же бита-светодиод гаснет, тут вроде бы как всё нормально, но если попытаться установить бит снова-то уже ничего не работает... Контроллер как бы "зависает" что ли, и уже не хочет ничего принимать и передавать на хост. Такая же ситуация и с логическими входами. При замыкании его на землю так же ничего не происходит, будто "повис", а нолик в программе на компе появляется только тогда, когда на плате контроллера нажимаешь RESET, не размыкая при этом лог. вход. Если же его разомкнуть, то в проге тоже ничего не изменится(не появляется единичка) до тех пор, пока снова не будет сброс контроллера. Подскажите, в чём тут может быть дело,пожалуйста, второй день голову ломаю. Вместо ATmega8 я применил ATmega8A. В инете нашёл инфу, что они практически идентичны за исключением того, что последняя меньше кушает и обладает улучшенными частотными хар-ками.

    ОтветитьУдалить
  98. Да, можно и это мк. Покажите фотки платы с обеих сторон

    ОтветитьУдалить
  99. а как мне это сделать? я не вижу тут на сайте каких либо кнопок, чтобы прикрепить файл

    ОтветитьУдалить
  100. Загрузите на радикал и вставьте сюда.
    Я спать, завтра отвечу

    ОтветитьУдалить
  101. http://s018.radikal.ru/i504/1303/5c/80d758c6ce39.jpg
    http://s59.radikal.ru/i163/1303/44/1c46e3a2f9a5.jpg
    Вот)

    ОтветитьУдалить
  102. Промойте плату, тут же все контакты флюсом забиты, я вообще хз, как оно компом определилось так как на ножках кварца и линиях USB большая частота

    ОтветитьУдалить
  103. Не понял...Вы имеете в виду, что я D+ и D- к кварцу припаял что ли?

    ОтветитьУдалить
  104. Распайка в точности по Вашей схеме, которую вы выкладывали, в DipTrace

    ОтветитьУдалить
  105. я имею ввиду, что плату промыть надо

    ОтветитьУдалить
  106. http://s018.radikal.ru/i510/1303/20/f68d860fcc0c.jpg
    http://s019.radikal.ru/i614/1303/40/fdc9553f759b.jpg

    ОтветитьУдалить
  107. Ну как то так) Последний растворитель истратил остатки, поэтому местами канифоль осталась, прошу извинить))

    ОтветитьУдалить
  108. поковыряйте чем то между контактов, ато там флюс остался. Потом промойте плату щеткой с мылом под горячей водой

    ОтветитьУдалить
  109. http://s019.radikal.ru/i607/1303/86/65788321911f.jpg

    ОтветитьУдалить
  110. так лучше)) Теперь заработало?

    ОтветитьУдалить
  111. такая же фигня, что и была

    ОтветитьУдалить
  112. Нужно еще чтобы стабилитроны стояли прямо на дорожке между резистором и usb разъемом. Если поставить слишком далеко, то иногда не работает.
    Пишите через Reply, иначе буду удалять комменты

    ОтветитьУдалить
  113. а какова их роль? почему именно на 3,6 вольта?

    ОтветитьУдалить
  114. напряжение на ножках мк 5В, а юсб надо 3,3, вот стабилитроны и понижают. Учитывая то время, которое у вас ушло на попытки запуска на макетке, я бы посоветовал собрать на нормальной плате

    ОтветитьУдалить
  115. Хорошо. Спасибо за помощь)

    ОтветитьУдалить
  116. Здравствуйте ещё раз) Проблема была в стабилитронах) Поставил другие-всё заработало без зависонов) Убрал ШИМ выходы, на место свободных пинов добавил ещё 1 вход и 1 выход, дабы получить полноценную шину приема-передачи данных по 1 байту каждая) Написал свою программу для компа на Делфи, а то Ваша как-то с тормозами работает, да и в Делфи привычней) Спасибо за идею, задумка очень хорошая, респект))))

    ОтветитьУдалить
  117. P.S...У вас в статье ШИМ-выходы обозначены неверно.... 15 и 14 пин микросхемы на самом деле они, а не 17-18.

    ОтветитьУдалить
  118. извиняюсь, опечатка вышла с 17-18))) ....а не 16-17(вот так)

    ОтветитьУдалить
  119. Здравствуйте, сделал Ваш девайс, добавил только "штырьки" земли, для удобства подключения нагрузок. Подскажите пожалуйста про АЦП, Подставляю значение 60,перемычка 12-13, в фомулу "Напряжение_ИОН/255*результат_АЦП". 5/255*60=0.00033. Замерял пальчиковую батарейку 1.32В. Составил пропорцию 255=5/60=х х=1.27В. Можно ли мерить 12В, не изменяя схему?

    ОтветитьУдалить
  120. Можно. Поставьте на входе резисторный делитель. К примеру, если будет стоять делитель на 3, тогда результат измерения нужно умножить на 3

    ОтветитьУдалить
  121. Доброго времени суток.
    Приятно, когда создатель устройства поддерживает советами начинающих инженеров:)
    Я как раз из таких)
    я хочу сделать данный девайс.
    Вопрос в следующем:
    1) У Вас использованы SMD элементы в схеме. Что посоветуете: обычные резаки и кондеры или же лучше SMD?(есть паяльная станция, думаю с припайкой проблем не будет)
    2) Для создания печатной платы каким методом пользуетесь обычно(фоторезист или просто утюг и лист с распечатанной схемкой?)
    3) Для разводки схемы пользовались PCADом? Почему на схеме есть отличия в креплениях ножек ввода/вывода к МК. На печатке они с одной стороны, а в схематике по разные стороны? А! или в схематике просто ножки не по порядку! Тогда вопрос: при трассировке они станут как на реальном МК по порядку или что?
    4)Конденсатор тот что мужду "землей" и питанием он электролитический?Сколько он емкостью поконкретне?
    Вопрос уже был, я знаю, но вы ответили на него расплывчато("Кондер где то на 10-100 мкф").
    5)У меня 2006 пикад. Если вас не затруднит можете ли вы скинуть библиотеку для атмеги8? В нэте ищу, не могу найти.

    Благодарю за потраченное время! Чувствую, придется спрашивать много.
    Извиняюсь за неграмотность, но все когда-то учатся;)

    ОтветитьУдалить
  122. 1. SMD лучше, так как занимают меньше места и не нужно сверлить дырки. Да и паяются легко обычным паяльником.
    2. Я пользуюсь пленочным фоторезистом, в домашних условиях никаким другим методом лучше не получится. Да и первую плату сделал фоторезистом со второго раза (первая была для теста).
    3. Схема и разводка в DipTrace. На схеме в разброс, так как на самом мк пины стоят не по порядку, а чем написано в статье.
    4. Любой электролит на 10мкф и выше.
    5. DipTrace все есть.

    ОтветитьУдалить
  123. здравствуйте.
    набор следующих моментов с которыми я столкнулся.
    сейчас сходил в электронику и купил элементы.
    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 вывода.)

    Очень благодарен за помощь.

    ОтветитьУдалить
  124. 1. Можно 220, разницы нет.
    2. В DipbTrace PCB Layout справа есть список компонентов, выбираете нужный вам и кликаете по нему, после чего он отобразится на плате.
    3. ATMega8-16PU подойдет.
    4. USB есть в библиотеке, я оттуда брал, скачайте последнюю версию диптрейка. Еще можно правым кликом по компоненту на схеме сохранить его в библиотеку

    ОтветитьУдалить
  125. здравствуйте.
    1) на какой частоте программировать?16 МГц?
    2) как я понял надо при программировании иметь .hex файл и его указать при программировании через стк500.
    3) программируем повышенным напряжением, получается?
    4) на схеме стабилитроны на 3,6В. Имеются в наличии стабилитроны "КС 133 А"(3,3В). Я думаю, это не так трагично? Просто 3,6 ваще нигде нет.
    5) На всякий случай, даже при условии что 3,3 подойдут напишите марку стабилитронов на 3,6, пожалуйста.

    спасибо)

    ОтветитьУдалить
  126. 1) Без разницы, какая будет в программе установлена, той и програмирйте.
    2) Да.
    3) Повышенным не надо. Программируйте обычным по SPI.
    4) Ножка МК может не выдержать такого тока.
    5) Просто в магазине спросите стабилитроны на 3,6В.

    ОтветитьУдалить
  127. расскажите процесс создания bootloadera, т.е. как переделать его для другого контроллера, например мега88 (я увидел в библитеках USB при компиляции проекта определяется частота контроллера и максимально возможная 20 Мгц, вот и возникла идея заменить мегу8 на мегу88 и поставить кварц на 20 МГц)? Можно просто открыть проект bootload и изменить в настройках контроллер с меги8 на мегу88 и поставить частоту 20 МГц?

    ОтветитьУдалить
  128. в архиве есть проект бутлоадера и основной проект. Вам нужно установить в настройках проектов частоту и микроконтроллер, а в основном проекте еще и поменять названия регистров (смотрите AVR094)

    ОтветитьУдалить
  129. спасибо, все понятно, буду пробовать.

    ОтветитьУдалить
  130. Доброго дня!
    Есть ряд вопросов по вашей разработке:
    1. Программа USB Control каким-нибудь образом отображает установившуюся связь с микроконтроллером?
    2. Можно ли написать аналог USB Control на Visual Basic?
    3. Собрал устройство, прошил, компьютер нашел новое HID устройство, запустил USB Control - управление отсутствует, окно для вывода состояния входных данных чистое, поле вывода ADC так и осталось с меткой Label. Куда копать?

    Спасибо.

    ОтветитьУдалить
  131. 1. Неа, но можете сделать на таймере.
    2. Я на бейсике не пишу.
    3. Походу, вы только бутлоадер прошили

    ОтветитьУдалить
  132. 3. Никак нет - прошил бутлоадер, с его помощью прошил USB_Control, все прошло как по маслу, циферки в окне бегали, комп устройство определил, все как на скринах.
    Однако программа не реагирует на контроллер.

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

    Эх, придется залазить в прошивку и программу...

    ОтветитьУдалить
  133. Дома тестировал устройство на Win-7-64 - не работает.
    Пришел на работу - Win-XP-32 - работает.
    Ваша программа ОС-зависима?

    ОтветитьУдалить
  134. насколько знаю, то у некоторых юзеров работает и на 64. Я специально использовал HID, чтобы не было зависимости от платформы

    ОтветитьУдалить
  135. Спасибо, буду копать дальше.
    Установлю С++ Builder, попробую модернизировать вашу программу (изменить внешний вид и сделать 10 выходов).
    В планах - сделать какие-нибудь алармы, оповещения на срабатывание логических входов и, возможно, реакцию на них логических выходов.

    ОтветитьУдалить
  136. Кстати, где на http://forum.eldigi.ru/ было обсуждение вашего устройства?

    ОтветитьУдалить
  137. ээээ, а хз, я не видел)))

    ОтветитьУдалить
  138. Ладно, фиг с ним, с форумом. На вашей (данной) страничке весьма обстоятельное обсуждение, я уже почерпнул массу полезного.
    Вы вообще отличаетесь обстоятельностью - исключительно подробно описываете свои проекты! И практически всегда отвечаете на вопросы чайников.

    Вот еще один вопрос от чайника в C++ Builder: компилятор я скачал и установил, что нужно сделать с вашим проектом, чтобы получить полноценное приложение? спасибо.

    С Праздником Победы!

    ОтветитьУдалить
  139. Открыть файл *.cbproj и нажать Shift+F9

    ОтветитьУдалить
  140. 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 }

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

    Спасибо.

    ОтветитьУдалить
  141. Нужен С++ builer 2010 (по-мойму, этот http://rutracker.org/forum/viewtopic.php?t=2147307)

    ОтветитьУдалить
  142. Установил билдер 2010 по вашей ссылке, все заработало. Спасибо.
    Буду разбираться, почему Win7/64 не желает работать с устройством.
    Обратил внимание, WinXP при установке устройства распознает его как "USB Control", Win7/64 как неизвестное USB HID устройство, но с правильными ID.

    ОтветитьУдалить
  143. Спасибо за статью! Очень помогла, всё работает..
    Только не смог скомпилить код контроллера, нужно же и в своей проект (атмега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

    , не знаю правильно ли..

    ОтветитьУдалить
  144. для начала, добавьте в опции линкера:
    -D__PROG_TYPES_COMPAT__
    -Wno-deprecated-declarations

    ОтветитьУдалить
  145. 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).

    ОтветитьУдалить
  146. Может кому нужно будет, выложу готовый проект для AVR Studio 6.
    https://www.dropbox.com/s/9krk2gc64h92gzo/AtMega8_USB_Control.rar?v=0mcn
    Если частота кварца не 16мГц- в конце файла usbdrvasm.S изменить #include «usbdrvasm16.inc» на другую описанную ниже..

    Если кто подскажет как автоматически настроить чтоб определяло (описано постом выше)- пишите)

    ОтветитьУдалить
  147. Эти директивы стали нужны в одной с последних версий тулчейна при работе с программной областью.
    На счет F_CPU, хз как в студии 6, но в патой в насттройках нигде даже поля не было, где его прописывать, приходилось указывать в каком нить файле.

    ОтветитьУдалить
  148. Пробовал перенести программу с C++ Builder XE3 (2010) на C++ builder 6 (в котором удобнее работать) - не работает. В XE3 работает.

    Я получаю пустую hid.GetConnectedDeviceName()

    Может "hidlibrary.h" и "usbconfig.h" не хотят работать со старой версией билдера?

    ОтветитьУдалить
  149. чем выше версия билдера, тем он глючнее, я в 2010 пишу, пробовал ХЕ2 и понял, что разработчики скоро станут банкротами. Сам помаленьку на Qt пересаживаюсь.
    В «hidlibrary.h» и «usbconfig.h» нет никаких специфических функций, нужно искать где то в другом месте.

    ОтветитьУдалить
  150. Не может в другом месте (я думаю).
    В XE3 в Edit1 получаю значение hid.GetConnectedDeviceName(). В Builder6 нет.
    В hidlibrary.h она описана как:
    string GetConnectedDeviceName()
    {
    return m_HIDDeviceIdents[m_ConnectedDevice];
    }
    Как она там обрабатывается разобраться не могу, ибо векторы, нумспейсы, map'ы я не знаю.. Как вывести допустим значиение в String с этого .h файла я не знаю\не умею.
    Ладно, если идей больше нету то на XE3 буду работать..

    ОтветитьУдалить
  151. лучше на 2010, все, что после него сильно глючное

    ОтветитьУдалить
  152. 2010 упоротый конечно.. Куча лишних и не удобных приблуд.. После 2006-го куча нервов на этот уходит..
    Тем не мение доработал программку с временными диаграммами http://s48.radikal.ru/i119/1306/eb/9c25ff0d3d7b.png

    ОтветитьУдалить
  153. Kibermaster, помогите!

    Собрал на монтажке вроде правильно. Единственное - при неподключенном USB к компу с конденсатором который на USB источник питания коротило. Пришлось снять с платы кондер. Без него норм все.
    1) Для чего нужен кондер и возможна ли работа без него?
    Собрал, подключил, нажал ресет и комп определил устройство...
    Попробовал бутлодер - нифига, вырубается сразу.
    И после этого когда подключаю устройство в USB - комп вырубается. И теперь даже без кондера (на USB который) источник питания коротит(напряжение падает в 0).
    2) Что-то случилось с мк?:( потому как в схеме я ничего не делал.
    3) Можно ли это проверить? И можно ли перепрошить мк теперь таким же образом через STK500 ?
    4) Питание платы должно быть на протяжении всего времени работы устройства или же после прошивки бутлодером оно питается от USB и источник питания не нужен более?

    Нуждаюсь в помощи:(

    ОтветитьУдалить
  154. 1. Для сглаживания напряжения, без него будет коряво работать. Если комп вырубается, то что то вы припаяли не так))) Есть подозрения, что кондер подключен не правильно.
    Покажите фотку спаяной платы с обеих сторон

    ОтветитьУдалить
  155. Разобрался с отключением - 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 вообще не обнаружился.
    может ли быть что на компе чего-то не хватает установленного?
    бутлоадер по-прежнему не шьет прогу, его сразу вышибает.

    ОтветитьУдалить
  156. фото платы чуть позже скину.
    качество исполнения ужасное, если там что-то понятно будет...
    первая плата, что поделать(

    ОтветитьУдалить
  157. тогда что то опять не так. Покажи фотки платы и фьюзов.
    Какой файл прошивал?

    ОтветитьУдалить
  158. MCU\usb_bootloader\ файл "main.hex" заливал через STK500 в мк.
    Фьюзы устанавливал как у вас на принтскрине. Или я не про то говорю?(Вы спросили про фотки фьюзов)
    Фото платы минут через 10

    ОтветитьУдалить
  159. 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

    если нужно лучше качество - найду фотик нормальный.

    ОтветитьУдалить
  160. http://s018.radikal.ru/i503/1306/9d/5aea9f841b42.jpg
    сверху

    ОтветитьУдалить
  161. мда, я удивляюсь даже тому, что программатор его вообще видит после установки фьюзов. Кварц ооооочень далеко. Длина ножек от кварца к мк не более 1см. Да и стабилитроны коряво подключены. Советую вытравить нормальную плату

    ОтветитьУдалить
  162. 1)что вы имеете ввиду под фразой "программатор его вообще видит после установки фьюзов"?
    какой программатор?или имели ввиду что комп обнаруживает?
    так, резонатор подвину ближе.
    2)Думаете в нем может быть проблема?
    4)а стабилитроны коряво в смысле неправильно или "некрасиво"?
    проблема платы в том, что ее не делал ни разу, а времени маловато осталось на выполнение этой вещи:(

    ОтветитьУдалить
  163. У меня такие же симптомы были на ноуте (unknown device), а на компе работало, и то не на всех портах.
    Просто переставь в другой порт.

    ОтветитьУдалить
  164. 2) Нельзя ставить кварц так далеко.
    4) У меня первая плата получилась со второй попытки (фоторезист)

    ОтветитьУдалить
  165. спасибо, но не помогло. пробовал во всех портах - не заработало. По-прежнему пишет что неизвестное:(

    ОтветитьУдалить
  166. перепаял - не помогло.
    подумал сделать на новой монтажке.
    1) если устройство "плохо" но обнаруживается, значит ли это, что с прошивкой мк все нормально?(т.е. проблема схемотехническая)
    2)все резисторы ввода/вывода не влияют ведь на работу самого устройства?(хочу спаять только необходимые элементы для прошивки через USB, если обнаружится "нормально")

    ОтветитьУдалить
  167. ...просто при прошивке мк через STK500 я прошивал на частоте 1 МГЦ.
    3) Это ведь не принципиально(с учетом того что резонатор 16 Мгц)?

    ОтветитьУдалить
  168. 1мгц - это частота spi, а не мк. Я всегда прошиваю на стандартной.
    1) 90% что на плате какие то баги.
    2) Для проверки можно припаять только кварц с кондерами и usb с обвязкой(3 резика и 2 стабилитрона)

    ОтветитьУдалить
  169. превышен лимит ответов, видимо)

    в общем - магия!
    устройство определилось как "устройство ввода".
    далее бутлодером прошил(циферки показались в командной строке)
    далее отсоединяю ножку 1 от земли и нажимаю резет и ... ничего. нового хид устройства не обнаруживается:(
    в чем может быть дело?(

    ОтветитьУдалить
  170. наверно, не установлен фьюз BOOTSTR не установлен.
    PS: после подключения той ножки к земле нужно перезагрузить МК(или передернуть питание)

    ОтветитьУдалить
  171. фьюз при прошивке я точно устанавливал(прошивал не в одиночку, да и при этом много раз перепроверял...)

    погодите, алгоритм какой тогда?
    1)бутлодаером прошил
    2)отсоединить лог. выход 1 от земли и нажать ресет
    3)?снова подключить ножку к земле?
    ...запутался:(help:(
    и когда нужно передернуть питание?а главное - КАК?тупо выдернуть из USB?

    ОтветитьУдалить
  172. Сначала пох на перемычку. Выставить фьюзы, прошить бутлоадер, отсоединить питание (можно просто отключить usb), подключить перемычку, включить питание, комп найдет новый HID, запустить bat, по окончанию прошивки убрать перемычку и передернуть питание.

    ОтветитьУдалить
  173. Напишу как делал я.
    Взял мк, вставил его в 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 с земли и нажимаю ресет.
    И изменений нет. В диспетчере такая же картина как и в (***).

    Понимаю, что я ничего не понимаю в этом, но не сердитесь(

    ОтветитьУдалить
  174. попробуйте Логический вход 1 подтянуть к питанию

    ОтветитьУдалить
  175. подтянуть к питанию - это значит подключить на плате в место, ближе к месту крепления провода 5V?

    так, значит если у меня "boot.bat" файл прошился, то дальше что должно произойти?PID и VID должны встать как на картинке (vid_0010, pid_0001)?
    1)стало быть, если они не меняются, а какие-то другие, то что это значит?
    2)по адресу USB_Control\MCU\usb_bootloader тут находятся какие-то файлы "bootloadHID" и программка "upload". Зачем они?
    3)по адресу USB_Control\PC\Debug экзешный файл для управления платкой?типа подключил устройство, запустил прогу и управляй ей? или же надо написать и откомпилить прогу самому на компе?
    попробовал на своем устройстве готовый .exe - тщетно:(

    ОтветитьУдалить
  176. подтянуть - значит соеденить с 5v резистором 2-10к
    1. Значит, по какой то причине мк постоянно висит в режиме бутлоадера (он может это делать только если лог 1 равен 0).
    2. не помню
    3. exe готовый уже.

    ОтветитьУдалить
  177. А можно выложить ваш проект с диаграммами или на почту tsp54 собака мейл.ру - буду весьма признателен!

    ОтветитьУдалить
  178. Заметил еще одну штуку:
    http://s001.radikal.ru/i195/1306/fa/0d5bdf930baf.jpg <-- это то что у меня.
    третья строчка не такая же как у вас:
    http://kibermaster.net/wp-content/uploads/2011/08/Bootloader-flashing.gif
    Это принципиально важно?

    ОтветитьУдалить
  179. это нормальный процесс прошивки мк.

    ОтветитьУдалить
  180. уважаемый Kibermaster, мне интереснно - 1,5К резистор именно подключен к 6 ножке или к питанию как обычно это делается

    ОтветитьУдалить
  181. к 6, чтобы была возможность управлять дисконектом

    ОтветитьУдалить
  182. Спасибо огромное !

    ОтветитьУдалить
  183. Пожалуй пару вопросов автору.
    1) Зачем используется бутлоадер? Я так понимаю вшить какую-то информацию или настройку в МК. Так и не понял.
    2) Почему когда я компилю свой код и вшиваю в МК то всё начинает СРАЗУ работать без бутлоадера и каких либо настроек, и к стати бутлоадер не работает (не видит устройство).
    3) У меня подключен USBasp программатор (питание которого подключается с юсб к МК) и подключено это устройство. Получается контакты питания двух разных юсб между собой соединены. Это ничего страшного?

    PS. Я безумно! удивлен как ПРОСТО можно добавить свою информацию в передаваемую (кроме АЦП, ШИМ, Входы, Выходы). Просто добавить в структуру (в которых я не очень шарю) свой элемент структуры (в программе в и прошивке МК) и всё! Всё работает!
    PS. Большое спасибо за тутор. Будет чем заняться..))

    ОтветитьУдалить
  184. 1. Чтобы заливать основную прошивку без внешнего программатора (если будете модернезировать основную прошивку).
    2. Можно прошить основную прошивку без бутлоадера. Не работает потому что что то не так сделали.
    3. Контакты питания не соединены, только маса.

    ОтветитьУдалить
  185. уважаемый Kibermaster, большая просьба если нетрудно то покажите пожайлуста какой вид будут иметь фьюзы в CodeBlaster или PonyProg

    С уважением arnold01

    ОтветитьУдалить
  186. http://avr.roboforum.ru/calc.html?part=ATmega8
    Введите здесь HIGH и LOW фьюзы (они указаны в статье)

    ОтветитьУдалить
  187. уважаемыый Kibermaster, извините за столь многочисленные вопросы но мне интересно - есть возможность повторения вашего устройства на Atmega48PA-Pu и если да то какие будут Ваши рекомендации

    С уважением arnol01

    ОтветитьУдалить
  188. врятле туда влезет

    ОтветитьУдалить
  189. по габаритам точно влезет, однако по техданным не знаю потому и спросил

    ОтветитьУдалить
  190. я про размер прошивки

    ОтветитьУдалить

Отправить комментарий

Популярные сообщения из этого блога

Прием команд с пульта дистанционного управления

STM32F4. Обновление прошивки с карты памяти (Bootloader SD)

Работа с шиной 1-wire. Подключение термодатчика DS18B20 к AVR