Страница 2 из 3

Re: USB + Mega16 + Ubuntu Linux...

Добавлено: Ср дек 14, 2011 22:10:02
md5sum
КАШАК писал(а):Скопировал код из исходника в свой проект, скомпилил. Ошибок не выдал, но и не заработал...
Частота кварца правильная указана? (в проекте)

Re: USB + Mega16 + Ubuntu Linux...

Добавлено: Ср дек 14, 2011 22:12:23
КАШАК
Ну да. при создании проекта в Eclipse, указал частоту 12МГц.

Вот код:

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


/*
Этот пример должен работать на большинстве AVR с минимальными изменениями. Не используются
никакие аппаратные ресурсы микроконтроллера, за исключением INT0. Вы можете поменять
usbconfig.h для использования других ножек I/O USB. Пожалуйста помните, что USB D+ должен
быть подсоединен на ножку INT0, или также как минимум быть соединенным с INT0.
Мы предполагаем, что LED подсоединен к порту B, бит 0. Если Вы подсоединили его на
другой порт или бит, поменяйте макроопределение ниже:
*/
#define LED_PORT_DDR        DDRB
#define LED_PORT_OUTPUT     PORTB
#define LED_BIT             0

#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>  /* для sei() */
#include <util/delay.h>     /* для _delay_ms() */

#include <avr/pgmspace.h>   /* нужен для usbdrv.h */
#include "usbdrv.h"
#include "oddebug.h"        /* Это также пример использования макроса отладки */
#include "requests.h"       /* номера custom request, используемые нами */

/* ------------------------------------------------------------------------- */
/* ----------------------------- интерфейс USB ----------------------------- */
/* ------------------------------------------------------------------------- */

PROGMEM char usbHidReportDescriptor[22] = {    /* дескриптор репорта USB */
    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)
    0x95, 0x01,                    //   REPORT_COUNT (1)
    0x09, 0x00,                    //   USAGE (Undefined)
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)
    0xc0                           // END_COLLECTION
};
/* Дескриптор выше - только макет, это заглушает драйверы. Репорт, который его
 *  описывает, состоит из одного байта неопределенных данных. Мы не передаем
 *  наши данные через HID-репорты, вместо этого мы используем custom-запросы.
 */

/* ------------------------------------------------------------------------- */

usbMsgLen_t usbFunctionSetup(uchar data[8])
{
usbRequest_t    *rq = (void *)data;

    if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_VENDOR){
        DBG1(0x50, &rq->bRequest, 1);   /* отладочный вывод: печатаем наш запрос */
        if(rq->bRequest == CUSTOM_RQ_SET_STATUS){
            if(rq->wValue.bytes[0] & 1){    /* установить LED */
                LED_PORT_OUTPUT |= _BV(LED_BIT);
            }else{                          /* очистить LED */
                LED_PORT_OUTPUT &= ~_BV(LED_BIT);
            }
        }else if(rq->bRequest == CUSTOM_RQ_GET_STATUS){
            static uchar dataBuffer[1];     /* буфер должен оставаться валидным привыходе из usbFunctionSetup */
            dataBuffer[0] = ((LED_PORT_OUTPUT & _BV(LED_BIT)) != 0);
            usbMsgPtr = dataBuffer;         /* говорим драйверу, какие данные вернуть */
            return 1;                       /* говорим драйверу послать 1 байт */
        }
    }else{
        /* вызовы запросов USBRQ_HID_GET_REPORT и USBRQ_HID_SET_REPORT не реализованы,
         *  поскольку мы их не вызываем. Операционная система также не будет обращаться к ним,
         *  потому что наш дескриптор не определяет никакого значения.
         */
    }
    return 0;   /* default для нереализованных запросов: не возвращаем назад данные хосту */
}

/* ------------------------------------------------------------------------- */

