Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » CDC/Virtual COM port кто пробовал?


CDC/Virtual COM port кто пробовал?

Сообщений 1 страница 26 из 26

1

Здравствуйте! Управляю устройствами через COM порт:

Код:
$Regfile="attiny2313a.dat"
$crystal = 8000000
$hwstack=40
$swstack=16
$framesize=32
$baud = 9600


Dim A As String * 4
Dim I As byte
dim E as String * 4
dim D as String * 1
dim x as String * 4
dim B as byte
const on = 1
const off = 0
Declare Sub progg()
Declare Sub Del_buffer()

Ddrb = &HFF
reset PORTB

DO
      Input A
      progg
   if E = "on" and B >= 0 and B <=7 then
      Portb.B = on' : Print "port B"; B ; " on"
   elseif E = "off" and B >= 0 and B <=7 then
      Portb.B = off' : Print "port B"; B ; " off"
      end if
   if A = "res" then
      PORTB = off' : Print "All port off"
   end if
   Del_buffer
loop
End

Sub progg()
   D = "" : X = "" : E = ""
   for I = 0 to len(A)
      x = MID(A , I , 1)
      if asc(x) >= 48 and asc(x) <= 57 Then
         D = D + x
      elseif asc(x) < 48 or asc(x) > 57 Then
         E = E + x
      end if
   Next I
   B = val(D)
 End sub



Sub Del_buffer()
 Do
 B = Inkey()
 Loop Until B = 0
 End Sub


управляю через CMD, по средствам команд

Код:
echo onX>comX
и
echo offX>comX


Хотелось бы исключить из цепочки  физический USB-COM адаптер и реализовать его программно. Может кто направит / подскажет? Справку читал: USB Add On и это Ссылка2 Ничего толком не написано, исходников нет. "virtcom-162.bas" - в папках нет.
Почему хочу отказаться от физического адаптера: CarPC(без физического com-порта) -> с помощью МК будет включаться переферия в авто, по этому нужна минимальная цепочка устройств.

Отредактировано NewUserBascom (2018-06-05 14:59:06)

0

2

NewUserBascom написал(а):

Ничего толком не написано, исходников нет.

https://www.mcselec.com/index.php?page= … p;Itemid=1

USB библиотека. http://weigu.lu/microcontroller/avr_usb_libs/

0

3

Подниму тему. Прочитал все. Т.к. я начинающий ничего не понял соответственно.
нашел еще это:
bascom.at.ua
microsin.net
второй пример вообще на С.
по первому примеру сразу вопрос:

Скрытый текст:

Для просмотра скрытого текста - войдите или зарегистрируйтесь.


"Class defined by interface", иду сюда  usb.org, нашел "02h - Communications and CDC Control", значит пишу в эту строку "Const _usb_devclass =  &h02", здесь "Const _usb_devsubclass = 0" оставляю ноль, будет подкласс "lowcdc".
Более ничего не осилил. Из выше приведенной литературы понял, что нужно делать стек usb<->cdc-232(rs-232).
Собственно прощу еще раз помощи. Знаний не хватает. Примеров usb<->cdc-232 на баскоме не нашел, только hid. Драйвер думаю подойдет этот

hid-устройство не интересно тем, что требует написания отдельной программы на компьютер для управления устройством, нужно чтоб управление осуществлялось через командную строку Linux/Win.

0

4

NewUserBascom написал(а):

Более ничего не осилил.

Тогда проще взять USB-USART на PL2303 или подобной микросхеме. Или взять Arduino Nano где все есть.

0

5

Или M32U , там USB аппаратный есть.

0

6

Пётр написал(а):

Тогда проще взять USB-USART на PL2303 или подобной микросхеме. Или взять Arduino Nano где все есть.


1)

NewUserBascom написал(а):

Почему хочу отказаться от физического адаптера: CarPC(без физического com-порта) -> с помощью МК будет включаться переферия в авто, по этому нужна минимальная цепочка устройств.

