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

Поиск:

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


Новичок



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

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



 По многочисленным просьбам на e-mail, выкладываю пример моего проекта для микроконтроллера  с описанием под WinAVR.

PS: Внимание! Архив обновлен и дополнен.


Это сообщение отредактировал(а) pvabox - 23.9.2011, 10:08

Присоединённый файл ( Кол-во скачиваний: 506 )
Присоединённый файл  LED_Device_Example.rar 83,43 Kb
PM MAIL   Вверх
joint931
Дата 12.12.2009, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ктонибудь может кинуть пример как с помощью компонента JvHidController ПРИНИМАТЬ данные? Как девайс найти и послать пакеты все ясно, а вот как его опросить... ниче не ясно... 
Заранее спасибо.
PM MAIL   Вверх
197102
Дата 18.12.2009, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(pvabox @ 16.10.2009,  23:10)
Пример моего проекта работы с HID устройством на базе V-USB от Objective Development

Схема
user posted image

Основная программа микроконтроллера main.c

Код

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


/* ------------------------------------------------------------------------- */
/* ----------------------------- Интерфейс 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)
{
    PORTB = data[0];            /* записываем байт данных в порт PB */
    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();
        usbPoll();
    }
    return 0;
}

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


ВНИМАНИЕ! Не забудьте отредактировать файл конфигурации usbconfig.h !!!!


Далее - тестовая программа на Delphi 7 main.pas

Код

unit main;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, Forms,
  StdCtrls, Buttons, JvHidControllerClass, JvComponentBase;
  
type
  TReportData = array [0..7] of Byte;  // размер буфера репорта HID

  TForm1 = class(TForm)
    HidCtl: TJvHidDeviceController;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    CheckBox0: TCheckBox;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    CheckBox4: TCheckBox;
    CheckBox5: TCheckBox;
    CheckBox6: TCheckBox;
    CheckBox7: TCheckBox;
    
    procedure HidCtlArrival(HidDev: TJvHidDevice);
    function  HidCtlEnumerate(HidDev: TJvHidDevice;
              const Idx: Integer): Boolean;
    procedure HidCtlRemoval(HidDev: TJvHidDevice);
    function  WorkDevSetFeature(Buf: TReportData): Boolean;
    procedure CheckBoxClick(Sender: TObject);
    
  private
    { Private declarations }
  public
    { Public declarations }
    WorkDev   : TJvHidDevice;
  end;

const
// Описание устройства
  ProductName_  = 'LED USB Device';
  VendorID_     =  $16c0;
  ProductID_    =  $05df;

var
  Form1     : TForm1;

implementation

{$R *.dfm}


procedure TForm1.HidCtlArrival(HidDev: TJvHidDevice);
// Обработчик подключения нового устройства
// событие OnArrival от HidCtl
begin
// если устройство не определено, то вызываем энумерацию
  If not Assigned(WorkDev) then HidCtl.Enumerate
end;


function TForm1.HidCtlEnumerate(HidDev: TJvHidDevice;
                                const Idx: Integer): Boolean;
// Поиск нужного устройства из всех подключенных
// событие OnEnumerate от HidCtl
begin
  Result:= True;                      // продолжать поиск
  If (Trim(HidDev.ProductName) = ProductName_)
    then  If  (HidDev.Attributes.VendorID  = VendorID_) and
              (HidDev.Attributes.ProductID = ProductID_)
            then  begin               // устройство найдено
                    HidCtl.CheckOutByIndex(WorkDev, Idx);  // получаем устройство по индексу
                    Label2.Caption:= 'подключено';
                    Result:= False;   // поиск закончен
                  end
end;


procedure TForm1.HidCtlRemoval(HidDev: TJvHidDevice);
// Обработчик физического отключения устройства
// событие OnRemoval от HidCtl
begin
  If HidDev = WorkDev then
    begin                             // устройство было отключено
      WorkDev:= nil;
      Label2.Caption:= ' отключено'
    end
end;


function TForm1.WorkDevSetFeature(Buf: TReportData): Boolean;
// Передача данных устройству WorkDev
begin
  If Assigned(WorkDev)
    then Result:= WorkDev.SetFeature(Buf, WorkDev.Caps.FeatureReportByteLength)
    else Result:= False
end;


procedure TForm1.CheckBoxClick(Sender: TObject);
// Опрос состояний CheckBox и передача данных устройству
var
  LEDs      : Byte;
  ReportData: TReportData;

begin
// Опрос состояний CheckBox
  LEDs:= 0;
  If CheckBox0.Checked then LEDs:= LEDs+1;
  If CheckBox1.Checked then LEDs:= LEDs+2;
  If CheckBox2.Checked then LEDs:= LEDs+4;
  If CheckBox3.Checked then LEDs:= LEDs+8;
  If CheckBox4.Checked then LEDs:= LEDs+16;
  If CheckBox5.Checked then LEDs:= LEDs+32;
  If CheckBox6.Checked then LEDs:= LEDs+64;
  If CheckBox7.Checked then LEDs:= LEDs+128;

  Label3.Caption:= 'LEDs = ' + IntToStr(LEDs);

