USB-HID Джойстик Mega16

Обсуждаем контроллеры компании Atmel.
Ответить
b2soft
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Вт дек 06, 2011 19:11:09

USB-HID Джойстик Mega16

Сообщение b2soft »

Вобщем суть проблемы, написал я через v-usb небольшой код для игрового контроллера который должен поддерживать только кнопки. виндой определяется как джойстик с 8-ю кнопками как впрочем мне и нужно. но почему то не срабатывает нажатие. привожу куски кода

Код: Выделить всё


#define CHECKBIT(ADDRESS,BIT) (ADDRESS & (1<<BIT)) 

struct joy_report
{
	uint8_t buttons;
};


int __attribute__((noreturn)) main(void)
{
uchar   i;

    wdt_enable(WDTO_1S);
	DDRA=0x00;
	PORTA=0xFF;
    /* Even if you don't use the watchdog, turn it off here. On newer devices,
     * the status of the watchdog (on/off, period) is PRESERVED OVER RESET!
     */
    /* RESET status: all port bits are inputs without pull-up.
     * That's the way we need D+ and D-. Therefore we don't need any
     * additional hardware initialization.
     */
    odDebugInit();
    DBG1(0x00, 0, 0);       /* debug output: main starts */
    usbInit();
    usbDeviceDisconnect();  /* enforce re-enumeration, do this while interrupts are disabled! */
    i = 0;
    while(--i){             /* fake USB disconnect for > 250 ms */
        wdt_reset();
        _delay_ms(1);
    }
    usbDeviceConnect();
    sei();
    DBG1(0x01, 0, 0);       /* debug output: main loop starts */
    for(;;){                /* main event loop */
        DBG1(0x02, 0, 0);   /* debug output: main loop iterates */
        wdt_reset();
		if (!CHECKBIT(PORTA, 0))
			{
				reportBuffer.button1=0xff;
			}
			else
			{
				reportBuffer.button1=0x00;
			}
          
        usbPoll();
        if(usbInterruptIsReady()){
            /* called after every poll of the interrupt endpoint */
            DBG1(0x03, 0, 0);   /* debug output: interrupt report prepared */
            usbSetInterrupt((void *)&reportBuffer, sizeof(reportBuffer));
        }
    }
}
тоесть если на ноге 0 Порта А у нас нолик то все восемь кнопок должны быть нажаты и это должно быть отправлено в репорте. но не работает. может я что-то делаю не так?
Реклама
Аватара пользователя
servio
Родился
Сообщения: 19
Зарегистрирован: Пт окт 21, 2011 18:27:34
Откуда: Киев
Контактная информация:

Re: USB-HID Джойстик Mega16

Сообщение servio »

А можно еще, на всякий случай, глянуть на HID-дескриптор?
Реклама
b2soft
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Вт дек 06, 2011 19:11:09

Re: USB-HID Джойстик Mega16

Сообщение b2soft »

конечно можно

Код: Выделить всё

PROGMEM char usbHidReportDescriptor[28] =
{ /* USB report descriptor, size must match usbconfig.h */
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    0x09, 0x04,                    // USAGE (Gamepad)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x09, 0x01,                    //   USAGE (Pointer)
    0xA1, 0x00,                    //   COLLECTION (Physical)
    0x05, 0x09,                    //     USAGE_PAGE (Button)
    0x19, 0x01,                    //     USAGE_MINIMUM(Button1)
    0x29, 0x08,                    //     USAGE_MAXIMUM(Button8)
    0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
    0x25, 0x01,                    //     LOGICAL_MAXIMUM (1)
    0x95, 0x08,                    //     REPORT_COUNT (8)
    0x75, 0x01,                    //     REPORT_SIZE (1)
    0x81, 0x02,                    //     INPUT (Data,Var,Abs)
    0xC0,                          //   END_COLLECTION
    0xC0,   
	                                     // END_COLLECTION
};


может Hi-Z попробовать сделать? как думаете? хотя по идее подтяжку пробить всё равно должно
Аватара пользователя
servio
Родился
Сообщения: 19
Зарегистрирован: Пт окт 21, 2011 18:27:34
Откуда: Киев
Контактная информация:

Re: USB-HID Джойстик Mega16

Сообщение servio »

Итого, что мы имеем? Восемь репортов по одному биту, т.е. один байт. Следовательно объяви буфер reportBuffer не как структуру а просто как uint8_t. Там где reportBuffer.button1=0xff должно стать reportBuffer=0xff. Все остальное без изменений.

У меня был пример где в дескрипторе репортов было два по восемь битов. Я объявлял буфер как массив static uchar reportBuffer[2] , заполнял его данными и отправлял его usbSetInterrupt(reportBuffer, sizeof(reportBuffer)). И работает.
Реклама
Эиком - электронные компоненты и радиодетали
b2soft
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Вт дек 06, 2011 19:11:09

Re: USB-HID Джойстик Mega16

Сообщение b2soft »

сейчас надо уйти на два часа, как приду - обязательно попробую. просто структура была от примера hid-мышки из vusb. я решил не изменять уже. порпобую и отпишу что вышло. заранее спасибо
Реклама
b2soft
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Вт дек 06, 2011 19:11:09

Re: USB-HID Джойстик Mega16

Сообщение b2soft »

работает, только теперь вопрос такой, если поменялся уровень на ножке с +5 на 0 - клацнуть кнопкой один, если с 0 на +5 - второй, без прерываний, как это реализовать правильно? а то я сделал, но такое ощущение что не нажимает нифига
Реклама
Аватара пользователя
servio
Родился
Сообщения: 19
Зарегистрирован: Пт окт 21, 2011 18:27:34
Откуда: Киев
Контактная информация:

Re: USB-HID Джойстик Mega16

Сообщение servio »

Все крутится в главном цикле. Т.е. идет отслеживание изменения состояния кнопок, формирование буфера данных и постоянная отправка этих данных в USB. Задача следующая - на положительный перепад нажать и отпустить одну кнопку, на отрицательный перепад нажать и отпустить другую кнопку. Тут важный фактор - нажать и отпустить. Первое, что нужно делать это четко отслеживать факт перепада. Чтобы без прерываний таймера отработать нажатие и отпускание можно воспользоваться главным циклом. Отследить перепад, установить в соответствующей переменной флаг, что это произошло, сформировать буфер данных, в котором соответствующая кнопка нажата, и оставить этот бит данных неизменным в течении N-количества главных циклов, после сформировать буфер данных с опущенной кнопкой, сбросить флаг факта перепада, и отправить новые данные в USB. Выполнение N-раз главного цикла послужит суррогатным таймером. Единственное нужно определить значение N. Это экспериментально, подбирая значение так, чтобы игра четко реагировала на подобное нажатие и отпускание. Если есть осциллограф, то можно в главный цикл вставить код дерганья ногой контроллера и посмотреть период одного цикла. Из этого можно рассчитать нужное N. Думаю надо организовать задержку нажатия кнопки на 800мс.
b2soft
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Вт дек 06, 2011 19:11:09

Re: USB-HID Джойстик Mega16

Сообщение b2soft »

попробую, спасибо
b2soft
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Вт дек 06, 2011 19:11:09

Re: USB-HID Джойстик Mega16

Сообщение b2soft »

работает, если надо - выложу исходный код дёрганья, экспериментально подобрал - зажимает примерно на секунду, если вдруг во время нажатия отключить кнопку - сразу отключает и срабатывает дефолтная
Ответить

Вернуться в «AVR»