Страница 1 из 2
AVR 309 разбираем на русском или usb+ПК
Добавлено: Пн янв 05, 2009 13:02:24
demson
наткнулся в сети на переведенный пакет 309 апликуха, но всеравно не могу понять что за что отвечает. Давайте раз и навсегда разберемся с шиной USB.
вот ссылка
http://microsin.ru/content/view/605/44/
переведенный проект здесь
http://microsin.ru/Download.cnt/avr/avr-usb-russian.rar
ну собственно предлагаю начать с проекта examples\hid-data что в архиве лежит.
[/list]
Добавлено: Вт янв 13, 2009 07:09:10
nictrace
И какие, собственно, вопросы?

Добавлено: Ср янв 14, 2009 22:36:09
demson
прием передача с компа непонятно как взаимодействует программа, точнее не вникну в алгоритм взаимодействия с программой.
Добавлено: Чт янв 22, 2009 17:18:54
nictrace
Так, смотрим ф-ю main()...
Она обращается к устройству через вызов usbOpenDevice(), смотрим его.
Эта ф-я вызывает поочередно usb_find_busses(); и usb_find_devices();
Это библиотечные ф-и
в OpenDevice.h мы видим строку:
#include <usb> /* это libusb, см.
http://libusb.sourceforge.net/ */
Даже адрес есть!

Так что не обязательно разбираться как это работает. Но если очень хочется - скачайте на указанном сайте доки по библиотечке

Добавлено: Пн янв 26, 2009 14:07:32
demson
а библиотека LibUSB-Win32 под basiс работает?
Добавлено: Ср апр 01, 2009 19:22:24
demson
hid-data перехожу на него ведь это почти то что нужно 128 байт- 128 переменных.
итак продолжем рассуждать есть проект готовый передать 128 байт.
(hid-data). уважаемые коты, знающие язык си помогите разобраться что куда.
расскажите что куда и откуда получается
и самое главное как поправить его чтобы писала не в eerom а в переменные - регистры и читала переменные тоже.
для начала было бы идеалом сделать на 5 - 10 переменных.
Добавлено: Пт апр 03, 2009 16:30:16
saschai
Пытался сделать переходник на меге8 ЮСБ-КОМ, по выше приведенной методе, в итоге получил AVR 309 USB to UART protocol converter, понял, что чавой то не то

долго ломал голову, что с этим добром делать, но ком порт так и не получилсь. По др. схеме все, ОК.
Добавлено: Ср апр 08, 2009 14:00:15
alltihom
У вас заработал USB > RS232? А расскажите поподробней что и куда.