:no:

2) Делаю для себя.

3) Пробовал зимой CH340 в машине, при -20, работает через раз. FT232 - куча подделок. PL2303 - тоже куча подделок/отказов.

Собственно, покопаюсь еще сам, если ничего не получится/никто не поможет, тогда куплю у китайцев переходник :rain:

-NMi- написал(а):

Или M32U , там USB аппаратный есть.

Мне столько мощи не нужно, мне нужно всего лишь дергать двумя ножками мк при включении и выключении компа. Аппаратный то есть, но я пока не напишу все рано под него код :dontknow:

Отредактировано NewUserBascom (2018-07-19 15:39:22)

0

7

FT245 и дергайте ножками от компа сколько влезет, МК вообще ненужен. :)

+1

8

RDW написал(а):

FT245 и дергайте ножками от компа сколько влезет, МК вообще ненужен.

Спасибо. Изучал ее давно. com + кастрированный LPT. Но через командную строку как я понял до LPT пинов не достучаться.
Можно и пинами com порта напрямую дергать, но есть один негативный фактор: при загрузке винда беспорядочно дергает его. С lpt не пробовал, но думаю что также.

0

9

Какой лпт? Это чип ввода/вывода, использовать можно где угодно.
245 элементарно управляется через обычный СОМ порт (не используя D2xx драйвера, всё равно скорость неважна).
Винда дергает? Что-то не заметил. Чтобы она начала что-то дергать, она должна как минимум учухать на конце какое-то периферийное устройство (типа мыши), но этот чип никакого отношения к ним не имеет. Т.к. вся суть старых портов как раз носят обратный характер, они должны первыми в винду кинуть запрос, проявить активность.
Да и у чипа предостаточно сигналов управления, без должной настройки извне, трудно заставить его что-то делать.

0

10

NewUserBascom написал(а):

hid-устройство не интересно тем, что требует написания отдельной программы на компьютер для управления устройством

NewUserBascom написал(а):

мне нужно всего лишь дергать двумя ножками мк при включении и выключении компа

Для этого есть программа здесь. http://bascom.at.ua/publ/kak_podruzhit_ … r/1-1-0-34

0

11

RDW написал(а):

элементарно управляется через обычный СОМ порт

если есть примеры командной строки выложите пожалуйста сюда(если не трудно). в гугле не нашел.

Собственно опишу что да как:

Есть car-pc, пока на винде 7. к нему подключен процессор для обработки звука(DSP). Мне нужно включать процессор(и вмести с ним усилители) при запуске программы плеера, а выключать сразу, как я нажал "завершение работы". Почему именно так: сейчас DSP включается от питания на усб(через реле) т.е. как только включаешь комп. Но тупые разработчики DSP не учли(не ввели) задержу на включение, по этому в динамиках "щелк и дребезг", пока не загрузится комп. DSP подключен по оптике. они предлагаю хитрую коробочку для оптики, которая шлет постоянно байты в DSP и "все решается". Но коробочка стоит 20т.р.(а DSP стоит 22т.р.)
В скором времени допилю оболочку на linux(tinycore), по этому не смогу использовать виндовые программы, которые уже "есть"

решение 2

Давно шарился в гугле находил преобразователь на tiny2313 usb<->rs232 в составе устройства, причем написанный на баскоме, но не придал этому значение, т.к. тогда это не нужно было. исходников не предлагали, только готовую прошивку. я еще усмехнулся, зачем это нужно когда есть "китайские чипы". Теперь не могу найти... :dontknow:

Отредактировано NewUserBascom (2018-07-21 11:24:57)

0

12

Попробовал ща 245 на включение, да, проскакивает мусор по шине данных, когда обрабатываешь с него данные через МК (с учетом всех правил/сигналов), этого мусора невидно.
Значит 245 не подходит, ему ещё нужно чем-то ногами дергать, можно заморочиться и одновибратор поставить...но нафиг надо. Если нужна надежность, то придется всё равно ещё МК ставить. Значит не подходит.