int main(void)
{
uchar   i;

    wdt_enable(WDTO_1S);
    /* Даже если Вы не используете сторожевой таймер (watchdog), выключите его здесь. На более новых
     *  микроконтроллерах состояние watchdog (вкл\выкл, период) СОХРАНЯЕТСЯ ЧЕРЕЗ СБРОС!
     */
    DBG1(0x00, 0, 0);       /* отладочный вывод: стартует main */
    /* RESET статус: все биты портов являются входамибез нагрузочных резисторов (pull-up).
     *  Это нужно для D+ and D-. Таким образом, нам не нужна какая-либо дополнительная
     *  инициализация портов.
     */
    odDebugInit();
    usbInit();
    usbDeviceDisconnect();  /* принудительно запускаем ре-энумерацию, делайте это, когда прерывания запрещены! */
    i = 0;
    while(--i)
    {             /* иммитируем USB дисконнект на время > 250 мс */
        wdt_reset();
        _delay_ms(1);
    }
    usbDeviceConnect();
    LED_PORT_DDR |= _BV(LED_BIT);   /* делаем ножку, куда подключен LED, выходом */
    sei();
    DBG1(0x01, 0, 0);       /* отладочный вывод: стартует цикл main */
    for(;;){                /* цикл событий main */
#if 0   /* это несколько агрессивно для отладочного вывода */
        DBG2(0x02, 0, 0);   /* отладочный вывод: повторы цикла main */
#endif
        wdt_reset();
        usbPoll();
    }
    return 0;
}
Должен зажигать светодиод по команде с ПК, но это не главное... Плюс еще добавлена какая-то отладка...

Первоисточник http://microsin.ru/content/view/757/44/

Пробовал отключать оптимизацию проекта, не помогло...

Re: USB + Mega16 + Ubuntu Linux...

Добавлено: Ср дек 14, 2011 22:16:08
md5sum
По умолчанию эклипс компилит DEBUG прошивку, а не RELEASE.
Debug с USB работать не будет.

Re: USB + Mega16 + Ubuntu Linux...

Добавлено: Ср дек 14, 2011 22:17:32
КАШАК
Я при создании отметил для создания только Release.

Re: USB + Mega16 + Ubuntu Linux...

Добавлено: Ср дек 14, 2011 22:18:41
КАШАК
Можете код у себя проверить? Может я в настройках проекта накосячил...

Вот все файлы проекта:
firmware.rar
(125.1 КБ) 152 скачивания

Re: USB + Mega16 + Ubuntu Linux...

Добавлено: Ср дек 14, 2011 22:41:26
md5sum
КАШАК писал(а):Можете код у себя проверить? Может я в настройках проекта накосячил...
В железе - нет, не могу... Нет макетной платы...
1. В эклипсе в свойствах проекта проверь тип контроллера и частоту (пункт AVR).
2. На проекте кликнуть правой кнопкой -> build configuration -> manage...
Удалить конфигурацию Debug или сделать активной Release.

Re: USB + Mega16 + Ubuntu Linux...

Добавлено: Ср дек 14, 2011 23:22:08
КАШАК
Проверил настройки. МК ATmega16, частота 12МГц., Debug вообще нет, только Release. Но работать прошивка все равно отказывается...

Re: USB + Mega16 + Ubuntu Linux...

Добавлено: Ср дек 14, 2011 23:52:20
ploop
Устройство в системе появляется?

Re: USB + Mega16 + Ubuntu Linux...

Добавлено: Чт дек 15, 2011 00:16:46
КАШАК
Если я компилирую, то не появляется. Если шью готовой прошивкой - появляется...

Re: USB + Mega16 + Ubuntu Linux...

Добавлено: Чт дек 15, 2011 00:23:23
ploop
Тут уж смотри, код, опции компилятора, фьюзы...

Re: USB + Mega16 + Ubuntu Linux...

Добавлено: Чт дек 15, 2011 00:37:40
КАШАК
Фьюзы я не менял. Как прошил на работу с внешним кварцем на 12МГц. так и работает. Уже несколько вариантов кода пробовал, на работает. Кстати, в коде, выложенном выше, нет ошибок? Остаются опции компилятора, от каких опций может зависить работа данной программы?