// Передача данных устройству WorkDev
  FillChar(ReportData, SizeOf(ReportData), 0);  // заполняем массив нулями
  ReportData[0]:= 0;                            // номер репорта
  ReportData[1]:= LEDs;                         // данные репорта
  If WorkDevSetFeature(ReportData)              // пытаемся передать данные
    then Label4.Caption:= ' Ok! '
    else Label4.Caption:= ' Ошибка передачи данных '
end;

end.



PS: Программа использует JvHidControllerClass библиотеки JEDI, не забудьте установить!

Будут вопросы - не стесняйтесь, постараюсь ответить.

Скажите, а где найти пресловутый JvComponentBase?

JvHidControllerClass установил, а этого найти не могу.
PM MAIL   Вверх
mr_smit
Дата 19.12.2009, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Кинь на форму сам "HID компонент" и он добавит нужные uses
PM MAIL   Вверх
pvabox
Дата 24.12.2009, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(joint931 @ 12.12.2009,  01:23)
Ктонибудь может кинуть пример как с помощью компонента JvHidController ПРИНИМАТЬ данные? Как девайс найти и послать пакеты все ясно, а вот как его опросить... ниче не ясно... 
Заранее спасибо.

Замени в тексте программы на Delphi включения SetFeature на GetFeature, данные будут помещаться в буфер Buf.

Добавлено через 3 минуты и 37 секунд
Пробовал кто собирать подобный девайс, есть замечания по работе?
Напишите свое мнение.
PM MAIL   Вверх
Alexeyslav
Дата 25.12.2009, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

А книга Агурова мне не очень нравится. Практики в ней нет. Я предпочитаю практические примеры.


Такая книга заставляет задуматься, искать ошибки исправлять их - в этом процессе и приходят знания. Научившись же копировать - знаний не будет, и никогда до конца не поймете как это все работает. От незнания возникают всевозможные глюки - устройство работает только в определенных условиях, чуть что (в примере упустили проверки на ошибки например) и все летит к чертям, приложение вываливается а драйвер вешает систему... а Вы долго-долго ищите причину.
PM MAIL   Вверх
svetodiod
Дата 25.12.2009, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Прошу прощения за дурацкий вопрос, откуда девайс знает, что он 
Цитата

ProductName_  = 'LED USB Device';
VendorID_     =  $16c0;
ProductID_    =  $05df;

где это задается (если задается) в прошивке микроконтроллера?
PM MAIL   Вверх
alfrerd
Дата 3.1.2010, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(pvabox @ 24.12.2009,  13:08)
Цитата(joint931 @ 12.12.2009,  01:23)
Ктонибудь может кинуть пример как с помощью компонента JvHidController ПРИНИМАТЬ данные? Как девайс найти и послать пакеты все ясно, а вот как его опросить... ниче не ясно... 
Заранее спасибо.

Замени в тексте программы на Delphi включения SetFeature на GetFeature, данные будут помещаться в буфер Buf.

Добавлено @ 13:12
Пробовал кто собирать подобный девайс, есть замечания по работе?
Напишите свое мнение.



Попробовал, лампочки конечно работают (если добавить "DDRB = 255;"). а вот с буфером проблема. не выводит. Делал изменения в 
Код

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

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

uchar   usbFunctionWrite(uchar *data, uchar len)
{
uchar i;
    //PORTB = 0;
    //for(i = 0; i < len; i++)
    //  Buffer[i] = data[i];
    PORTB = 255;            /* записываем байт данных в порт PB */
    return 1;                   /* возвращаем 1 - все данные успешно приняты */
}


По логике вещей, каждая функция вызывается один раз и за этот период мы должны сохранить переданные данные в какой-то промежуточный буфер и провести их обработку. Но не идет. сделал просто индикацию показа светодиода, если код хоть раз выполнит процедуру. Где ошибся и у кого пошло?


PM MAIL   Вверх
alfrerd
Дата 3.1.2010, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



подчистил файл проекта от лишних модификаций, полученных в результате множества опытов, попил чайку, подумал и получил следующий результат:
1. Дополнительный буфер не особо то и нужен. это обусловлено тем, что используется только один тип репорта (занчит одной длинны все данные в нем) и контроллер его запишет в том же самом месте. При повторном вызове данных должен перезаписаться только заголовок. хотя может я и не прав. нужно просмотреть весь код обработки.
2. из Дельфи приложения функция usbFunctionWrite не вызывается. почему? есть одно предположение, но это позже.
3. если вызвать функцию, например через usbtool,  то диод загорается (данные записаны!), но(!) при анализе, что вернула GetFeature() и что записывалось видно очень большое различие.

4. если usbFunctionRead возвращает значение отличное от 1, то устройство просто не работает. 

