Jump to content

Search the Community

Showing results for tags 'v-usb'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Вопрос-Ответ. Для начинающих
    • Песочница (Q&A)
    • Дайте схему!
    • Школьникам и студентам
    • Начинающим
    • Паяльник TV
    • Обсуждение материалов с сайта
    • Competition 2019
  • Радиоэлектроника для профессионалов
    • Световые эффекты и LED
    • Роботы и модели на ДУ-управлении
    • Автоматика
    • Самодельные устройства к компьютеру
    • Программное обеспечение
    • Автомобильная электроника
    • Системы охраны и наблюдения. Личная безопасность
    • Питание
    • Электрика
    • Промышленная электроника
    • Ремонт
    • Металлоискатели
    • Измерительная техника
    • Мастерская радиолюбителя
    • Сотовая связь
    • Спутниковое ТВ
    • КВ и УКВ радиосвязь
    • Жучки
    • Телефония и фрикинг
    • Высокое напряжение
    • Идеи и технологии будущего
    • Справочная радиоэлементов
    • Литература
    • Разное
  • Аудио
    • FAQ, Технологии и компоненты
    • Для начинающих
    • Источники звука
    • Предусилители, темброблоки, фильтры
    • Питание аудио аппаратуры
    • Усилители мощности
    • Акустические системы
    • Авто-аудио
    • Ламповая техника
    • Гитарное оборудование
    • Прочее
  • Микроконтроллеры
  • Товары и услуги
  • Разное
  • Переделки's ATX->ЛБП
  • Переделки's разные темы
  • Киловольты юмора's Юмор в youtube
  • Радиолюбительская доска объявлений exDIY's Надежность и группы продавцов

Blogs

There are no results to display.

There are no results to display.

Marker Groups

  • Пользователи форума

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


ICQ


Skype


Интересы


Город


Сфера радиоэлектроники


Оборудование