Добавлено: Ср апр 08, 2009 19:38:30
demson
да все с первого ... э ... второго раза завелось. просто забыл фьюзы сначала. а так все ок все работает из под basic. ошибок не наблюдается. ура.
самое важное кварц на 12 Мгц. что еще спрашивайте что интересно отвечу а то чтото ничего сложного не встретил, по этому и рассказать не о чем.
Добавлено: Чт апр 16, 2009 18:10:28
demson
а кто знает или пробывал что будет если две avr 309 воткнуть в usb?
Добавлено: Чт апр 16, 2009 19:44:15
QZ_
смотрите исходники моего термометра - я думаю то что вам надо.
http://radiokot.ru/circuit/digital/pcmod/16/
Добавлено: Пт апр 17, 2009 00:02:34
__Alexander
Или других термометров, которые уже года два в сети валяются и не кому не надо.
http://www.stahlke.org/dan/usb-temperature/
А раз и навсегда разобраться с USB не получится никак. На то там и первая буковка "U". Если ты разработал осцилограф на мегагерц 100, и хочешь передать в реалтайме на комп, то тебе не помогут ни HID, ни CDC, а берем и пишем свои драйвера под свое-же железо.
А если для HID, то есть либра avrusb. Если RS232 - то лучше не морочиться с кодом, а поставить usb-rs232 микруху.
Одним словом - вариантов множество. Для начала надо поставить цель задачи.
Добавлено: Пт апр 17, 2009 08:56:56
demson
как вижу это я
ТЗ
контроллер.
1 разработать эффективный код устройства, способный принимать и отправлять по 5 байт переменных, находящихся часть в eerom часть во flash.
2 разработать систему которая смогла бы отличить несколько устройств, или выписать все данные индетефикации где-то вариантов пять различных.
ПК
3 разработать DLL способную получать от этих 5 устройств информацию ЛИБО написать 5 проектов dll, соответственно ее команды прочесть записать.
4 учесть возможность расширения базы устройств.
за основу можно взять 309 апликуху.
Добавлено: Сб апр 18, 2009 22:54:33
__Alexander
Для 5 байт и пяти устройств хватит и HID, только вот идентификатор какой винда присвоит... короче, с софта на компе точно надо знать свои устройства, т.е. для расширения последних надо заранее подготовить базу. Хотя не факт. По мастдаю не подскажу.
Добавлено: Сб апр 18, 2009 23:27:40
demson
а написать dll под hid реально? или что либо такое
тоесть будет функция f1 и устройство U1 U2 ...
обратимся U1(f1)
это было-бы наилучшим вариантом, поскольку вызвать ее можно из любово языка программирования.
Добавлено: Вс апр 19, 2009 15:33:46
QZ_
да, такое реально
Добавлено: Вс апр 19, 2009 16:21:04
demson
вот только как это реализовать? всматриваюсь в исходники и все рано ничего не понимаю.
вот смотрю термометр там по 128 байт обмен
[list=]uchar usbFunctionRead(uchar *data, uchar len)
{
data[0] = Temperature;
data[1] = szero;
data[2] = cel_frac_bits;
data[3] = cback;
data[4] = owstate;
return len;
}[/list]
то есть обмен по байту 5 байт
дата это принятый репорт 128 байт
то-есть берем первые 5 байт - остальные 123 байта нули
uchar usbFunctionWrite(uchar *data, uchar len)
{
if (mode == 0) {
switch (data[0]) {
case 21:
mode = 2; //mess
owstate = 0;
break;
case 3: //check device
cback = data[1] + 1;
break;
case 89:
mode = 1; //get temp
break;
}
}
return 1; /* возврат 1, если это был последний кусок */
}
я так понимаю пишем всего байт от хоста остальное игнорируем
поправьте что не так.
ПО Хоста даже проанализировать не могу, разжуйте пожалуйста.
Добавлено: Вс апр 19, 2009 22:23:59
QZ_
Размер репорта -
8 байт, там даже для удобства ввел константу REPORT_LEN. Хосту передаю 5 байт, 3 оставшиеся не важно какие.
Код: Выделить всё
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, REPORT_LEN, // REPORT_COUNT (8)
0x09, 0x00, // USAGE (Undefined)
0xb2, 0x02, 0x01, // FEATURE (Data,Var,Abs,Buf)
0xc0 // END_COLLECTION
};
Как я понял, REPORT_SIZE - это собственно длина одной посылки, в байтах. А REPORT_COUNT - это общее число байт в репорте (в примере hid_data - 128).
Хост отправляет такой же репорт (8 байт), в 0 байте команда. Проверка текущего режима (mode) для игнорирования повторной отправки одной команды. Дальше простой выбор. Условные коды 21,3,89 - выдуманные (или не совсем

), можно сделать просто 1,2,3 (в хосте тоже поправить).
Нечто под названием check device - инкремент второго байта из посылки и возврат этого значения через cback. Таким макаром я 100% определяю отсутствие устройства

, потому как были проблемы с этим.
owstate - текущее состояние линии 1-ware. В хосте ниакак не используется (или почти никак

).
Temperature - целое значение абс. величины температуры.
szero - знак (0 +/1 -)
cel_frac_bits - младшие биты абс. величины температуры (дробная часть).
Про хост:
Прием репорта:
WorkDevice.GetFeature(MyReport, FeatureReportLen); При успехе возвращает true.
MyReport - буффер, куда копируются данные.
FeatureReportLen - собственно длина этих данных.
Точно также отправка репорта:
WorkDevice.SetFeature(MyReport, FeatureReportLen); При успехе возвращает true.
MyReport - буффер, откуда берутся данные.
FeatureReportLen - собственно длина этих данных.
Добавлено: Ср апр 22, 2009 13:48:11
demson
dll под hid реально?
что-то я попутал там же можно к любому устройству обратиться dll библиотека уже написана под windows.
а как происходит поиск устройства? через возврат второго байта или по Vendor'у
Добавлено: Ср апр 22, 2009 13:57:28
demson
вот под winapi
Типичная процедура общения с custom USB device из юзер-моды
----------
АПИ DLL Смысл
----------
HidD_GetHidGuid hid.dll Получить GUID для HID класса
SetupDiGetClassDevs setupapi.dll Получить информацию о классе устройства
SetupDiEnumDeviceInterfaces setupapi.dll Получить информацию об устройстве
SetupDiGetDeviceInterfaceDetail setupapi.dll Получить путь к устройству
SetupDiDestroyDeviceInfoList setupapi.dll Освободить ресурсы используемые SetupDiGetClassDevs
CreateFile kernel32.dll Открываем коммуникационный файл
HidD_GetAttributes hid.dll Получаем Vendor ID, Product ID, Version Number.
HidD_GetPreparsedData hid.dll Получаем хэндл к буферу с инфой о возможностях устройства
HidP_GetCaps hid.dll Получаем структуру объясняющую возможности устройства
HidD_FreePreparsedData hid.dll Освобождаем ресурсы используемые HidD_GetPreparsedData
WriteFile kernel32.dll Пишем выходной репорт в девайс
ReadFile kernel32.dll Читаем входной репорт из девайса
HidD_SetFeature hid.dll Передаем фичи-репорт в девайс
HidD_GetFeature hid.dll Читаем фичи-репорт из девайса
CloseHandle kernel32.dll Освобождаем хэндл
----------