На счет проблемы, если я правильно понял, то нужно включать DSP, когда комп уже готов к работе, а DSP гальванически развязан по оптике. Думаю можно сделать проще, приходит на ум 2 варианта:

1. берем USB в котором питание отключает мать, на него вешаем МК как таймер, появляется питание > таймер запускает отсчет с учетом загрузки системы > вкл DSP;
2. похожий вариант на пункт 1, но вешаем на USB любой чип вирт порта, у которого есть признак включения именно USB режима (PWREN) и дальше (как вариант) ставим 555 таймер на задержку включения (или опять МК).

Второй вариант выходит более универсальный, если мать не поддерживает отключения питания по USB.

Если всё-таки хочется избавится от "лишних" чипов в схеме, то придется разбираться в протоколе взаимодействия по USB. Офф либа кстати платная.

Ещё можно извращнуться и попробовать снимать сигнал с оптики на МК и вокруг этого построить интеллектуальный таймер включения и выключения (по отсутствию сигнала).

+1

13

А вообще, что за DSP?

0

14

NewUserBascom написал(а):

Давно шарился в гугле находил преобразователь на tiny2313 usb<->rs232 в составе устройства, причем написанный на баскоме, но не придал этому значение, т.к. тогда это не нужно было. исходников не предлагали, только готовую прошивку. я еще усмехнулся, зачем это нужно когда есть "китайские чипы". Теперь не могу найти... :dontknow:

ЭТО оно?

Отредактировано Andrusha (2018-07-21 17:12:24)

0

15

RDW написал(а):

А вообще, что за DSP?

Audison bit one

RDW написал(а):

На счет проблемы, если я правильно понял, то нужно включать DSP, когда комп уже готов к работе

Не просто когда готов к работе, а именно когда плеер запущен.

схема такая:

включаем комп, DSP молчит, загрузился, запускаем плеер, плеер возвращает код запуска что готов, после этого стартуем DSP.
выключение: в gpo добавляю батник, как только система подала знак что идет на выключение, сразу выключить DSP.

по поводу пуска DSP,

во время загрузки компа по оптике тоже идет грязь. До этого стоял DSP md.lab, с ним таких проблем не было, только звук хуже и зависал иногда... короче в каждом устройстве есть косяки.

Andrusha написал(а):

ЭТО оно?

не совсем, он там был в составе какого то устройства, и было точно написано, что на баскоме написан.

буду пробовать:
RDW написал(а):

Если всё-таки хочется избавится от "лишних" чипов в схеме, то придется разбираться в протоколе взаимодействия по USB. Офф либа кстати платная.

Платная либа интересна тем, что там уже есть поддержка cdc-232(причем стандартный виндовый драйвер)но ограничение - только для аппаратного усб(а это уже менее интересно), буду пробовать разбираться. у линуксоводов спрошу, может они софтом помогут, тогда можно готовый проект на hid-устройстве использовать.

Пока оставлю на лето китайский переходник usb<->com.

Отредактировано NewUserBascom (2018-07-23 00:33:54)

0

16

Вот очень интересно по поводу стека usb<->com, кое что проясняется. но.... опять все на С

не в тему

пока шарился в поисках инфы, наткнулся на параноидальный программатор STK200/300, хочу опробовать, а то сразу на USBAsp сел... :D

код на С для 2313 из другого источника
Код:
/* Name: main.c
 * Project: AVR USB driver for CDC interface on Low-Speed USB
 *              for ATtiny2313
 * Author: Osamu Tamura
 * Creation Date: 2007-10-03
 * Tabsize: 4
 * Copyright: (c) 2007-2009 by Recursion Co., Ltd.
 * License: Proprietary, free under certain conditions. See Documentation.
 *
 */

#include <string.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>

