Чт мар 08, 2012 19:41:04
Чт мар 08, 2012 19:49:20
+Андрей+ писал(а):какие штатные функции есть в ком-пе для работы с такими устройствами
Чт мар 08, 2012 19:52:50
Чт мар 08, 2012 20:02:04
Статья из журнала Радио №4, 2011 г. http://www.radioman-portal.ru/pages/1698/index.shtml+Андрей+ писал(а):Собственно, сам вопрос - какие штатные функции есть в ком-пе для работы с такими устройствами
http://purebasic.mybb.ru/viewtopic.php?id=211 Тут мега 8, но легко можно переделать под 48. Вроде толко изменить имя рег-файла (заменить $regfile = "m8def.dat" на $regfile = "m48def.dat") и перекомпилировать.+Андрей+ писал(а):как реализовать поддержку этого интерфейса на ATmega-48 (имя устройства чтоб еще выводилось
Чт мар 08, 2012 20:10:11
Чт мар 08, 2012 20:14:24
На какой именно?+Андрей+ писал(а):дайте прямую ссылку на проект
Чт мар 08, 2012 20:23:57
Чт мар 08, 2012 20:27:25
Там же внизу первого поста есть ссылка крупными буквами. Скачать файлы (компьютерная программа, прошивка для микроконтроллера и их исходные тексты).+Андрей+ писал(а):Ссылку на проект на меге-8.
В архиве есть пример использования компонента "HID_Lib_Plus.dll" в Дельфи 7.+Андрей+ писал(а):на Дельфи
Чт мар 08, 2012 20:29:00
Чт мар 08, 2012 20:31:01
Чт мар 08, 2012 20:44:33
Чт мар 08, 2012 21:25:51
Structure HIDD_ATTRIBUTES
Size.l
VendorID.u
ProductID.u
VersionNumber.u
EndStructure
Structure PSP_DEVICE_INTERFACE_DETAIL_DATA
cbSize.l
CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
DevicePath.l ; Для x64 платформы.
CompilerElse
DevicePath.c ; Для x86 платформы.
CompilerEndIf
EndStructure
Prototype ProtoHidD_GetHidGuid(*HidGuid.GUID)
Prototype ProtoHidD_GetAttributes(*HidDeviceObject, *Attributes.HIDD_ATTRIBUTES)
Prototype ProtoHidD_GetPreparsedData(*HidDeviceObject, *PreparsedData)
Prototype ProtoHidD_GetFeature(HidHandle, *Buffer, Len)
Prototype ProtoHidD_SetFeature(HidHandle, *Buffer, Len)
Prototype ProtoSetupDiEnumDeviceInterfaces(*DeviceInfoSet, DeviceInfoData.l, *InterfaceClassGuid.GUID, MemberIndex.l, *DeviceInterfaceData.SP_DEVICE_INTERFACE_DATA)
Prototype ProtoSetupDiGetDeviceInterfaceDetail(*DeviceInfoSet, *DeviceInterfaceData.SP_DEVICE_INTERFACE_DATA, DeviceInterfaceDetailData.l, DeviceInterfaceDetailDataSize.l, *RequiredSize, *DeviceInfoData)
hid_Lib=OpenLibrary(#PB_Any, "hid.dll")
Setupapi_Lib=OpenLibrary(#PB_Any, "setupapi.dll")
Global HidD_GetHidGuid.ProtoHidD_GetHidGuid=GetFunction(hid_Lib, "HidD_GetHidGuid")
Global HidD_GetAttributes.ProtoHidD_GetAttributes=GetFunction(hid_Lib, "HidD_GetAttributes")
Global HidD_GetPreparsedData.ProtoHidD_GetPreparsedData=GetFunction(hid_Lib, "HidD_GetPreparsedData")
Global HidD_GetFeature.ProtoHidD_GetFeature=GetFunction(hid_Lib, "HidD_GetFeature")
Global HidD_SetFeature.ProtoHidD_SetFeature=GetFunction(hid_Lib, "HidD_SetFeature")
Global SetupDiEnumDeviceInterfaces.ProtoSetupDiEnumDeviceInterfaces=GetFunction(Setupapi_Lib, "SetupDiEnumDeviceInterfaces")
Global SetupDiGetDeviceInterfaceDetail.ProtoSetupDiGetDeviceInterfaceDetail=GetFunction(Setupapi_Lib, "SetupDiGetDeviceInterfaceDetailA")
Procedure HID_OpenDevice(PID.w, VID.w, VersionNumber.w, Index.w) ; Получение доступа к HID устройству
HidGuid.Guid
devInfoData.SP_DEVICE_INTERFACE_DATA
devInfoData\cbSize = SizeOf(SP_DEVICE_INTERFACE_DATA)
Length.l = 0
CurrentIndex.w=0
Attributes.HIDD_ATTRIBUTES
Security.SECURITY_ATTRIBUTES
Security\nLength=SizeOf(SECURITY_ATTRIBUTES)
Security\bInheritHandle=1
Security\lpSecurityDescriptor = 0
HidD_GetHidGuid(@HidGuid)
hDevInfo=SetupDiGetClassDevs_(@HidGuid,0,0, #DIGCF_PRESENT|#DIGCF_DEVICEINTERFACE)
If hDevInfo=0
ProcedureReturn 0
EndIf
LastDevice = #False
For i=0 To 255
MyDeviceDetected=#False
Result=SetupDiEnumDeviceInterfaces(hDevInfo, 0, @HidGuid, i, @devInfoData)
If Result
Result = SetupDiGetDeviceInterfaceDetail(hDevInfo, @devInfoData, 0, 0,@Length, 0)
*detailData.PSP_DEVICE_INTERFACE_DETAIL_DATA=AllocateMemory(Length)
*detailData\cbSize=SizeOf(PSP_DEVICE_INTERFACE_DETAIL_DATA)
Result = SetupDiGetDeviceInterfaceDetail(hDevInfo, @devInfoData, *detailData, Length+1, @Required, 0)
DevicePath.s=PeekS(@*detailData\DevicePath)
FreeMemory(*detailData)
DeviceHandle=CreateFile_(@DevicePath, #GENERIC_READ|#GENERIC_WRITE, #FILE_SHARE_READ|#FILE_SHARE_WRITE, @Security, #OPEN_EXISTING, 0, 0)
If DeviceHandle>0
Attributes\Size = SizeOf(HIDD_ATTRIBUTES)
Result = HidD_GetAttributes(DeviceHandle, @Attributes)
If Attributes\ProductID=PID And Attributes\VendorID=VID And (Attributes\VersionNumber=VersionNumber Or VersionNumber=-1 )
If CurrentIndex=Index
SetupDiDestroyDeviceInfoList_(hDevInfo)
ProcedureReturn DeviceHandle
Else
CurrentIndex+1
CloseHandle_(DeviceHandle)
EndIf
Else
CloseHandle_(DeviceHandle)
EndIf
EndIf
Else
Break
EndIf
Next i
SetupDiDestroyDeviceInfoList_(hDevInfo)
ProcedureReturn 0
EndProcedure
Procedure HID_CloseDevice(DeviceHandle) ; Закрытие HID устройства.
If DeviceHandle
ProcedureReturn CloseHandle_(DeviceHandle)
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure HID_WriteDevice(DeviceHandle, *buffer, LenBuffer) ; Запись данных в HID устройство
If DeviceHandle=0 Or *buffer=0 Or LenBuffer<=0
ProcedureReturn 0
EndIf
Written.l=0
Result=WriteFile_(DeviceHandle, *buffer, LenBuffer, @Written, 0)
ProcedureReturn Written
EndProcedure
Procedure HID_ReadDevice(DeviceHandle, *buffer, LenBuffer) ; Чтение данных из HID устройства
If DeviceHandle=0 Or *buffer=0 Or LenBuffer<=0
ProcedureReturn 0
EndIf
Written.l=0
Result=ReadFile_(DeviceHandle, *buffer, LenBuffer, @Written, 0)
ProcedureReturn Written
EndProcedure
Procedure HID_GetFeature(DeviceHandle, *buffer, LenBuffer)
If DeviceHandle And *buffer And LenBuffer>0
ProcedureReturn HidD_GetFeature(DeviceHandle, *buffer, LenBuffer)
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure HID_SetFeature(DeviceHandle, *buffer, LenBuffer)
If DeviceHandle And *buffer And LenBuffer>0
ProcedureReturn HidD_SetFeature(DeviceHandle, *buffer, LenBuffer)
Else
ProcedureReturn 0
EndIf
EndProcedure
#USB_PID = $33 ; Идентификаторы программатора PicKit 2
#USB_VID = $4D8
#PK_PACKET_SIZE = 65
Procedure VddOn(Handle) ; Включить питание
Dim OutBuffer.b(#PK_PACKET_SIZE+2)
OutBuffer(0)=0
OutBuffer(1)=$A6 ; EXECUTE_SCRIPT
OutBuffer(2)=2
OutBuffer(3)=$FC ; _VDD_GND_OFF
OutBuffer(4)=$FF ; _VDD_ON
ProcedureReturn HID_WriteDevice(Handle, @OutBuffer(), #PK_PACKET_SIZE)
EndProcedure
Procedure VddOff(Handle) ; Выключить питание
Dim OutBuffer.b(#PK_PACKET_SIZE+2)
OutBuffer(0)=0
OutBuffer(1)=$A6 ; EXECUTE_SCRIPT
OutBuffer(2)=2
OutBuffer(3)=$FE ; _VDD_OFF
OutBuffer(4)=$FD ; _VDD_GND_ON
ProcedureReturn HID_WriteDevice(Handle, @OutBuffer(), #PK_PACKET_SIZE)
EndProcedure
Handle=HID_OpenDevice(#USB_PID, #USB_VID, -1, 0) ; Установка связи с PicKit 2
If Handle
VddOn(Handle) ; Включить питание программируемого МК
Delay(1000) ; Пауза, равная 1000 миллисекунд
VddOff(Handle) ; Выключить питание программируемого МК
HID_CloseDevice(Handle) ; Разыв связи с PicKit 2
Else
MessageRequester("PicKit 2 Test", "Нет связи с PicKit2!", 48)
EndIf
Чт мар 08, 2012 22:36:16
Чт мар 08, 2012 23:04:07
Я же выше давал ссылки.+Андрей+ писал(а):так.
а для МК как поддержку юсб реализовать?
Пт мар 09, 2012 07:43:20
Пт мар 09, 2012 09:30:11
Пт мар 09, 2012 10:25:53
Со стороны хоста, отладка проблем не вызывает. Главное чтобы в IDE был нормальный отладчик.AaNnDdRrEeYy писал(а):как отлаживать подобные устройства.если что то не заработает то трудно понять на какой стороне на стороне хоста или на стороне МК.
Пт мар 09, 2012 10:39:35
Пт мар 09, 2012 11:05:09
Сб мар 10, 2012 00:24:58