USB Cihaz

Başlatan muhittin_kaplan, 01 Haziran 2008, 20:09:13

muhittin_kaplan

Evet Arkadaşlar Aradım taradım ama birtürlü bulamadım
18F4550 ile bir USB klavye yada Mouse yapmak istiyorum. Easy HID denilen bir programla ilgili olarak çalışmalarım oldu. Genel Olarak Bir Klavye Çalışması Nasıl Olur Yardım ederseniz Sevinirim

ErsinErce

Protonun sitesine bakarsanız ilgili örnekleri bulabilirsiniz.
Ama bi yedeğide burda bulunsun Mouse la ilgili örnek zaten var

Klavye için gerekli örnek kodlar;

'****************************************************************
'*  Name    : USBPROJECT.BAS                                    *
'*  Author  : Cynetron				                *
'*  Notice  : Copyright (c) 2008 				*
'*          : All Rights Reserved                               *
'*  Date    : 26.02.2008                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

' select MCU and clock speed                                                                                                                                                                                                                                   
Device = 18F2550
XTAL = 48	

' descriptor file, located in \inc\usb_18 - a copy
' is located in the same folder as this file	
USB_DESCRIPTOR = "KBDDESC.INC"

' USB buffer...
Symbol USBBufferSizeMax = 8
Symbol USBBufferSizeTX  = 8
Symbol USBBufferSizeRX  = 8
Dim    USBBuffer[USBBufferSizeMax] As Byte

' some useful flags...
Dim PP0 As Byte SYSTEM        ' USBPOLL status return
Symbol CARRY_FLAG = STATUS.0  ' high if microcontroller does not have control over the buffer
Symbol ATTACHED_STATE = 6     ' is USB attached
Symbol TRNIF = UIR.3		  ' low if USB Busy
Dim POSITION As Word
     
' ************************************************************
' * program starts here...                                   *
' ************************************************************
ProgramStart:
   GoSub AttachToUSB
   
' ************************************************************
' * main program loop                                        *
' ************************************************************
ProgramLoop:

USBPoll
POSITION = POSITION + 1
GoSub Choose
GoSub DoUSBOut
Goto ProgramLoop
Choose:
Select POSITION
Case 0
Str USBBuffer = 0,0,0,0,0,0,0,0       'Key 0
return

Case 1
Str USBBuffer = 0,0,$21,0,0,0,0,0    'Key 4
return

Case 2
Str USBBuffer = 0,0,$22,0,0,0,0,0   'Key 5 
return
ENDSELECT
' ************************************************************
' * receive data from the USB bus                            *
' ************************************************************
DoUSBIn:
   USBIn 1, USBBuffer, USBBufferSizeRX, DoUSBIn
   Return
   
' ************************************************************
' * transmit data                                            *
' ************************************************************
DoUSBOut:
   Repeat								
      USBPoll		
   Until PP0 = ATTACHED_STATE
   USBOut 1, USBBuffer, USBBufferSizeTX, DoUSBOut
   Return

' ************************************************************
' * wait for USB interface to attach                         *
' ************************************************************
AttachToUSB:
   Repeat								
      USBPoll		
   Until PP0 = ATTACHED_STATE
   Return


LIST
;	KBDDESC.INC
;
;
; This file contains a set of descriptors for a STANDARD Keyboard.
;
#DEFINE	__EP0_BUFF_SIZE			8	; 8, 16, 32, or 64
#DEFINE	__MAX_NUM_INT			1	; For tracking Alternate Setting
#DEFINE	__MAX_EP_NUMBER			1	; UEP1
#DEFINE	__NUM_CONFIGURATIONS	1
#DEFINE	__NUM_INTERFACES		1

#DEFINE	__MODE_PP			_PPBM0
#DEFINE	__UCFG_VAL			_PUEN | _TRINT | _FS | __MODE_PP	; Full-speed

#DEFINE __USB_USE_HID				; Inform the rest of the library subroutines that we're using a HID interface

; HID
; Endpoints Allocation
#DEFINE	__HID_INTF_ID			0
#DEFINE	__HID_UEP				UEP1
#DEFINE	__HID_BD_OUT			__ep1Bo
#DEFINE	__HID_INT_OUT_EP_SIZE	8
#DEFINE	__HID_BD_IN				__ep1Bi
#DEFINE	__HID_INT_IN_EP_SIZE	8
#DEFINE	__HID_NUM_OF_DSC		1