#include "usbdrv.h"
#include "oddebug.h"

#ifdef _AVR_IO2313_H_
#define	UCSRA	USR
#define	UCSRB	UCR
#define	UBRRL	UBRR
#endif

#define HW_CDC_BULK_OUT_SIZE     8
#define HW_CDC_BULK_IN_SIZE      8

/*	Control signals works at 16/20MHz clocks. */
#ifdef USE_UART_CTRL
#define	UART_CTRL_PINPINB
#define	UART_CTRL_DDRDDRB
#define	UART_CTRL_PORTPORTB
#define	UART_CTRL_DTR5
#define	UART_CTRL_RTS6
#define	UART_CTRL_CTS7
#endif

enum {
    SEND_ENCAPSULATED_COMMAND = 0,
    GET_ENCAPSULATED_RESPONSE,
    SET_COMM_FEATURE,
    GET_COMM_FEATURE,
    CLEAR_COMM_FEATURE,
    SET_LINE_CODING = 0x20,
    GET_LINE_CODING,
    SET_CONTROL_LINE_STATE,
    SEND_BREAK
};


static PROGMEM char configDescrCDC[] = {   /* USB configuration descriptor */
    9,          /* sizeof(usbDescrConfig): length of descriptor in bytes */
    USBDESCR_CONFIG,    /* descriptor type */
    67,
    0,          /* total length of data returned (including inlined descriptors) */
    2,          /* number of interfaces in this configuration */
    1,          /* index of this configuration */
    0,          /* configuration name string index */
#if USB_CFG_IS_SELF_POWERED
    (1 << 7) | USBATTR_SELFPOWER,       /* attributes */
#else
    (1 << 7),                           /* attributes */
#endif
    USB_CFG_MAX_BUS_POWER/2,            /* max USB current in 2mA units */

    /* interface descriptor follows inline: */
    9,          /* sizeof(usbDescrInterface): length of descriptor in bytes */
    USBDESCR_INTERFACE, /* descriptor type */
    0,          /* index of this interface */
    0,          /* alternate setting for this interface */
    USB_CFG_HAVE_INTRIN_ENDPOINT,   /* endpoints excl 0: number of endpoint descriptors to follow */
    USB_CFG_INTERFACE_CLASS,
    USB_CFG_INTERFACE_SUBCLASS,
    USB_CFG_INTERFACE_PROTOCOL,
    0,          /* string index for interface */

    /* CDC Class-Specific descriptor */
    5,           /* sizeof(usbDescrCDC_HeaderFn): length of descriptor in bytes */
    0x24,        /* descriptor type */
    0,           /* header functional descriptor */
    0x10, 0x01,

    4,           /* sizeof(usbDescrCDC_AcmFn): length of descriptor in bytes */
    0x24,        /* descriptor type */
    2,           /* abstract control management functional descriptor */
    0x02,        /* SET_LINE_CODING,    GET_LINE_CODING, SET_CONTROL_LINE_STATE    */

    5,           /* sizeof(usbDescrCDC_UnionFn): length of descriptor in bytes */
    0x24,        /* descriptor type */
    6,           /* union functional descriptor */
    0,           /* CDC_COMM_INTF_ID */
    1,           /* CDC_DATA_INTF_ID */

    5,           /* sizeof(usbDescrCDC_CallMgtFn): length of descriptor in bytes */
    0x24,        /* descriptor type */
    1,           /* call management functional descriptor */
    3,           /* allow management on data interface, handles call management by itself */
    1,           /* CDC_DATA_INTF_ID */

    /* Endpoint Descriptor */
    7,           /* sizeof(usbDescrEndpoint) */
    USBDESCR_ENDPOINT,  /* descriptor type = endpoint */
    0x83,        /* IN endpoint number 3 */
    0x03,        /* attrib: Interrupt endpoint */
    8, 0,        /* maximum packet size */
    USB_CFG_INTR_POLL_INTERVAL,        /* in ms */

    /* Interface Descriptor  */
    9,           /* sizeof(usbDescrInterface): length of descriptor in bytes */
    USBDESCR_INTERFACE,           /* descriptor type */
    1,           /* index of this interface */
    0,           /* alternate setting for this interface */
    2,           /* endpoints excl 0: number of endpoint descriptors to follow */
    0x0A,        /* Data Interface Class Codes */
    0,
    0,           /* Data Interface Class Protocol Codes */
    0,           /* string index for interface */

    /* Endpoint Descriptor */
    7,           /* sizeof(usbDescrEndpoint) */
    USBDESCR_ENDPOINT,  /* descriptor type = endpoint */
    0x01,        /* OUT endpoint number 1 */
    0x02,        /* attrib: Bulk endpoint */
    HW_CDC_BULK_OUT_SIZE, 0,        /* maximum packet size */
    0,           /* in ms */

    /* Endpoint Descriptor */
    7,           /* sizeof(usbDescrEndpoint) */
    USBDESCR_ENDPOINT,  /* descriptor type = endpoint */
    0x81,        /* IN endpoint number 1 */
    0x02,        /* attrib: Bulk endpoint */
    HW_CDC_BULK_IN_SIZE, 0,        /* maximum packet size */
    0,           /* in ms */
};