Re: USB + Mega16 + Ubuntu Linux...

Добавлено: Чт дек 15, 2011 06:03:10
md5sum
КАШАК писал(а):Фьюзы я не менял. Как прошил на работу с внешним кварцем на 12МГц. так и работает. Уже несколько вариантов кода пробовал, на работает. Кстати, в коде, выложенном выше, нет ошибок? Остаются опции компилятора, от каких опций может зависить работа данной программы?
Остается usbconfig.h
Что-то похоже его меняли, но не до конца :)

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

#define USB_CFG_DESCR_PROPS_HID_REPORT              0
если хотим использовать PROGMEM char usbHidReportDescriptor[22] то надо писать

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

#define USB_CFG_DESCR_PROPS_HID_REPORT  USB_PROP_LENGTH(22)
Это то, что бросается в глаза....
Сверьте usbconfig Ваш и из проекта.

Re: USB + Mega16 + Ubuntu Linux...

Добавлено: Чт дек 15, 2011 12:10:37
КАШАК
Я брал usbconfig.h все равно не работает. Вот мой проект. Весь код полностью взят из примера, библиотеки и usbconfig.h тоже. Комп устройство не находит... Создал проект заново, проверил все настройки, не работает...

Re: USB + Mega16 + Ubuntu Linux...

Добавлено: Чт дек 15, 2011 16:05:31
ploop
[offtop]
Ubuntu... usb.rar... хм...
[/offtop]

Re: USB + Mega16 + Ubuntu Linux...

Добавлено: Чт дек 15, 2011 16:40:17
КАШАК
В каком смысле? Ubuntu отлично создает rar-архивы. Для этого есть дополнение к архиватору, unrar, называется :))

Re: USB + Mega16 + Ubuntu Linux...

Добавлено: Чт дек 15, 2011 17:06:02
КАШАК
Так что у меня в коде неправильно может быть?...

Re: USB + Mega16 + Ubuntu Linux...

Добавлено: Чт дек 15, 2011 19:48:06
КАШАК
Можете у себя скомпилить прошивку под mega16, с правильными настройками проекта, а я у себя в железе проверю. Просто чтобы знать, ошибка в настройках проекта или в коде...

Re: USB + Mega16 + Ubuntu Linux...

Добавлено: Чт дек 15, 2011 22:30:05
КАШАК
Все заработало. :)) Надо было дописать в usbconfig.h, строку:

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

#define F_CPU 12000000UL

Re: USB + Mega16 + Ubuntu Linux...

Добавлено: Чт дек 15, 2011 22:51:39
КАШАК
МК определился компом, но не определяется класс устройства. Ни в готовой прошивке, ни в моей.

Изображение

Предпоследнее устройство в списке, программатор AVR910. Последнее - мое устройство. Почему не определяется его класс?

В usbconfig.h написал:

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

#define USB_CFG_INTERFACE_CLASS     2   /* Задайте здесь класс, если это не сделано на уровне устройства */
#define USB_CFG_INTERFACE_SUBCLASS  2
#define USB_CFG_INTERFACE_PROTOCOL  1
/* См. спецификацию USB, если Вы хотите, чтобы устройство отвечало требованиям существующего класса
    или протокола. Следующие классы должны быть установлены на уровне интерфейса:
 * HID class 3, нетребуется подклассов и протоколов (может оказаться удобным!)
 * CDC class 2, используйте подкласс 2 и протокол 1 для ACM*/
Ставил и HID устройство, ничего не меняется.

Re: USB + Mega16 + Ubuntu Linux...

Добавлено: Сб дек 17, 2011 00:11:12
КАШАК
Где можно почитать про работу с USB устройствами? Как правильно настроить usbconfig.h ? Как сделать, чтобы устройство в Linux определялось как ttyACM? Сейчас устройство определяется в системе, но в списке устройств dev его нет...