; ------------------------------------------------------------------------------
; This table is polled by the host immediately after USB Reset has been released.
; This table defines the maximum packet size EP0 can take.
; See section 9.6.1 of the Rev 1.0 USB specification.
; These fields are application dependent to be modified to meet your specifications.
;
__DeviceDescriptor
	retlw	(__EndDeviceDescriptor - __DeviceDescriptor) / 2	; bLength Length of this descriptor
	retlw	__DSC_DEV				; bDescType This is a DEVICE descriptor
	dt		0x10, 0x01				; bcdUSB Revision 1.10 low byte, high byte
	retlw	0x00					; bDeviceClass
	retlw	0x00					; bDeviceSubClass
	retlw	0x00					; bDeviceProtocol
	retlw	__EP0_BUFF_SIZE			; bMaxPacketSize for EP0
	dt		0xD8, 0x04				; idVendor - 0x04D8 is Microchip VENDOR ID low byte, high byte
	dt		0x00, 0x00				; idProduct low byte, high byte
	dt		0x01, 0x00				; bcdDevice low byte, high byte
	retlw	0x01					; iManufacturer
	retlw	0x02					; iProduct
	retlw	0x03					; iSerialNumber
	retlw	__NUM_CONFIGURATIONS	; bNumConfigurations
__EndDeviceDescriptor

; ------------------------------------------------------------------------------
; This table is retrieved by the host after the address has been set.
; This table defines the configurations available for the device.
; See section 9.6.2 of the Rev 1.0 USB specification (page 184).
; These fields are application dependent to be modified to meet your specifications.
;
; Configuration pointer table
__USB_CD_Ptr
__Configs
	db	Low ___Config1, High ___Config1
	db	Low ___Config1, High ___Config1

; Configuration Descriptor
___Config1
	retlw	(__Interface1 - ___Config1) / 2	; bLength Length of this descriptor
	retlw	__DSC_CFG						; bDescType2 = CONFIGURATION
__Config1Len
	retlw	Low ((__EndConfig1-___Config1) / 2)	; Length of this configuration
	retlw	High ((__EndConfig1 - ___Config1) / 2)
	retlw	0x01							; bNumInterfaces Number of interfaces
	retlw	0x01							; bConfigValue Configuration Value
	retlw	0x04							; iConfigString Index for this config = #01
	retlw	0xA0							; bmAttributes attributes - bus powered
	retlw	0x50							; Max power consumption (2X mA)
__Interface1
	retlw	(__HIDDescriptor1 - __Interface1) / 2	; length of descriptor
	retlw	__DSC_INTF
	retlw	0x00							; number of interface, 0 based array
	retlw	0x00							; alternate setting
	retlw	0x01							; number of endpoints used in this interface
	retlw	0x03							; interface CLASS - assigned by the USB
	retlw	0x01							; boot device
	retlw	0x01							; interface protocol - Keyboard
	retlw	0x05							; index to string descriptor that describes this interface
__HIDDescriptor1
	retlw	(__Endpoint1 - __HIDDescriptor1) / 2	; descriptor size (9 bytes)
	retlw	0x21							; descriptor type (HID)
	retlw	0x00							; HID CLASS release number (1.00)
	retlw	0x01
	retlw	0x00							; Localised country code (none)
	retlw	0x01							; Number of HID CLASS descriptor to follow (1)
	retlw	0x22							; Report descriptor type (HID)
__ReportDescriptor1Len
	retlw	Low ((__EndReportDescriptor1 - __ReportDescriptor1) / 2)
	retlw	High ((__EndReportDescriptor1 - __ReportDescriptor1) / 2)
__Endpoint1
	retlw	(__EndConfig1 - __Endpoint1) / 2	; length of descriptor
	retlw	__DSC_EP
	retlw	0x81							; EP1, IN
	retlw	0x03							; Interrupt
	retlw	0x08							; This should be the size of the endpoint buffer
	retlw	0x00
	retlw	0x0A							; polling interval (10ms)
__EndConfig1