uchar usbFunctionDescriptor(usbRequest_t *rq)
{

    if(rq->wValue.bytes[1] == USBDESCR_DEVICE){
        usbMsgPtr = (uchar *)usbDescriptorDevice;
        return usbDescriptorDevice[0];
    }else{  /* must be config descriptor */
        usbMsgPtr = (uchar *)configDescrCDC;
        return sizeof(configDescrCDC);
    }
}

/* ------------------------------------------------------------------------- */
/* ----------------------------- USB interface ----------------------------- */
/* ------------------------------------------------------------------------- */

static uchar    sendEmptyFrame;
static uchar    modeBuffer[7];

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

    if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS){    /* class request type */

        if( rq->bRequest==GET_LINE_CODING || rq->bRequest==SET_LINE_CODING ){
            return 0xff;
        /*    GET_LINE_CODING -> usbFunctionRead()    */
        /*    SET_LINE_CODING -> usbFunctionWrite()   */
        }
#ifdef USE_UART_CTRL
        if(rq->bRequest==SET_CONTROL_LINE_STATE){
            UART_CTRL_PORT	= (UART_CTRL_PORT&~(1<<UART_CTRL_DTR))|((rq->wValue.word&1)<<UART_CTRL_DTR);
        }
#endif
    }
    return 0;
}

/*---------------------------------------------------------------------------*/
/* usbFunctionRead -  GET_LINE_CODING                                       */
/*---------------------------------------------------------------------------*/

uchar usbFunctionRead( uchar *data, uchar len )
{
    memcpy( data, modeBuffer, 7 );
    return 7;
}

/*---------------------------------------------------------------------------*/
/* usbFunctionWrite  -  SET_LINE_CODING                                      */
/*---------------------------------------------------------------------------*/

#define	BRMIN	600
#define	BRMAX	38400
#define	BSTEP	((F_CPU>>3)/BRMAX)
#define	BRVAL	((unsigned)BSTEP*BRMAX/BRMIN)

uchar usbFunctionWrite( uchar *data, uchar len )
{
	usbWord_t	br;
	unsigned 	baudrate;
	uchari;

	//	set baudrate generator
	baudrate	= *(unsigned *)data;
	for( i=0; baudrate; i++ )
baudrate	-= BRMIN;
	for( br.word=BRVAL; i!=1; i>>=1 )
br.word	>>= 1;
	br.word--;

#ifdef _AVR_IO2313_H_
    UBRRL	= br.bytes[0] << 1;
#else
    UBRRL	= br.bytes[0];
    UBRRH   = br.bytes[1];
    UCSRA   = (1<<U2X);
#endif
    UCSRB	= (1<<RXEN) | (1<<TXEN);

    memcpy( modeBuffer, data, 7 );
    return 1;
}

