Модераторы: PILOT, ManiaK, Mazzi

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите с проектом под Delphi дл работы с HID USB, поиск простенького проекта 
:(
    Опции темы
KoTeKoT
Дата 25.12.2010, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 24.12.2010

Репутация: нет
Всего: нет



 Пардон за непраильное обьяснение.
Напряжение на PD4 относительно земли 2,98 В
 на PD2 относительно земли 0,03 В, а относительно питания 4,98 В
Вроде бы правильно написал.. 
И повотрюсь - это устройство уже работало на это й же плате и этим же МК.... я уже на невероятные вещи грешил (мож каким макаром статика на МК вдарила)... но он же прошивается нормально!

Это сообщение отредактировал(а) KoTeKoT - 25.12.2010, 23:09
PM MAIL   Вверх
darksilence
Дата 25.12.2010, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 26.11.2010

Репутация: нет
Всего: нет



Кстати о прошиввании. Какой у вас программатор? если типа AVR910, то он сам шлет меандр и ему не нужен тогда внешний кварц на прошиваемом МК для программирования. =) с фьзами все норм? Все таки попробуйте атмегу поменять. 
PM MAIL   Вверх
KoTeKoT
Дата 25.12.2010, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 24.12.2010

Репутация: нет
Всего: нет



Та нет , программатор 5 проводков )) но шил на нем 2 атмеги без проблемм. Может кварц не заводится... осцилографа нет, а как без него проверить без понятия... Ну а если перепрошивается отлично (мигает светиками с другой прошивкой) то кварц с кондерами в норме??? А с фьюзами вроде все в норме, я как makefile исправил сначала, так и не менят его и прошивал с ним через AVR-Dude несколько раз без проблемм.   Лады, сейчас поменяю атмегу!
---
Прошил другую Атмегу8 - тоже самое! Не опознано! Но прошылась нормально (после подключения в ЮСБ засветились светодиоыды, как и написано в программе зашивал ЭТУ: http://forum.vingrad.ru/index.php?showtopi...t&p=2050245 )... выходит в пайке или с компонентами что то не так... но только что проверил еще ра - обрывов и коротких точно нет!!! Что ж компоненты по одному менять? Маразм... мистика...

Это сообщение отредактировал(а) KoTeKoT - 26.12.2010, 00:37
PM MAIL   Вверх
zvyagaaa
Дата 27.12.2010, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 13.1.2008

Репутация: нет
Всего: нет



а можно ли как-то управлять еще и яркостью светодиодов по этой схеме?
я так понимаю, что нужно организовать ШИМ, а вот как - не знаю, может подскажите?
PM MAIL   Вверх
darksilence
Дата 27.12.2010, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 26.11.2010

Репутация: нет
Всего: нет



Если не сильно вникая, то проще через CodeVisionAVR. там есть утилита встроенная - автокомпоновщик или как ее еще назвать. вобщем там выбрать использование таймера для ШИМ. из него взять регистры настройки таймера (TCCR,TCNT,OCR) и скопировать в ваш проект.
А лучше разобраться по даташиту. На сайте Атмеля есть аппноуты  с примерами для WinAVR. 
Главное если будете использовать прерывания таймера не задеть прерывание USB протокола, если использовать ненулевые конечные точки.
PM MAIL   Вверх
zvyagaaa
Дата 29.12.2010, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 13.1.2008

Репутация: нет
Всего: нет



я к чему спрашиваю, а вообще, это реально чтобы в проект, который выкладывался тут, добавить на все 8! портов программный шим? Просто то, что я в сети встречал, сделано, обычно на меге 8, 48 и т.д., т.е. на более серьезных контроллерах, с большим объемом памяти и прочее...
PM MAIL   Вверх
darksilence
Дата 29.12.2010, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 26.11.2010

Репутация: нет
Всего: нет



Я так понимаю особого опыта работы с МК нет да и знания слабые, никого не хочу обидеть. 
В атемеге8 всего 2 порта по 8 пинов и 1 порт с 7-ью пинами. 
В проекте VUSB нам оставлено суммарно 18 пинов (касательно ATMEGA8, если не использовать аппратной возможности отключения от USB). Как хотите так и управляйте ими, особых ограничений нет. прерываниями таймера вы программу не собьете, единственно, что не советуется - выключать прерывания вообще(т.е. использовать комманду cli()). 
PM MAIL   Вверх
zvyagaaa
Дата 29.12.2010, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 13.1.2008

Репутация: нет
Всего: нет



да, к сожалению, ни опыта ни знаний по работе с мк пока нету, кроме как прошивки при помощи программатора и PonyProg. :( сам-то принцип как шим организуется на микроконтроллере я понимаю, а как это в код оформить - не понимаю... вот помог бы кто-нибудь что конкретно нужно написать в исходнике.
PM MAIL   Вверх
darksilence
Дата 30.12.2010, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 26.11.2010

Репутация: нет
Всего: нет



Код


//формирование программного ШИМа
#include <avr/io.h>
#include <avr/interrupt.h>  


SIGNAL(TIMER1_OVF_vect)  //прерывание по переполнению
{
PORTB=0;                       //выключаем ВЕСЬ PORTB

OCR1AH+=10;           
OCR1AL=0x00;
}

SIGNAL(TIMER1_COMPA_vect)  //прерывание по сравнению
{                                               //срабатывает когда TCNT1=OCR1A
PORTB=0xff;                             //Включаем ВЕСЬ PORTB
}
/* ------------------------------------------------------------------------- */

int main(void)
{
DDRB=0xff;


TCCR1A=0x00;
TCCR1B=0x01;             //таймер считает с частотой МК

OCR1AH=0x00;
OCR1AL=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x14;        //прерывание по переполнению и сравнению

sei();             //разрешаем прерывания 

    for(;;){                /* цикл событий main */

    }

}


и в проект USB все вставляется в этом же роде. 
Если в вашем проекте используется только нулевая конечная точка, то проблем вообще не должно возникнуть


Это сообщение отредактировал(а) darksilence - 30.12.2010, 01:22
PM MAIL   Вверх
zvyagaaa
Дата 2.1.2011, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 13.1.2008

Репутация: нет
Всего: нет



для тиньки не хватит памяти, люди говорят  smile надо как минимум 4 кбайта памяти,а в ней 2!
PM MAIL   Вверх
darksilence
Дата 4.1.2011, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 26.11.2010

Репутация: нет
Всего: нет



ну если для тиньки CDC проекты катят (которые USB-COM), то уж ШИМ с USB сделать памяти много не надо
PM MAIL   Вверх
zvyagaaa
  Дата 11.1.2011, 07:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 13.1.2008

Репутация: нет
Всего: нет



Похоже, что начал по-тихоньку вникать, что да как в МК этих, много читаю, примеры смотрю и прочее: 
Посмотрите код - похоже на правду, что я написал? Мне нужно на базе Attiny 2313 сделать 6 управляемых через USB светодиодов, регулируемые ШИМом. Так как аппаратных, как я понял, можно использовать только 2, то я попробовал его сделать через программную реализацию. Реализовал я его вот так:
Код

/* Name           : main.c
 * Project        : LED USB Device
 * Author         : Vitaliy Popov
 * Target MCU     : ATtiny2313
 * InterfaceClass : HID
 * Data update    : 2009-08-08
 * Tabsize        : 4
 * Copyright      : (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH
 * License        : GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
 * This Revision  : $Id: main.c 692 2008-11-07 15:07:40Z cs $
 */

/*
 Этот простой пример показывает как можно использовать протокол HID для передачи
данных в микроконтроллер AVR и управлять 8-ми битным портом. Он применим для многих
AVR с небольшими изменениями. Не используются никакие специальные аппаратные
ресурсы, кроме INT0. Вы можете изменить usbconfig.h для других выводов I/O USB.
Пожалуйста, имейте в виду, что USB D+ должен быть подсоединен к выводу INT0, либо,
как минимум, также должен быть соединен с INT0.
*/

#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"        /* пример для использования макроса отладки */

#define nop() {asm("nop");}//функция необходимая для реализации задержки

unsigned int l0,l1,l2,l3,l4,l5; //уровни яркости светодиодов LED0...LED5 (соотвественно)
unsigned int x, ms;

// функция задержки
void delay_ms(int ms)
{
for (x=ms;x>0;x--)
nop ();
}

// функция включения красного светодиода
void ledon0(int ms)
{
  PORTB &= ~_BV(PB0);
    delay_ms(ms);
}

// функция выключения красного светодиода
void ledoff0(int ms)
{
   PORTB |= _BV(PB0);
     delay_ms(ms);
}

// функция включения зеленого светодиода
void ledon1(int ms)
{
  PORTB &= ~_BV(PB1);
    delay_ms(ms);
}

// функция выключения зеленого светодиода
void ledoff1(int ms)
{
   PORTB |= _BV(PB1);
     delay_ms(ms);
}

// функция включения синего светодиода
void ledon2(int ms)
{
  PORTB &= ~_BV(PB2);
    delay_ms(ms);
}

// функция выключения синего светодиода
void ledoff2(int ms)
{
   PORTB |= _BV(PB2);
     delay_ms(ms);
}

// функция включения красного 2 светодиода
void ledon3(int ms)
{
  PORTB &= ~_BV(PB3);
    delay_ms(ms);
}

// функция выключения красного 2 светодиода
void ledoff3(int ms)
{
   PORTB |= _BV(PB3);
     delay_ms(ms);
}

// функция включения зеленого 2 светодиода
void ledon4(int ms)
{
  PORTB &= ~_BV(PB4);
    delay_ms(ms);
}

// функция выключения зеленого 2 светодиода
void ledoff4(int ms)
{
   PORTB |= _BV(PB4);
     delay_ms(ms);
}

// функция включения синего 2 светодиода
void ledon5(int ms)
{
  PORTB &= ~_BV(PB5);
    delay_ms(ms);
}

// функция выключения синего 2 светодиода
void ledoff5(int ms)
{
   PORTB |= _BV(PB5);
     delay_ms(ms);
}


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

PROGMEM char usbHidReportDescriptor[21] = {  /* дескриптор репорта USB */
    0x05, 0x08,                 // USAGE_PAGE (LEDs)
    0x09, 0x4b,                 // USAGE (Generic Indicator)
    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
};

/*
 Поскольку мы задали только один feature-репорт, мы не используем идентификаторы
report-ID (которые должны быть в первом байте репорта). Весь репорт состоит из
одного 8-ми битового блока неопределенных данных.
*/

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

/*
 usbFunctionRead() вызывается, когда хост запрашивает кусок данных от устройства.
 Для большей информации см. документацию в usbdrv/usbdrv.h.
*/

uchar   usbFunctionRead(uchar *data, uchar len)
{
    data[0] = PINB;             /* читаем байт данных из порта PB */
    len = 1;                    /* считали один байт данных */
    return len;                 /* возвращаем кол-во считанных байт */
}

/*
 usbFunctionWrite() вызывается, когда хост посылает кусок данных в устройство.
 Для большей информации см. документацию в usbdrv/usbdrv.h.
*/

uchar   usbFunctionWrite(uchar *data, uchar len)
{
    l0 = data[1];
    l1 = data[2];
    l2 = data[3];
    l3 = data[4];
    l4 = data[5];
    l5 = data[6];


    return 1;                   /* возвращаем 1 - все данные успешно приняты */
                                /* первый байт всегда равен нулю, его за борт
}

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

/*
 usbFunctionSetup вызывается, когда драйвер принимает транзакцию SETUP от хоста,
которому не отвечает драйвер непосредственно (на практике: запросы класса
и вендора). Все управляющие передачи стартуют с транзакции SETUP, где хост
сообщает параметры следующтих (опционально) передач данных. Данные SETUP
доступны в параметре 'data', который может (и должен) быть преобразован
в 'usbRequest_t *' для лучшего дружественного для пользователя доступа
к параметрам.
 Для большей информации см. документацию в usbdrv/usbdrv.h.
*/

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

    if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS){    /* запрос HID class */
        if(rq->bRequest == USBRQ_HID_GET_REPORT){  /* wValue: ReportType (highbyte), ReportID (lowbyte) */
            /* поскольку мы имеем только один тип репорта, мы можем игнорировать репорт-ID */
            return USB_NO_MSG;  /* использование usbFunctionRead() для получения данных хостом от устройства */
        }else if(rq->bRequest == USBRQ_HID_SET_REPORT){
            /* поскольку мы имеем только один тип репорта, мы можем игнорировать репорт-ID */
            return USB_NO_MSG;  /* использование usbFunctionWrite() для получения данных устройством от хоста */
        }
    }
    //else{
        /* игнорируем запросы типа вендора, мы их все равно не используем */
    //}
    return 0;
}

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

int main(void)
{
uchar   i;

    wdt_enable(WDTO_1S);
    /* Даже если Вы не используете watchdog, выключите его здесь. На новых устройствах
     *  состояние watchdog (вкл/выкл, период) СОХРАНЯЮТСЯ ЧЕРЕЗ RESET!
     */
    DBG1(0x00, 0, 0);       /* отладочный вывод: стартует тело main */
    /* Состояние RESET: все биты порта работают как входы без нагрузочных резисторов (pull-up).
     *  Это то, что нужно для входов USB D+ и D-.
     */
    DDRB  = 0xFF;           /* конфигурируем порт PB для вывода данных */
    odDebugInit();
    usbInit();
    usbDeviceDisconnect();  /* запускаем принудительно реэнумерацию, делайте это, когда прерывания запрещены! */
    i = 0;
    while(--i){             /* эмулируем USB дисконнект на время > 250 мс */
        wdt_reset();
        _delay_ms(1);
    }
    usbDeviceConnect();
    sei();                  /* общее разрешение прерываний */
    DBG1(0x01, 0, 0);       /* отладочный вывод: вход в цикл main */
    for(;;){                /* цикл событий main */
      DBG1(0x02, 0, 0);   /* отладочный вывод: повторы цикла main */
      wdt_reset();

            ledon0(l0);
            ledoff0(255-l0);
            ledon1(l1);
            ledoff1(255-l1);
            ledon2(l2);
            ledoff2(255-l2);
            ledon3(l3);
            ledoff3(255-l3);
            ledon4(l4);
            ledoff4(255-l4);
            ledon5(l5);
            ledoff5(255-l5);

      usbPoll();
    }
    return 0;
}

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



В принципе, понимаю, что реализация топорная, может можно как-то улучшить, и вообще - будет ли такое работать? Такое ощущение, что все это дело будет нещадно тормозить :(
Только вот, зараза, не компилируется ни пса :( Выдает ошибку на последнюю строку 
Код

../main.c:261: error: expected declaration or statement at end of input

Прикладываю архив проекта на AVR Studio 4. Я правильно все делаю, или нет?

Спасибо.

Это сообщение отредактировал(а) zvyagaaa - 11.1.2011, 09:55

Присоединённый файл ( Кол-во скачиваний: 50 )
Присоединённый файл  main.rar 111,83 Kb
PM MAIL   Вверх
darksilence
Дата 12.1.2011, 02:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 26.11.2010

Репутация: нет
Всего: нет



у тебя функция usbFunctionWrite не закончена.
в смысле закрывающую скобку "END" ты закомментировал. вот поэтому и error. 
ИМХО проще искать ошибки в ProgrammersNotepad, идущим в комплекте с WINAVR. собственно и компилировать от туда же. Я на AVRStudio в обиде. она без makefile откзаывается мне чето делать. а раз так, то лучше я не буду ей пользоваться и все =) 

А по счет программы.. мудрено как то все. можно и покрасивше написать, но если будет работать, то все здорово =) Не забудьте правильно фьюзы запрограммировать ;-)
PM MAIL   Вверх
zvyagaaa
Дата 12.1.2011, 07:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 13.1.2008