__ReportDescriptor1
	retlw   0x05
	retlw   0x01    ; usage page (generic desktop)
	retlw   0x09
	retlw   0x06    ; usage (keyboard)
	retlw   0xA1
	retlw   0x01    ; collection (application)
	retlw   0x05
	retlw   0x07    ;   usage (Key codes)
	retlw   0x19
	retlw   0xE0    ;   usage minimum (224)
	retlw   0x29
	retlw   0xE7    ;   usage minimum (231)
	retlw   0x15
	retlw   0x00    ;     logical minimum (0)
	retlw   0x25
	retlw   0x01    ;     logical maximum (1)
	retlw   0x75
	retlw   0x01    ;     report size (1)
	retlw   0x95
	retlw   0x08    ;     report count (8)
	retlw   0x81
	retlw   0x02    ;     Input (data,variable,absolute)
	retlw   0x95
	retlw   0x01    ;     report count (1)
	retlw   0x75
	retlw   0x08    ;     report size (8)
	retlw   0x81
	retlw   0x01    ;     Input (constant)
	retlw   0x95
	retlw   0x05    ;     report count (5)
	retlw   0x75
	retlw   0x01    ;     report size (1)
	retlw   0x05
	retlw   0x08    ;     usage page (page# for leds)
	retlw   0x19
	retlw   0x01    ;     Usage minimum (1)
	retlw   0x29
	retlw   0x05    ;     Usage maximum (5)
	retlw   0x91
	retlw   0x02    ;     output (data,variable,absolute)
	retlw   0x95
	retlw   0x01    ;     report count (1)
	retlw   0x75
	retlw   0x03    ;     report size (3)
	retlw   0x91
	retlw   0x01    ;     output (constant)
	retlw   0x95
	retlw   0x06    ;     report count (6)
	retlw   0x75
	retlw   0x08    ;     report size (8)
	retlw   0x15
	retlw   0x00    ;     logical minimum (0)
	retlw   0x25
	retlw   0x65    ;     logical maximum (101)
	retlw   0x05
	retlw   0x07    ;     usage page (keycodes)
	retlw   0x19
	retlw   0x00    ;     usage minimum (0)
	retlw   0x29
	retlw   0x65    ;     usage maximum (101)
	retlw   0x81
	retlw   0x00    ;     input (data, array)	
	retlw   0xC0    ;   end collection
__EndReportDescriptor1


__langids
	retlw   Low __lang_1
	retlw   High __lang_1
	retlw   Low __lang_2      				; String indexes of different languages
	retlw   High __lang_2

__lang_1									; English
	retlw   Low  __String0    				; __langids
	retlw   High __String0
	retlw   Low  __String1_l1    
	retlw   High __String1_l1
	retlw   Low  __String2_l1
	retlw   High __String2_l1

__lang_2
	retlw   Low  __String0    				; Also point to LangID
	retlw   High __String0
	retlw   Low  __String1_l2
	retlw   High __String1_l2
	retlw   Low  __String2_l2
	retlw   High __String2_l2

; String pointer table
__USB_SD_Ptr
__Strings
	db	Low __String0, High __String0
	db	Low __String1_l1, High __String1_l1
	db	Low __String2_l1, High __String2_l1


__String0
	retlw   (__String1_l1 - __String0) / 2	; Length of string 
	retlw   __DSC_STR						; Descriptor type 3
	dt   0x09, 0x04    						; Language ID (0x0409 as defined by MS)
	dt   0x04, 0x08							; Some other language ID for testing

__String1_l1
	retlw   (__String2_l1 - __String1_l1) / 2	; Length of string
	retlw   __DSC_STR		; Descriptor type 3
	dt	 'C', 0, 'y', 0, 'n', 0, 'e', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0
__String2_l1
	retlw   (__String3_l1 - __String2_l1) / 2
	retlw   __DSC_STR
	dt   'U', 0, 'S', 0, 'B', 0, ' ', 0, 'K', 0, 'e', 0, 'y', 0, 'b', 0, 'o', 0, 'a', 0, 'r', 0, 'd', 0
__String3_l1

__String1_l2			; Language 2, Chinese. Strings can be totally different than english
	retlw   (__String2_l2 - __String1_l2) / 2	; Length of string
	retlw   __DSC_STR		; Descriptor type 3
	dt	 'C', 0, 'y', 0, 'n', 0, 'e', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0
__String2_l2
	retlw   (__String3_l2 - __String2_l2) / 2
	retlw   __DSC_STR
	dt   'U', 0, 'S', 0, 'B', 0, ' ', 0, 'K', 0, 'e', 0, 'y', 0, 'b', 0, 'o', 0, 'a', 0, 'r', 0, 'd', 0
__String3_l2

muhittin_kaplan

deneyemedim ama teşekkür ederim

muhittin_kaplan

Peki Pc tarafında herhangi birşey yapmamız gerekmiyormu ?

ErsinErce

Hayır HID device olarak otomatik tanıyor driver yüklemenize gerek kalmıyor ve gönderdiğiniz karakterleri direk almaya başlıyor.

İyi Çalışmalar


muhittin_kaplan

herkese teşekkür ederim
2550 yada 4550 de kodlarda fark yaparmı tanımlamalar haricinde

muhittin_kaplan

Yardımlarınız İçin Tşk Ederim.
Klavye için Kodları çalıştırdım İstediğim Tuş u gönderiyorum.(Bilgiyi Değil)
Yanlız Pc den Herhangi bir Bilgiyi PIC e Gönderemedim. Bir Butona basınca herhangi bir ledi Yaksam Dahi Olur.(Pc Tarafında Kodlama Ve Programlamada Problem Yaşamam) Usbin fonksiyonunu aramadığım yer kalmadı nerde hata yapıyorum anlamadım.
İyi Çalışmalar.

wsxwsx

Pcde kullanacağın program nedir?

easyhid ile otomatik kod üretince bunların örneğide oluşuyor. kodun eksiği şudur. içinde ne yapıplmasını anlatmış ama yapmamış
send (buffer, boyut) gibi gönderirsin demiş

muhittin_kaplan

istediğim datayı gönderip bunu lcd de göstermek yada istediğim port a bağlı led i yakmak
vb60, .net 2005 ve .net 2008 yüklü burada sıkıntı yaşamam yani dll kullanımında vs de

wsxwsx

DErleyici USB demoları ve easy hid  tarafından üretilen otomatik projeler çalışıyor. öncelikle bunlardan 1 adet deneyin. zor bir şeyyok. göreceksiniz. Ben pice sayı gönderdim mesela 2 gönderdim pic bunu 2 ile çarpıp geri gönderdi. ekrana yazdım. zor birşey yok. demoları deneyin.

muhittin_kaplan

sitede jabba adında bir projede kullanılmış bir dll dosyasıyla bağlantı kurdum. Bunu vb.2005 kullanarak yaptım. yanlız dikkat ettim rastgele zamanlarda pic e göndermede pic tarafı yant vermiyor.ve progam duruyor. şimdi burada akıma gelen osc ile ilgili bir prblem olması.(20 MHz lik cristall kullanıyorum)
xtall=48 komutu nu kullandığımda normal olarak çalışıyor (bir müddet sonrayanıt vermeyerek) -20Mhz crystall-
xtall=20 komutunu kullanıyorum (cristal im 20 MHz olduğu için) burada hiç usb tanımıyor
bundan kaynaklanabilir mi ?

wsxwsx

O arkadaş konuyu gereksiz yere dallandırmış. hazır , saat gibi çalışan örneklere bakın pişman olmazsınız. derinlemesine bilgi işinzii zorlaştırır.

Bread bord üzerinde yapıp  vbasic demoyu çalıştırman sadece 10 dakikanı alır. led yak söndür , müzik çaldır hiç sorun değil. pic senin gönderdiğin komuta göre uygun göreceğin işi yapar

muhittin_kaplan

Projeyi Çalıştırdım Yanzlı Dediğim Gibi Belli Bir Müddet Sonra İletişim Kesiliyor.. Onun Sebebi OSC olabilirmi Acaba. Birde vb60 değilde .net daha çok işimi göreceği için onu kullanmayı tercih ettim.

wsxwsx

böyle bir sorun vardı  hatırladım. sebebi şu .en az 1 ms içinde usb rutini çağırılması gerekiyor. eğer çok gecikilirse bağlantı kesiliyor. bu amaçla sınırsız bir döngü gerekir. Bir de MCLR pinini beslemeye bağlamak, usb 3.3 volt üreten pine 470n F bağlamak gerek. hatırladığım sorunlar bunlar. 470n kısmı çok önemli demişlerdi. gerçekten öyleymiş.

şimdi aşağıdaki gibi bir döngüde USBin kullanıp timeout olarak 10 saniye verdiysen bu arada 10 saniye içinde pcden hiç bir komut gelmediyse USB bağlantısı kesin olarak kopacaktır. zaten 1msden fazla beklememelisin.

while 1=1 
'bazı işler ...
 USBOut 3, USB_BUFFER, Auto 
wend


aşağıdaki gibi yaparsan sorun olmaz

while 1=1 

 Repeat
    USBIn 3, BUFFER, AUTO			        
 Until  inFLAG = ..							   
  Repeat  
    USBOut 3, BUFFER, AUTO     	
  Until  sendFLAG = ..

wend

burada flag, gönderme ve alma işleminin bittiğini bildiren bitlerdir. pic aldığı veriyi aynen geri gönderecektir.

2. repeat ten önce BUFFER[2] =  BUFFER[2] +3
dersen bu dizinin 2 nolu baytını 3le toplayıp geri gönderir