/*---------------------------------------------------------------------------*/
/* usbFunctionWriteOut	                                     */
/*---------------------------------------------------------------------------*/

#define    TX_SIZE        (HW_CDC_BULK_OUT_SIZE<<1)
#define    TX_MASK        (TX_SIZE-1)
#define    RX_SIZE        (HW_CDC_BULK_IN_SIZE)

static uchar    iwptr, uwptr, irptr;
static uchar    rx_buf[RX_SIZE], tx_buf[TX_SIZE];

void usbFunctionWriteOut( uchar *data, uchar len )
{

    /*  usb -> rs232c:  transmit char    */
    for( ; len; len-- ) {
        tx_buf[uwptr++] = *data++;
        uwptr	&= TX_MASK;
    }

    /*  postpone receiving next data    */
   	usbDisableAllRequests();
}


static void hardwareInit(void)
{
unsigned	i;
ucharj;

    /* activate pull-ups except on USB lines */
    USB_CFG_IOPORT   = (uchar)~((1<<USB_CFG_DMINUS_BIT)|(1<<USB_CFG_DPLUS_BIT));
    /* all pins input except USB (-> USB reset) */
#ifdef USB_CFG_PULLUP_IOPORT    /* use usbDeviceConnect()/usbDeviceDisconnect() if available */
    USBDDR    = 0;    /* we do RESET by deactivating pullup */
    usbDeviceDisconnect();
#else
    USBDDR    = (1<<USB_CFG_DMINUS_BIT)|(1<<USB_CFG_DPLUS_BIT);
#endif

    j = 15;
    while(--j){          /* USB Reset by device only required on Watchdog Reset */
        i = 0;
        while(--i)
            wdt_reset();
    }

#ifdef USB_CFG_PULLUP_IOPORT
    usbDeviceConnect();
#else
    USBDDR    = 0;      /*  remove USB reset condition */
#endif

	PORTB	= 0xff;

#ifdef USE_UART_CTRL
	UART_CTRL_DDR	|= (1<<UART_CTRL_DTR) | (1<<UART_CTRL_RTS);
#endif
}


int main(void)
{
    odDebugInit();
    hardwareInit();
    usbInit();

    sei();
    for(;;){    /* main event loop */
        wdt_reset();
        usbPoll();

        /*    host => device    */
        if( (UCSRA&(1<<UDRE)) && uwptr!=irptr
#ifdef USE_UART_CTRL
&& (UART_CTRL_PIN&(1<<UART_CTRL_CTS))
#endif
) {
            UDR= tx_buf[irptr++];
            irptr   &= TX_MASK;
        }
        if( usbAllRequestsAreDisabled() &&
            ((uwptr-irptr)&TX_MASK)<(TX_SIZE-HW_CDC_BULK_OUT_SIZE) ) {
            usbEnableAllRequests();
        }

        /*    host <= device    */
        if( UCSRA&(1<<RXC) && iwptr<HW_CDC_BULK_IN_SIZE ) {
            rx_buf[iwptr++]	= UDR;
#ifdef USE_UART_CTRL
	if( iwptr==HW_CDC_BULK_IN_SIZE )
UART_CTRL_PORT &= ~(1<<UART_CTRL_RTS);
#endif
        }
        if( usbInterruptIsReady() && (iwptr||sendEmptyFrame) ) {
            usbSetInterrupt(rx_buf, iwptr);
            sendEmptyFrame	= iwptr & HW_CDC_BULK_IN_SIZE;
            iwptr    = 0;
#ifdef USE_UART_CTRL
	UART_CTRL_PORT |= (1<<UART_CTRL_RTS);
#endif
        }
    }
    return 0;
}