Репутация: нет
Всего: нет



darksilence, огромное спасибо за то, что надоумили меня воспользоваться ProgrammersNotepad - тут хоть скобки можно проверить smile конечно, до delphi+CnWizard ему далеко, но все равно.
Там еще ошибки были. Поэтому выложу еще откомпилированный проект. Еле разобрался что этому компилятору надо, ну до чего же он не информативные сообщение выдает при ошибках, вот сиди и думай, что не так сделал smile
а, да, в железе еще не проверялась работа, пока просто откомпилировал.
Правда, пришлось все же оптимизировать код, как я и предполагал - код чисто индусский был smile памяти не хватило даже на сильной оптимизации: вот как я все включение/выключение светодиодов переделал:
Код

// функция ШИМ светодиодов
void led0(int led,int ms)
{
  PORTB &= ~_BV(led);
    delay_ms(ms);
  PORTB |= _BV(led);
     delay_ms(255-ms);
}

ну и соответственно ее вызываю:
Код

        led0(PB0,l0);
        led0(PB1,l1);
        led0(PB2,l2);
        led0(PB3,l3);
        led0(PB4,l4);
        led0(PB5,l5);

так-то оно ловчее будет smile

Это сообщение отредактировал(а) zvyagaaa - 12.1.2011, 08:22

Присоединённый файл ( Кол-во скачиваний: 55 )
Присоединённый файл  main.rar 147,59 Kb
PM MAIL   Вверх
darksilence
Дата 12.1.2011, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 26.11.2010

Репутация: нет
Всего: нет



у нас уже оффтоп пошел, на самом деле..
Я тебе советую разобраться сначала с ШИМом. сделай все тоже самое только без юсб и проверь в Proteus (программа эмулирует готовое устройство. очень удобная вещь). если твоя реализация будет работать, то все норм =) Мне влом в тоем коде разбираться, тем более что когда сам ошибки исправишь, поймешь лучше ;-)

P.S. не получиться в твое программе такое время моргания светодиодами, т.к. они у тебя последовательно моргают и период моргания одного светодиода = сумме всех delay в одном цикле. а у тебя там больше секунды может выйти. надо переделать =) 

Это сообщение отредактировал(а) darksilence - 12.1.2011, 19:22
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.1526 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.