Цитата
Цитата(Георгий @ Feb 15 2007, 12:05)

У меня тоже не получилось. мне кажется, что хотя и декларировано помещение на любую 0 (или 7 ) ножку, но код жестко привязан к 0.
Код
#define USB_CFG_IOPORT PORTD
#define USB_CFG_DMINUS_BIT PD0
#define USB_CFG_DPLUS_BIT PD2
...
#if USB_CFG_DMINUS_BIT != PD0
# error "USB_CFG_DMINUS_BIT MUST be PD0!"
#endif
Судя по приведенным фрагментам, использована старая версия драйвера. Рекомендую взять свежую для всех новых разработок, так как в ней даже с нарушением совместимости на уровне исходников (хотя автор AVR-USB крайне неохотно шел на такие вещи) были исправлены существеные недочеты и значительно расширена функциональность.
В новой версии приведенный фрагмент выглядит так:
Код
#define USB_CFG_IOPORTNAME D
/* This is the port where the USB bus is connected. When you configure it to
* "B", the registers PORTB, PINB and DDRB will be used.
*/
#define USB_CFG_DMINUS_BIT 0
/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
* This may be any bit in the port.
*/
#define USB_CFG_DPLUS_BIT 2
/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
* This may be any bit in the port. Please note that D+ must also be connected
* to interrupt pin INT0!
*/
И я могу гарантировать, что в этой версии действительно назначение D+ и D- произвольно. Требования остаются лишь те, что они должны быть в пределах одного порта, и один из них должен быть соединен с INT0 (или другим, если исправить в конфигурации, где это теперь тоже предусмотрено).
Актуальная версия драйвера содержится в reference-проекте PowerSwitch на странице AVR-USB.
Альтернативно в качестве примера HID джойстика с использованием этого драйвера могу посоветовать посмотреть проект "PPM RC to USB Interface" на
этой странице. Я не уверен, что там использована последняя версия драйвера. И, в отличие от статьи в Радио, в нем не реализовано подключение нескольких устройств по одному интерфейсу (не ставилось такой задачи). Однако, простейший HID джойстик с осями и кнопками можно сделать, взяв за основу этот проект, выбрав в нем в качестве входного интерфейса IN_ADC (см. options.h), а в качестве выходного - OUT_JOYSTICK_BTN. Это даст 8 осей с АЦП и 8 кнопок, дублирующих аналоговые значения. Заменив кусок
Код
// prepare buttons
int *dp = &channelData[0];
char buttons = 0x00;
char mask = 0x01;
for (i = 0; i < 8; i++)
{
// ensure atomic operation
cli();
data = *dp++;
sei();
if (data > 1500) buttons |= mask;
mask <<= 1;
}
*rp = buttons;
на нечто вроде
Код
*rp = PINA;
(конечно, не забыв проинициализировать порт на ввод с включенными pull-up'ами), получится то, что нужно. Ну, а переписать дескрипторы, добавить дополнительные устройства и так далее, уже вопрос необходимости.
О коде RC USB... На данный момент все это переписано, реализована возможность динамической смены дескрипторов на уровне run-time (а не только при компиляции), и введен ряд других изменений. Однако, эта версия для публикации не готовилась и нигде не опубликована. А динамическое формирование дескрипторов текущая версия USB драйвера поддерживает out-of-the-box.