Вот почти то что нужно, есть управление из win/linux.

PS

но это меня не утешает, хотелось бы на баскоме....

Отредактировано NewUserBascom (2018-07-23 00:20:36)

0

17

NewUserBascom написал(а):

но это меня не утешает, хотелось бы на баскоме....

Тот код, что на С трудно будет переделать на баском, т.к. там "конструируется" своя конструкция, а конструктора классов или около этого в баскоме нет. Но саму идею можно взять за основу и переписать на баском.
Узрел я там ещё вроде обработчики прерываний, в баскоме это то-же возможно.  Так-что дерзай.

0

18

-NMi- написал(а):

конструктора классов

Где в том коде есть классы?
Их вообще в Си нет.

0

19

-NMi- написал(а):

а конструктора классов или около этого

В перечислялке формируется формат пакета, разве это не конструктор?  Или я затормозил?

0

20

Начнем с дескрипторов:
статья на хабр

Код:
Языковой дескриптор, используемый по умолчанию (индекс 0)
_usb_langdescriptor:
Data 4 , 4 , _usb_desc_string , 09 , 04 , 0 , 0             '&h0409 = English

'***************************** Строковые дескрипторы ***************************

'Эти строковые дескрипторы обязательно должны быть в формате юникода
'Для их создания, можно использовать утилиту "Bascom_USB_descriptor.exe", прилагаемую к статье.

'Дескриптор изготовителя (unicode)
_usb_mandescriptor:
Data 41 , 41 , _usb_desc_string
Data "p" , "u" , "r" , "e" , "-" , "b" , "a" , "s" , "i" , "c" , "."
Data "n" , "a" , "r" , "o" , "d" , "." , "r" , "u" , 0 , 0

'Product Descriptor (unicode)
_usb_proddescriptor:
' HID устройство
Data 31 , 31 , _usb_desc_string
Data &H48 , &H00 , &H49 , &H00 , &H44 , &H00 , &H20 , &H00 , &H43 , &H04
Data &H41 , &H04 , &H42 , &H04 , &H40 , &H04 , &H3E , &H04 , &H39 , &H04
Data &H41 , &H04 , &H42 , &H04 , &H32 , &H04 , &H3E , &H04 , &H00 , 0 , 0

' Дескриптор серийного номера (unicode)
_usb_numdescriptor:
Data 6 , 6 , _usb_desc_string
Data "2" , 0 , 0


Bascom_USB_descriptor.exe - нигде не нашел. может кто поделится? или как генерировать без этой проги?

:offtop:

полистав интернет понял одно, после того как товарищ ollopa's написал свою библиотеку, больше никто шагов вперед не делал

:offtop:

попробовал этотпроект в железе, реально работает устройство!

Отредактировано NewUserBascom (2018-07-23 14:56:58)

0

21

-NMi- написал(а):

В перечислялке формируется формат пакета, разве это не конструктор?

Это просто перечисление (присвоение цифр константам).

Код:
enum {
    SEND_ENCAPSULATED_COMMAND = 0,
    GET_ENCAPSULATED_RESPONSE,
    SET_COMM_FEATURE,
    GET_COMM_FEATURE,
    CLEAR_COMM_FEATURE,
    SET_LINE_CODING = 0x20,
    GET_LINE_CODING,
    SET_CONTROL_LINE_STATE,
    SEND_BREAK
};

В баскоме легко реализуется.

NewUserBascom написал(а):

Bascom_USB_descriptor.exe - нигде не нашел.

http://rgho.st/6v8kBl76S

Исходник
Код:
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Text_0
  #String_0
  #Text_1
  #String_1
  #Button
EndEnumeration