Found 4 results

  1. Доброго времени суток! Вот занялся связью AVR с компом по USB и как раз попались мне статьи с использованием HID и соответственно hidlibrary.h. Сделал устройство, описанное в статье http://cxem.net/comp/comp129.php, а оно, в свою очередь основывается на http://we.easyelectronics.ru/electro-and-pc/usb-dlya-avr-chast-2-hid-class-na-v-usb.html. Прошитый контроллер нормально определяется системой, показывает VID и PID, и даже готовый софт (в первой статье) нормально с ним взаимодействует. А вот написать свой софт не выходит... Обнаружилось, что функция int connect() // этой функцией будем подключаться к устройству { int i, n, res = 0; string exampleDeviceName = ""; exampleDeviceName += vendorName; exampleDeviceName += " "; exampleDeviceName += productName; n = hid.EnumerateHIDDevices(); for (i = 0; i < n; i++){ hid.Connect(i); if ( hid.GetConnectedDeviceName() == exampleDeviceName ){ res = 1; break; } } return res; } почему-то не хочет коннектиться. Выяснилось, что код if ( hid.GetConnectedDeviceName() == exampleDeviceName ){ res = 1; break; } нормально не отрабатывает, то есть hid.GetConnectedDeviceName() всегда возвращает пустую строку. Проверка подтвердила, что счетчик устройств не равен нулю, а в моем случае находит два устройства - мышку и подключенный контроллер. Кто-то сталкивался с такой проблемой? Почему функция не выводит названия устройств? Писал софт на С++ Builder 2007. Встречал заметки, что на билдер ставили какой-то апдейт, но я так понял что говорили о версии 6 и соответственно update 4. Пробовал установить эту версию (с апдейтом), однако результат компиляции софта был таким же. Система - Windows 7 SP1 x64
  2. Привет Товарищи! С новым годом!!! Наверно сейчас некоторые вспомнят как я уже задавал по этой теме множество вопросов. И наверно порядком надоел с ними. Но сейчас вопросов не будет! Хочу показать то что получилось у меня сделать изучая тему USB AVR. Надеюсь кому то пригодятся мои наработки или исходные коды. Индикатор загрузки ЦП Алгоритм простой. Программа на ПК получает данные о загрузки CPU и RAM. Преобразовывает это значение от 0 до 255 а затем отправляет данные в устройство. На программе присутствуют кнопки калибровки для удобной настройки и калибровки индикатора. Ползунком "Выборка" осуществляется изменение частоты опроса программой необходимых данных и отправка их в устройство. Ползунком "Подсветка" можно меня яркость подсветки Индикаторов. (Я установил тусклые светодиоды и толку от подсветки мало.) Позиции ползунков автоматически сохраняются при закрытии программы. Замечание по программе для ПК (для программистов). Опрос ЦП и отправка данных в устройство реализовано на таймере. Каждый раз как срабатывает таймер, программа подлагивает. Скорее всего это можно решить если вывести весь этот процесс в отдельный поток обработки. Но пока я не разобрался в этом. Usb Кнопка (8 кнопок) С кнопкой тоже всё просто. Программа делает запрос. МК отвечает какая кнопка нажата. При нажатии на кнопку в программе на ПК подсвечивается номер кнопки и выполняется действие для этой кнопки. Действие-Воспроизведение: Можно воспроизвести файл в формате WAV. Действие-Действие: Можно запустит программу или открыть папку. Кроме того поддерживается запуск с параметрами. С начала указываем ярлык до программы потом ставим символ ^ потом пишем параметры. Естественно всё сохраняется при закрытии программы. И подлагивание также присутствует как и в Индикаторе. Дополнительно уместился USB-hub. Думал так будет удобней если кнопка будет всегда возле руки. Дополнительное замечание по железу. Когда подключаем устройство хаб определяется но не определяется кнопка. В наушниках слышим постоянною перезагрузку устройства. Но потом спустя минуту появляется устройство кнопка. Скорее это связано с тем что при включении инициализируется хаб. А МК кнопки уже загрузилось! Вот и не состыковка. Хотя могу и ошибаться. После того как Кнопка появилась в диспетчере устройств всё работает как надо. Также процесс подключения можно ускорить воткнув флешку. И в заключении Программа для ПК написана на языке C# а программе visual studio 2012 express Статья по управлению устройством. Прошивка на МК написана в среде avr studio 6.2 Статья AVR и USB: это просто! USB CPU-RAM стрелочный индикатор.rar MultiButton.rar
  3. Всем привет! Разбираюсь с подключением AVR к USB с использованием библиотеки V-USB на стороне контроллера и средствами hid.dll на стороне винды. Идея сделать дебажный вывод (строк) на комп через USB. Покопавшись пару дней смог доставать сообщения из контроллера через GET_REPORT. Следущий этап - USB прерывания. Да, я знаю что USB это хост ориентированый протокол и то, что через Interrupt In можно прокачать только 8 байт. Поэтому когда мне необходимо отправить сообщение в сторону компа я посылаю "пустое" прерывание, которое сигнализирует хосту что неплохо было бы данные забрать. Код со стороны контроллера (интересные его части) typedef struct { uchar reportID; uchar msgLen; char message[30]; } debugMsg_t; const uchar DEBUG_INT_MSG_ID = 1; const uchar DEBUG_MESSAGE_ID = 2; const PROGMEM char usbHidReportDescriptor[] = { 0x06, 0x00, 0xff, // USAGE_PAGE (Generic Desktop) 0x09, 0x01, // USAGE (Vendor Usage 1) 0xa1, 0x01, // COLLECTION (Application) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) 0x75, 0x08, // REPORT_SIZE (8) // The message data 0x85, DEBUG_MESSAGE_ID, // REPORT_ID (2) 0x95, sizeof(debugMsg_t)-1, // REPORT_COUNT (31) - extra byte for ReportID 0x09, 0x00, // USAGE (Undefined) 0xb2, 0x02, 0x01, // FEATURE (Data,Var,Abs,Buf) // Interrupt (with no data inside) indicates that data is available at debugMsg_t report 0x85, DEBUG_INT_MSG_ID, // REPORT_ID (1) 0x95, 0x01, // REPORT_COUNT (7) - Fake 0x09, 0x00, // USAGE (Undefined) 0x81, 0x02, // INPUT (Data,Var,Abs) 0xc0 // END_COLLECTION }; static uchar idleRate; /* repeat rate for keyboards, never used for mice */ /*volatile*/ debugMsg_t messageToSend; volatile bool messageSent = true; static uchar interruptMsg[2]; usbMsgLen_t usbFunctionSetup(uchar data[8]) { usbRequest_t *rq = (usbRequest_t *)data; if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS) // HID class request { if(rq->bRequest == USBRQ_HID_GET_REPORT) // wValue: ReportType (highbyte), ReportID (lowbyte) { if(rq->wValue.bytes[0] == DEBUG_MESSAGE_ID) //switch the report ID { usbMsgPtr = (usbMsgPtr_t)&messageToSend; messageSent = true; return sizeof(messageToSend); } } else if(rq->bRequest == USBRQ_HID_GET_IDLE) { usbMsgPtr = (usbMsgPtr_t)&idleRate; return 1; } else if(rq->bRequest == USBRQ_HID_SET_IDLE) { idleRate = rq->wValue.bytes[1]; } else { } } else { // ignore vendor type requests, we don't use any } return 0; } void DebugMsg(const char * msg) { // Data is too large to be transferred via interrupt. So we prepare the data at messageToSend // and send fake interrupt so that host can retrieve the data via standard GetReport. strncpy(messageToSend.message, msg, sizeof(messageToSend.message)); messageToSend.msgLen = strlen(messageToSend.message); messageToSend.reportID = DEBUG_MESSAGE_ID; messageSent = false; while(!usbInterruptIsReady()) usbPoll(); interruptMsg[0] = DEBUG_INT_MSG_ID; usbSetInterrupt(interruptMsg, 2); while(!messageSent) { wdt_reset(); usbPoll(); if(!(PIND & (1<<PIND5)) && usbInterruptIsReady()) { usbSetInterrupt(interruptMsg, 2); } } } Код приема: int usbGetReport(usbDevice_t *device, int reportType, int reportNumber, char *buffer, int *len) { HANDLE handle = (HANDLE)device; BOOLEAN rval = 0; DWORD bytesRead; switch(reportType){ case USB_HID_REPORT_TYPE_INPUT: buffer[0] = reportNumber; rval = ReadFile(handle, buffer, *len, &bytesRead, NULL); if(rval) *len = bytesRead; break; case USB_HID_REPORT_TYPE_OUTPUT: break; case USB_HID_REPORT_TYPE_FEATURE: buffer[0] = reportNumber; rval = HidD_GetFeature(handle, buffer, *len); break; } return rval == 0 ? USB_ERROR_IO : 0; } void MainWindow::on_receiveButton_clicked() { if(!handle) return; // Wait for the interrupt ui->logArea->append("\nWaiting for the interrupt"); char intMsg[2]; int len = 2; int err = usbGetReport(handle, USB_HID_REPORT_TYPE_INPUT, DEBUG_INT_MSG_ID, intMsg, &len); if(err) { ui->logArea->append(QString("Error code %1, last error %2").arg(err).arg(GetLastError())); return; } ui->logArea->append(QString("Received interrupt %1 bytes").arg(len)); debugMsg_t msgBuf; len = sizeof(msgBuf); msgBuf.reportID = DEBUG_MESSAGE_ID; ui->logArea->append("\nGetting the data"); err = usbGetReport(handle, USB_HID_REPORT_TYPE_FEATURE, DEBUG_MESSAGE_ID, (char*)&msgBuf, &len); ui->logArea->append(QString("Received %1 bytes").arg(len)); ui->logArea->append(QString("Error code %1, last error %2").arg(err).arg(GetLastError())); ui->logArea->append(QString::fromLatin1(msgBuf.message, msgBuf.msgLen)); } Проблема №1 Первый вызов usbGetReprot (который внутри вызывает ReadFile) виснет, не смотря на то, что прерывание со стороны контроллера ушло. После того как я один раз с помощью кнопки на плате контроллера посылаю дополнительное прерывание (строка if(!(PIND & (1<<PIND5)) && usbInterruptIsReady())) все начинает работать как надо. Зачем нужно дополнительное прерывание? Проблема №2 Не могу сделать пустое прерывание. Т.е такое, которое состоит только из ReportID. ReadFile в этом случае никогда не развисает. Приходится таска дополнительный байт (соответственно посылать и принимать 2 байта) Где копать? ЗЫ Извините за код в столбик - это так он скопировался на сайт. Видимо табы глотаются
  4. Пишу прошивку для HID геймпада на V-USB. Как я должен отправлять данные о кнопках в компьютер: через usbFunctionSetup (usbFunctionRead) или usbSetInterrupt? В примерах на сайте почему-то используется и то и то. Помогите, пожалуйста, понять разницу. И как часто хост посылает setup message с просьюой получить репорт? Ногами не пинать, изучаю USB/V-USB первый день.
×
×
  • Create New...