AVR 309 разбираем на русском или usb+ПК
AVR 309 разбираем на русском или usb+ПК
наткнулся в сети на переведенный пакет 309 апликуха, но всеравно не могу понять что за что отвечает. Давайте раз и навсегда разберемся с шиной USB.
вот ссылка
http://microsin.ru/content/view/605/44/
переведенный проект здесь
http://microsin.ru/Download.cnt/avr/avr-usb-russian.rar
ну собственно предлагаю начать с проекта examples\hid-data что в архиве лежит.
[/list]
вот ссылка
http://microsin.ru/content/view/605/44/
переведенный проект здесь
http://microsin.ru/Download.cnt/avr/avr-usb-russian.rar
ну собственно предлагаю начать с проекта examples\hid-data что в архиве лежит.
[/list]
- Вложения
-
- howtobegin-step-by-step.doc
- пошаговые инструкции
- (121.5 КБ) 3111 скачиваний
Последний раз редактировалось demson Ср апр 01, 2009 19:13:01, всего редактировалось 1 раз.
в спорах рождается ИСТИНА [AND] flud.
- nictrace
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вс янв 11, 2009 09:29:08
- Откуда: Ярославль
- Контактная информация:
Так, смотрим ф-ю main()...
Она обращается к устройству через вызов usbOpenDevice(), смотрим его.
Эта ф-я вызывает поочередно usb_find_busses(); и usb_find_devices();
Это библиотечные ф-и
в OpenDevice.h мы видим строку:
#include <usb> /* это libusb, см. http://libusb.sourceforge.net/ */
Даже адрес есть!
Так что не обязательно разбираться как это работает. Но если очень хочется - скачайте на указанном сайте доки по библиотечке 
Она обращается к устройству через вызов usbOpenDevice(), смотрим его.
Эта ф-я вызывает поочередно usb_find_busses(); и usb_find_devices();
Это библиотечные ф-и
в OpenDevice.h мы видим строку:
#include <usb> /* это libusb, см. http://libusb.sourceforge.net/ */
Даже адрес есть!
hid-data перехожу на него ведь это почти то что нужно 128 байт- 128 переменных.
итак продолжем рассуждать есть проект готовый передать 128 байт.
(hid-data). уважаемые коты, знающие язык си помогите разобраться что куда.
расскажите что куда и откуда получается
и самое главное как поправить его чтобы писала не в eerom а в переменные - регистры и читала переменные тоже.
для начала было бы идеалом сделать на 5 - 10 переменных.
итак продолжем рассуждать есть проект готовый передать 128 байт.
(hid-data). уважаемые коты, знающие язык си помогите разобраться что куда.
расскажите что куда и откуда получается
и самое главное как поправить его чтобы писала не в eerom а в переменные - регистры и читала переменные тоже.
для начала было бы идеалом сделать на 5 - 10 переменных.
- Вложения
-
- main.c
- сам исходник
- (5.51 КБ) 819 скачиваний
-
- hid-data.zip
- полный набор с исходником и по компа
- (32.41 КБ) 495 скачиваний
в спорах рождается ИСТИНА [AND] flud.
да все с первого ... э ... второго раза завелось. просто забыл фьюзы сначала. а так все ок все работает из под basic. ошибок не наблюдается. ура.
самое важное кварц на 12 Мгц. что еще спрашивайте что интересно отвечу а то чтото ничего сложного не встретил, по этому и рассказать не о чем.
самое важное кварц на 12 Мгц. что еще спрашивайте что интересно отвечу а то чтото ничего сложного не встретил, по этому и рассказать не о чем.
в спорах рождается ИСТИНА [AND] flud.
-
QZ_
- Открыл глаза
- Сообщения: 70
- Зарегистрирован: Чт дек 20, 2007 14:47:31
- Откуда: Челябинск
- Контактная информация:
смотрите исходники моего термометра - я думаю то что вам надо.
http://radiokot.ru/circuit/digital/pcmod/16/
http://radiokot.ru/circuit/digital/pcmod/16/
- __Alexander
- Потрогал лапой паяльник
- Сообщения: 335
- Зарегистрирован: Вт сен 11, 2007 10:27:08
- Откуда: Киев
Или других термометров, которые уже года два в сети валяются и не кому не надо.
http://www.stahlke.org/dan/usb-temperature/
А раз и навсегда разобраться с USB не получится никак. На то там и первая буковка "U". Если ты разработал осцилограф на мегагерц 100, и хочешь передать в реалтайме на комп, то тебе не помогут ни HID, ни CDC, а берем и пишем свои драйвера под свое-же железо.
А если для HID, то есть либра avrusb. Если RS232 - то лучше не морочиться с кодом, а поставить usb-rs232 микруху.
Одним словом - вариантов множество. Для начала надо поставить цель задачи.
http://www.stahlke.org/dan/usb-temperature/
А раз и навсегда разобраться с USB не получится никак. На то там и первая буковка "U". Если ты разработал осцилограф на мегагерц 100, и хочешь передать в реалтайме на комп, то тебе не помогут ни HID, ни CDC, а берем и пишем свои драйвера под свое-же железо.
А если для HID, то есть либра avrusb. Если RS232 - то лучше не морочиться с кодом, а поставить usb-rs232 микруху.
Одним словом - вариантов множество. Для начала надо поставить цель задачи.
как вижу это я
ТЗ
контроллер.
1 разработать эффективный код устройства, способный принимать и отправлять по 5 байт переменных, находящихся часть в eerom часть во flash.
2 разработать систему которая смогла бы отличить несколько устройств, или выписать все данные индетефикации где-то вариантов пять различных.
ПК
3 разработать DLL способную получать от этих 5 устройств информацию ЛИБО написать 5 проектов dll, соответственно ее команды прочесть записать.
4 учесть возможность расширения базы устройств.
за основу можно взять 309 апликуху.
ТЗ
контроллер.
1 разработать эффективный код устройства, способный принимать и отправлять по 5 байт переменных, находящихся часть в eerom часть во flash.
2 разработать систему которая смогла бы отличить несколько устройств, или выписать все данные индетефикации где-то вариантов пять различных.
ПК
3 разработать DLL способную получать от этих 5 устройств информацию ЛИБО написать 5 проектов dll, соответственно ее команды прочесть записать.
4 учесть возможность расширения базы устройств.
за основу можно взять 309 апликуху.
в спорах рождается ИСТИНА [AND] flud.
- __Alexander
- Потрогал лапой паяльник
- Сообщения: 335
- Зарегистрирован: Вт сен 11, 2007 10:27:08
- Откуда: Киев
вот только как это реализовать? всматриваюсь в исходники и все рано ничего не понимаю.
вот смотрю термометр там по 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 байта нули
я так понимаю пишем всего байт от хоста остальное игнорируем
поправьте что не так.
ПО Хоста даже проанализировать не могу, разжуйте пожалуйста.
вот смотрю термометр там по 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, если это был последний кусок */
}
я так понимаю пишем всего байт от хоста остальное игнорируем
поправьте что не так.
ПО Хоста даже проанализировать не могу, разжуйте пожалуйста.
в спорах рождается ИСТИНА [AND] flud.
-
QZ_
- Открыл глаза
- Сообщения: 70
- Зарегистрирован: Чт дек 20, 2007 14:47:31
- Откуда: Челябинск
- Контактная информация:
Размер репорта - 8 байт, там даже для удобства ввел константу REPORT_LEN. Хосту передаю 5 байт, 3 оставшиеся не важно какие.
Как я понял, 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 - собственно длина этих данных.
Код: Выделить всё
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 - выдуманные (или не совсем
Нечто под названием 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 - собственно длина этих данных.
вот под 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 Освобождаем хэндл
----------
в спорах рождается ИСТИНА [AND] flud.