Procedure Open_Window_0()
 If OpenWindow(#Window_0, 269, 281, 310, 254, "Bascom  USB  Ascii  —> Unicode",  #PB_Window_MinimizeGadget|#PB_Window_Invisible|#PB_Window_ScreenCentered )
   TextGadget(#Text_0, 5, 12, 48, 15, "Текст:")
   StringGadget(#String_0, 5, 28, 300, 90, "",#ES_MULTILINE|#ES_AUTOVSCROLL|#WS_VSCROLL|#ESB_DISABLE_LEFT|#ESB_DISABLE_RIGHT)
   ButtonGadget(#Button,130,124,90,24,"Преобразовать")
   TextGadget(#Text_1, 5, 138, 70, 15, "Код Bascom:")
   StringGadget(#String_1, 5, 154, 300, 95, "", 2099207)
   HideWindow(#Window_0,0)
 EndIf
EndProcedure

Open_Window_0()
Repeat
   Event=WaitWindowEvent()
   If Event=#PB_Event_Gadget
     If EventGadget()=#Button
       Text.s=GetGadgetText(#String_0)
       If Text<>""
               LenUnicode=StringByteLength(Text, #PB_Unicode)
               *mem=AllocateMemory(LenUnicode+2)
               PokeS(*mem,Text,-1,#PB_Unicode)
               Code.s="' "+Text+Chr(13)+Chr(10)
               Code+"Data "+Str(LenUnicode+2)+" , "+Str(LenUnicode+2)+" , _usb_desc_string"
               i=0
               While i<=LenUnicode
                 x=0 : Code+Chr(13)+Chr(10)+"Data &H"+RSet(Hex(PeekA(*mem+i),#PB_Ascii),2,"0")
                 i+1
                 Repeat
                   If i>LenUnicode
                     Break
                   EndIf
                   Code+" , &H"+RSet(Hex(PeekA(*mem+i),#PB_Ascii),2,"0")
                   i+1
                   x+1
                   If i>LenUnicode Or x>8
                     Break
                   EndIf
                 ForEver
               Wend
               Code+" , 0"
               FreeMemory(*mem)
               SetGadgetText(#String_1,Code)
       Else
         MessageRequester("", "Нужно ввести текст!", #MB_OK|#MB_ICONWARNING)
       EndIf
     EndIf
   EndIf
Until Event=#PB_Event_CloseWindow
NewUserBascom написал(а):

больше никто шагов вперед не делал

Делали, для аппаратного USB. http://weigu.lu/microcontroller/avr_usb_libs/ Mrshilov доработал ее.

+1

22

Пётр написал(а):

Делали, для аппаратного USB.

ну так то у нас не аппаратный))) эту статью изучал.

:offtop:

почему на С так много примеров? а на баскоме нет... вот бы прогу для порта кода на С в баском кто нибудь придумал....

0

23

Вам выше либы накидали как на офф либы (платные) баскома для работы с USB (правда аппаратные), так и на софтварные (на тиньках и прочего хлама в инете навалом).
Я пробовал только бесплатную версию, работало (до платной вроде добрался, но больно малый выбор AVR с USB (особенно у простых, не хмег).

0

24

Собственно, полностью изучил ресурс: recursion.jp
понял одно: над этим проектом билось не мало грамотных людей, и то что написано на текущий момент еще даже не совершенно. Но все же проект остановился на этом уровне.

:offtop:

Всем спасибо кто принимал участие в обсуждении! Это не мой уровень, буду пробовать использовать usb hid, с программой под linux тоже не все так просто, придется пока посидеть на винде. Тему можно удалить.

Отредактировано NewUserBascom (2018-07-30 00:25:36)

0

25

На Си есть прекрасная библиотека LUFA. Совершенно бесплатная. Там куча примеров всех вариантов. Берешь нужный и адаптируешь под себя. Я правда пользовался только HID, но думаю, что и остальные раскусываются также легко.

0

26

sva-don написал(а):

На Си есть прекрасная библиотека LUFA.

Речь шла о программной эмуляции. Тогда нужно рекомендовать библиотеку V-USB.

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » CDC/Virtual COM port кто пробовал?