ЗЫ: по поводу 2 может быть такая вешь, что просто не включена обработка. в usbFunctionSetup записано "/* игнорируем запросы типа вендора, мы их все равно не используем */". То есть если наше приложение посылает запрос по вендору, а не по классу, то этот запрос банально игнорируется. Сделал проверку, не по вендору тоже. Но помимо вендора и класса есть еще standard и reserved.
1 проверить тоже не получилось. поскольку при внесении дополнительного кода в usbFunctionWrite и usbFunctionRead код просто не работает ни с одной из перечисленных программ. Есть у меня смутные сомнения, что вероятно объявленный статичный (и нестатичный) массив располагается во флэш памяти. в CodeVision для этих целей используется специальная директива в декларации. Вероятно и в WinAVR тоже, только не знаю какая.
PM MAIL   Вверх
pvabox
Дата 28.10.2010, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(alfrerd @  3.1.2010,  00:23 Найти цитируемый пост)
Попробовал, лампочки конечно работают (если добавить "DDRB = 255;")


Эта строка уже добавлна при инициализации микроконтроллера
Код


    DDRB  = 0xFF;             /* конфигурируем порт PB для вывода данных */



Добавлено через 6 минут
Написал недавно плагин под Winamp на Delphi для вышеприведенной схемы с дополнительным усилителем тока и мощными светодиодами, получилась замечательная цветомузыка. Ее можно использовать как usb игрушку.
PM MAIL   Вверх
mr_smit
Дата 1.11.2010, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



pvabox, давно мечтаю сделать что то подобное. Насмотрелся на ютубе на кубы из светодиодов.... класс...
Выложи хотя бы фото своего устройства...!!!!! Жутко интересно посмотреть!!! Очень заинтересовало.
PM MAIL   Вверх
mr_smit
Дата 1.11.2010, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да и ещё, объясните эту конструкцию, я чего то не понимаю:

Код

  LEDs:= 0;
  If CheckBox0.Checked then LEDs:= LEDs+1;
  If CheckBox1.Checked then LEDs:= LEDs+2;
  If CheckBox2.Checked then LEDs:= LEDs+4;
  If CheckBox3.Checked then LEDs:= LEDs+8;
  If CheckBox4.Checked then LEDs:= LEDs+16;
  If CheckBox5.Checked then LEDs:= LEDs+32;
  If CheckBox6.Checked then LEDs:= LEDs+64;
  If CheckBox7.Checked then LEDs:= LEDs+128;


Понятно что LEDs это байт, т.е. 8 бит. Причем тут 1,2,4,8,16,32,64,128. С "делфи битами" не приходилось работать.

а если:
Код

If CheckBox7.Checked = false;

то что тогда?????

Может лучше так:
Код

Var
  LED_byte          :   string;
  LED_byte_finish:   byte;
begin
   LED_byte:='00000000';

   If CheckBox0.Checked then LED_byte[0]:='1';
   If CheckBox1.Checked then LED_byte[1]:='1';
   If CheckBox2.Checked then LED_byte[2]:='1';
   If CheckBox3.Checked then LED_byte[3]:='1';
   If CheckBox4.Checked then LED_byte[4]:='1';
   If CheckBox5.Checked then LED_byte[5]:='1';
   If CheckBox6.Checked then LED_byte[6]:='1';
   If CheckBox7.Checked then LED_byte[7]:='1';

   LED_byte_finish:=StrToByte(LED_byte);

Или глупость написал?

Это сообщение отредактировал(а) mr_smit - 1.11.2010, 10:59
PM MAIL   Вверх
xvr
Дата 1.11.2010, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(mr_smit @  1.11.2010,  09:06 Найти цитируемый пост)
Да и ещё, объясните эту конструкцию
Состояние набора checkbox'ов переводится в битовую шкалу

Цитата(mr_smit @  1.11.2010,  09:06 Найти цитируемый пост)
Причем тут 1,2,4,8,16,32,64,128.
Это степени двойки. В бинарном виде это будет
00000001
00000010
00000100
00001000
00010000
00100000
01000000
Если эти значения сложить, то в соответствующей позиции суммы появятся единички

Цитата(mr_smit @  1.11.2010,  09:06 Найти цитируемый пост)
Может лучше так:
У Индусов подсмотрели?

Цитата(mr_smit @  1.11.2010,  09:06 Найти цитируемый пост)
Или глупость написал?
Работать будет, но где то раз в 100 медленнее


PM MAIL   Вверх
tans
Дата 1.11.2010, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А кто-нибудь знает как реализовать передачу данных в c++ buildere. В билдере отсутствует тип TReportData, в какой тип нужно положить передаваемые данные?
PM MAIL   Вверх
mr_smit
Дата 2.11.2010, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо за объяснение. Чего то сам не догадался. Точно.

Цитата(xvr @ 1.11.2010,  11:35)
Цитата(mr_smit @  1.11.2010,  09:06 Найти цитируемый пост)
Может лучше так:
У Индусов подсмотрели?

Ни у кого я не смотрел, сам написал.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

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


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

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

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


 




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


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

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