реклама на сайте
подробности

 
 
> Программный USB на ATMEGA8, USB Low Speed
afad
сообщение Feb 12 2007, 12:18
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 212
Регистрация: 26-08-04
Пользователь №: 545



Если кому интересно, в журнале "Радио" N1 2007г, c.28 описано устройство (подключение джойстиков к РС) с программной реализацией USB Low Speed на ATMEGA8, использует стандартный HID-драйвер. Там же ссылки на исходники.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Георгий
сообщение Feb 15 2007, 09:05
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 269
Регистрация: 17-11-05
Из: Киров-Москва
Пользователь №: 10 957



У меня тоже не получилось. мне кажется, что хотя и декларировано помещение на любую 0 (или 7 ) ножку, но код жестко привязан к 0.


--------------------
Обычно последним смеется тот, кто хуже соображает!
Go to the top of the page
 
+Quote Post
Spider
сообщение Feb 15 2007, 09:20
Сообщение #3


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



Цитата(Георгий @ 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
Вот это всё полная чушь. смотрим далее
usbdrv.h
Код
/* I/O definitions for assembler module */
#define USBOUT          USB_CFG_IOPORT          /* output port for USB bits */
#define USB_PULLUP_OUT  USB_CFG_PULLUP_IOPORT
#ifdef __ASSEMBLER__
/* the following two lines must start in column 0 for IAR assembler */
USBIN = (USB_CFG_IOPORT - 2)                /* input port for USB bits */
USBDDR = (USB_CFG_IOPORT - 1)               /* data direction for USB bits */
#else
#define USBIN           (*(&USB_CFG_IOPORT - 2))    /* input port for USB bits */
#define USBDDR          (*(&USB_CFG_IOPORT - 1))    /* data direction for USB bits */
#define USB_PULLUP_DDR  (*(&USB_CFG_PULLUP_IOPORT - 1))
#endif
#if USB_CFG_DMINUS_BIT != PD0
#   error "USB_CFG_DMINUS_BIT MUST be PD0!"
#endif
#define USBMINUS    USB_CFG_DMINUS_BIT       /* D- MUST be on bit 0 */
#define USBIDLE     0x01                     /* value representing J state */
#define USBMASK     ((1<<USB_CFG_DPLUS_BIT) | USBIDLE)    /* mask for USB I/O bits */

Видно, что USBIDLE никак не соотносится с объявлением выше. Ну ладно меняем его на
Код
#define USBIDLE  (1<<USB_CFG_DMINUS_BIT)

и убираем нафиг проверку на PD0 несколькими строками выше.
По идее всё. Но кто гарантирует что такого нет прям в коде? В смысле что в коде 100% идёт ссылка на эти объявления. И кстати как к таким дефайнам относится АСМ?
Код
    cbr     x1, USBMASK    ;1 mask out data bits
    ori     x1, USBIDLE    ;1 idle

Фактически код выше выглядит как:
Код
    cbr     x1, ((1<<USB_CFG_DPLUS_BIT) | (1<<USB_CFG_DMINUS_BIT))    ;1 mask out data bits
    ori     x1, (1<<USB_CFG_DMINUS_BIT)    ;1 idle

Мне кажеться это не есть правильно... Но на удивление это собирается. Но не работает. Не работает если D- != PD0.
Go to the top of the page
 
+Quote Post
osnwt
сообщение Feb 15 2007, 10:08
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 175
Регистрация: 26-01-06
Из: Sevastopol
Пользователь №: 13 664



Цитата
Цитата(Георгий @ 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.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 17:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.01407 секунд с 7
ELECTRONIX ©2004-2016