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
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
deneyemedim ama teşekkür ederim
Peki Pc tarafında herhangi birşey yapmamız gerekmiyormu ?
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
Mause + Klavye hakkında,
http://rapidshare.com/files/121417440/Mouse_control.rar
veya
http://rapidshare.com/files/170077726/Mouse_control.rar
herkese teşekkür ederim
2550 yada 4550 de kodlarda fark yaparmı tanımlamalar haricinde
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.
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ş
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
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.
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 ?
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
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.
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
Nasıl oldu durum? sorun devam ediyor mu
Deneme Fırsatım Olmadı
Griple Boğuşuyorum.
Sizin Dll için Msn Den Halledemeyeceğiz. Buradan Devam Edelim İSterseniz..
Problem Sanırım Benim Daha Yeni öğrendiğim OSC Ayarlarından
Pll diye bir reg dan ayar yapılması gerekiyormuş.. yani anlayacağınız aklıma gelen problem yani Osc den
PIC den PC ye Bilgi Gönderirken Yapmak İstediğim Aslında Klavye Gibi Bazı Tuşlarının Gönderilmesi. Bunun Örneklerini Yukarda Örnekleri Verildi Yaptım Çalıştırdım.
PC den PIC e veri Gönderirken, Klavye Olarak Description Atadığımız İçin PC den PIC e veri gönderemiyorum (Normal Description Tanımlama Yaptığımda Gönderebiliyorum)
Yapmak İstediğim Pcden Gönderdiğim Bilgileri Sanki Klavyeden Geliyormuş Gibi PIC in Bana Geri Çevirmesi... Nasıl Çözeceğiz Anlamadım...
Normalde klavyenin ledlerini yakabilmek için bilgisayar klavyeye veri gönderir. Klavye bunları kendi kendine yakıp söndürmez. PCden gelen komuta göre yakıp söndürür.
Bu ledleri yakmak için gerekli komut nasıl gönderiliyor ona bakmak gerek. O zaman aynı şekilde PICe veri gönderebilirsiniz.
Yani Kısacası Klavye Olarak tanıtıp (desc klavye olarak) Bilgi Gönderemiyorum (Caps,Scroll Vs Dışında) Olarak Anlıyorum.
Peki Klavye Olarak Tanımlamadan Nasıl Olurda Klavye Gibi Bilgi Gönderebilirim.
picden gelen bilgiler nereye gelecek. bu bilgileri alıp sonra ekranda başka biryere yazacak ek bir program olacak mı? öyle olacaksa klavye gibi göstermek şart değildir. Yok eğer ekrandaki notepad gibi bir yere yazsın diyorsan mecburen klavye gibi göstereceksin. Ama bu cihazın bilgisayrdan veri alamayacağı anlamına gelmez. şimdi veri alabilen örneğe bakarak klavye kodlarına bu alma işini ekleyeibliriz.
anladığım kadarıyla 2. bir endpoint açılacak . biri bilgisayara gönderiken bu 2.si alacak. çok zor iş değil bu. benzeterek yaparsın. proteusta usb simulasyonu çalışıyordu. kolayca denersin.
Önceki sayfada 2. mesajda ki klavye kodu bilgisayardan veri alabilir. usbin demişl. bununla alırsın.
Yalnız şöyle birsorun var. Alet klavye gibi bilgisayara takılınca windwos bununla bağlantıya geçmiş oluyor. siz ayrı bir programdan buna nasıl veri göndereceksiniz. Yerinizde olsam klavye gçbç göstermeyibırakıp kendi programımı yazarım.
Proje Kabaca Şöyle
.Net Altında Yazılmış Bir Programdan Sırasıyla Berlenmiş Karekterleri PIC e Göndereceğim. Daha Sonra PIC bu aldığı bilgileri Windows Altında Herhangi biryere (Not defteri, Word Açk Olan Herhangi biryer) Yazacak.
bu işi anlayabilmemiz çok zor. ama muhtemelen bunlara gerek yok. pic bunları alıp birşeyler yaparak geri yazacaksa, bunu bilgisayardaki program zaten yapamaz mı? yok eğer dongle gibi birşeyse klavye gibi görünmesinin gerekiğini anlayamdım. klavye gibi görünmesi gerçekten şart mı? Bir uygulama gelen verileri alsın ne istiyorsan yapsın. istersen copy paste yapar...
Pc deki programla (Sendkeys vs) ile Olmamalı Cihazdan geri gelmeli. Dongle gibi bişey yapmam gerek.
Pic Klavye Gibi basmalı, Pic e Program tarafından Gönderdiğim karakterleri
pekiklavye gibi olması neden? kolay olması gelen verileri test amacıyla görebilmen için mi?
halbuki bunlara hiçgerekyok. veriyi gayet hızlı şekilde okuyup yazabilirsin gerekirse uygulamaya katılacak bir DLL, ocx yaparsın. yazılan veri şifrelenir. öyle yazılır. lisans vs ne istersen yazarsın.
Programın çalışma süresini de yazdırtırsın. deneme süresi bitince kilitlensin. bunların dangılın atasını yapabilirsin.
klavye gibi görünemsine gerek yok.
dangıl yapacaksan DLL içinde şöyle bir fonksiyon olur. gönderdiğin string kodlanarak geri gelir.
kodlu bilgi = kodla(gidecekstring)
Eğer Klavye Olmazsa Sadce O Vendor ve İdyi Kullanan Programla alışveriş Yapabilir. Buradan aldığım veriyi Program vasıtasıyla işleyip Göndereblirim. Oysa sistemde Bir "Cop" Dolaşıyor Key Gönderen programları Yakalayıp Durduruyor. Ben Bunu Aşmak İçin Sanki sistemdeki bir Klavyeden Giriş Yapılıyor Gibi Göndeeceğim "Key" leri
keyleri pice gönderdin . diyelim. PC tarafında çalışan program senin kontrolünde mi? oradan istediğn veriyipice gönderebiliyor musun?
Bir de PIC aynı anda birden fazla alet gibigösterebilir kendisini.klavye ve joystik gibi.
bence sen öncelikle picden, capslock tuşu gönder bu sırada bilgisaayr ona led yakması için komut gönderecektir. bu gelen komutu alman zor değil. sınırsız bir döngü yaparsın veri gelene kadar sürekli USBin yaparsın.
Anladığım kadarıyla güçlü bir koruma mekanizması olan yazılımı dışarıdan picle kırmaya çalışıyorsunuz. pic keyleri deneyerek tutturacak :)
ama meraketme bunu düşünen adam gecikmede koymuştur. saniyede 100 tane key deneyemezsin.
yok 100 tane key göndermeme gerek yok adımı yazdırsam yeter. :D
program benim ontrolümde olacak o kolay. Cihz Kandini Klavye Olarak Tanıttığından Bilgi Gönderemiyorum. (Klaye Tek Yönlü Ya)
bileşik cihaz nasıl yaparız soru bu sanırım.
peki aynı USB hat üzerine iki PIC kullanabilirmiyz.(Vendor Ve Pro ID ler Farklı) Yani PIC 1 Klavye PIC 2 Usb Devce olarak tanınacak ve kendi aralarında ileişimde olacaklar.
Yaparsın. bir usb huba 2 adet usb picli cihaz bnağlarsın. bu huba bağlı picler ayrıca kendi arasında bağlıdır. usb hub + 2 adet pic li kart hepsini bir kutuya koyarsın tek bir cihaz gibi görünür
peki combined yada composite usb devices nasıl yaparız. yani bununla ilgili bir desc dosyas felan mı var ?
evet uzun araştırma ve kodlama sonucunda yaptıklarım.
USB ile Mouse
Usb İle Klavye
Usb İle HID
18f2550 yada 4550 ile RB0 ve TMR0 kesmeleri
bunların hepsi ayrı ayrı çalşıyor. yanlız herhangi bir kesme rutini içerisine bu usbout konutunu yazdığımda ya usb çalışmıyor ya kesme. prblemi bulamadım.
(yapmak isediğim rb0 da int oluştuğunda verdiğim bilgiyi usb den gönderecek)
Sanırım Birşeyler Yakalamaya Başladık
Mikroelektronk in MicroBasic derleyicisinde nedense int. kapatmışlar.
Burası Önemli
' Disable all interrupts
' Disable GIE, PEIE, TMR0IE, INT0IE,RBIE
INTCON = 0
INTCON2 = $F5
INTCON3 = $C0
' Disable Priority Levels on interrupts
RCON.IPEN = 0
PIE1 = 0
PIE2 = 0
PIR1 = 0
PIR2 = 0
program hid_test
dim k as byte
dim userRD_buffer as byte[64]
dim userWR_buffer as byte[64]
sub procedure interrupt
asm
CALL _Hid_InterruptProc
nop
end asm
end sub
sub procedure Init_Main
[B] ' Disable all interrupts
' Disable GIE, PEIE, TMR0IE, INT0IE,RBIE
INTCON = 0
INTCON2 = $F5
INTCON3 = $C0
' Disable Priority Levels on interrupts
RCON.IPEN = 0
PIE1 = 0
PIE2 = 0
PIR1 = 0
PIR2 = 0 [/B]
' Configure all ports with analog function as digital
ADCON1 = ADCON1 or $0F
' Ports Configuration
TRISA = 0
TRISB = 0
TRISC = $FF
TRISD = $FF
TRISE = $07
LATA = 0
LATB = 0
LATC = 0
LATD = 0
LATE = 0
' Clear user RAM
' Banks [00 .. 07] ( 8 x 256 = 2048 Bytes )
asm
LFSR FSR0, $000
MOVLW $08
CLRF POSTINC0, 0
CPFSEQ FSR0H, 0
BRA $ - 2
end asm
' Timer 0
T0CON = $07;
TMR0H = (65536 - 156) >> 8
TMR0L = (65536 - 156) and $FF
INTCON.T0IE = 1 ' Enable T0IE
T0CON.TMR0ON = 1
end sub
'** Main Program **
main:
Init_Main()
Hid_Enable(@userRD_buffer, @userWR_buffer)
do
for k = 0 to 255
' Prepare send buffer
userWR_buffer[0] = k
' Send the number via USB
Hid_Write(@userWR_buffer, 1)
next k
loop until FALSE
Hid_Disable
end.
Alıntı yapılan: "muhittin_kaplan"evet uzun araştırma ve kodlama sonucunda yaptıklarım.
USB ile Mouse
Usb İle Klavye
Usb İle HID
18f2550 yada 4550 ile RB0 ve TMR0 kesmeleri
bunların hepsi ayrı ayrı çalşıyor. yanlız herhangi bir kesme rutini içerisine bu usbout konutunu yazdığımda ya usb çalışmıyor ya kesme. prblemi bulamadım.
(yapmak isediğim rb0 da int oluştuğunda verdiğim bilgiyi usb den gönderecek)
neden kesme anında göndermeye çalışıyorsun bilgiyi?
rb0 int oluştuğunda (muhtemelen saydırma yapıyorsun) yapacağın işlemi yap..
usb den gönderme olayını int gerek yok..
gerçek zamanlı çalışma ise kastın verilerin doğruluğu kesme anında arttıracağın sayacın değerini görmektir.
atıyorum 100khz lik bir sinyali ya da bir sayaç arttırıyorsan sayacı o hızda takip edebilmen zaten imkansız.
amaç bu işin scadasıysa sen verileri doğru oku 10msn de bile ekranda göstersen kafi..
neden kesme anında göndermeye çalışıyorum ?
çümki projede 1bytlık bir bilgiyi parelel olarak başka bir cihazdan alacağım v bunu klaye formatında usb den göndereceğim. yanii önce bilgiyi koyup porta, sonra kesmeyi çalıştırarak bu bilgiyi usbeden göndereceğim.
Diyelim 2 tane pic kullandın. piclerden biri klavye gibi olsun. bu, bazı bilgileri bilgisayara gönderiyor.
Bilgisayar bu cihaza değilde diğer usbden bağlı öbiür pice birşeyler gönderiyor. sonra picler kendi aralarında haberleşiyorlar ve bir iş yapılacak. o iş nedir? gene bilgisayara bilgi mi gönderilecek? yok bilgisayardan bilgi gelecekse Klavye gibi olmayan öbür pice gelecek diyelim.
O pic ne şekilde görünecek. Bilgisayar bunu ne zannedecek ki bilgi gönderecek? USB bellek olmaz. HID sınıfı olacak . Her durumda bilgisayarın bir pice birşeyler gönderebilmesi gerek. Ama bu senin bilgisayarda öyle bir durum yok sanırım.
Ya da şöyle sorayım bu özel bilgisayar, ne tür cihaz cihazalara bilgi gönderebilir. Böyle bir tür var mı? (HID sınıfı cihazlara gönderir diyeceksen, bunun alt sınıfı nedir?)
Alıntı yapılan: "muhittin_kaplan"neden kesme anında göndermeye çalışıyorum ?
çümki projede 1bytlık bir bilgiyi parelel olarak başka bir cihazdan alacağım v bunu klaye formatında usb den göndereceğim. yanii önce bilgiyi koyup porta, sonra kesmeyi çalıştırarak bu bilgiyi usbeden göndereceğim.
yanlış anlama sadece kesme ile göndermenin gerekliliğini sorguluyorum.
paralel olarak bilgiyi alıyorsun.. herhangi bir portuna bağladın girişleri..
döngü hızına göre bu bilgi refresh ediyor kendini.
şimdi..
1.bu bilgi hızlı gitmesi içinmi kesme ile gönderilmek isteniyor? herhangi bir olaya bağlı olarakmı gitmesi isteniyor.?
2.bu olay atıyorum rb0 kesme ise (inen ya da çıkan) olay anları ne kadar anlık durumlarda tekrarlıyor.?
klavye gibi uygulamalarda tuşlara basıp bırakma süresi ana döngünüzde bu usb bufferlarını istediğiniz hızda güncellemenize yetmeyecekmi?
kesme ile tuşa basıldığını fark ettiğiniz anda bunu herhangi bir registere yazıp bu registerdeki bilgiyi ana döngünüzde işleyip göndermek size yetmiyecekmi acaba?
(http://img88.imageshack.us/img88/3480/adsz1vu3.jpg)
yapmak istediğim bu.
usb için yazdığım Hıd programından belli olmayan aralıklarda bigiler gelmekte bu bilgileri ben Pic1 in portuna aktarabiliyorum. bunu aktarıp diğer pic e "bilgiyi porta koydum" demek için kesme kullanmayı düşünüyorum. diğer pic bu bilgiyi alıp usb klavye modunda pc ye gönderecek. sorunda tam burada başlıyor. ya kesme ya usb rutinleri çalışmıyor. çünki usb den klavye gibi belli dataları gönderiyorum. kesme işleminide yaptım yanlız ikisinii aynı anda kullandığımda..
Device 18F2550
XTAL=20
'-------USB Tanımlamalar---------------------------------------
USB_DESCRIPTOR = "KBDDESC.Inc"
ALL_DIGITAL = TRUE
' 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
'-------Genel Tanımlamalar---------------------------------------
TRISC=0
PORTC=0
TRISB=%00000001
PORTB=0
ALL_DIGITAL true
'-------TMR0 int Tanımlamaları-----------------------------------
INTCON = %10010000 ' Enable rb0 interrupts
On Interrupt GoTo Kesme
'-------Ana Program----------------------------------------------
ProgramStart:
GoSub AttachToUSB
anaProgram:
USBPoll
GoTo anaProgram
ProgramLoop:
USBPoll
If POSITION > 9 Then
POSITION=0
Else
POSITION = POSITION + 1
EndIf
GoSub Choose
GoSub DoUSBOut
Return
Choose:
Select POSITION
Case 0
Str USBBuffer = 0,0,$27,0,0,0,0,0 'Key 0
Case 1
Str USBBuffer = 0,0,$1e,0,0,0,0,0 'Key 1
Case 2
Str USBBuffer = 0,0,$1f,0,0,0,0,0 'Key 2
Case 3
Str USBBuffer = 0,0,$20,0,0,0,0,0 'Key 3
Case 4
Str USBBuffer = 0,0,$21,0,0,0,0,0 'Key 4
Case 5
Str USBBuffer = 0,0,$22,0,0,0,0,0 'Key 5
Case 6
Str USBBuffer = 0,0,$23,0,0,0,0,0 'Key 6
Case 7
Str USBBuffer = 0,0,$24,0,0,0,0,0 'Key 7
Case 8
Str USBBuffer = 0,0,$25,0,0,0,0,0 'Key 8
Case 9
Str USBBuffer = 0,0,$26,0,0,0,0,0 'Key 9
EndSelect
Return
DoUSBOut:
Repeat
USBPoll
Until PP0 = ATTACHED_STATE
USBOut 0, USBBuffer, USBBufferSizeTX, DoUSBOut
Return
AttachToUSB:
Repeat
USBPoll
Until PP0 = ATTACHED_STATE
Return
'-------KESME Alt Programı---------------------------------------
Disable
Kesme:
GoSub ProgramLoop
Resume
Enable
End
Bu özel sistemde, HID cihaza bilgisyarın veri gönderebilme ihtimali hiç yok gibi.
Öncelikle bunu garantilediğiniz takdirde diğer kısımların bir anlamı olabilir.
HID program , HID cihaza veri göndersin. Sonra isterse kapansın. HID cihaz bu veriyi alabiliyor mu? Aldıysa bildirsin. ( mesla bir led yakarak )
1 bayt bile gönderebildiyseniz, sistemin geri kalan kısımlarına ilerleyebilirsiniz.
evet gönderebiliyorum istediğim porta aktarabiliyorum şu an
merhaba,
rica etsem;
kullandığınız, fuse'leride içinde olan hex dosyası varsa verebilir misiniz?
ne oldugu hiç önemli değil yeter ki çalışsın. yalnız hex istiyorum zira benim donanımımda mı bir sorun var yoksa başka bir şey mi bir türlü anlıyamadım.
(18f4550 USB).
bu easyhid'i de kuramıyorum pc'ye bir türlü :?:
fuse ları programlayıcıda ayarlıyorum hiç kod a gömmedim.
ama problem nedir belki yardım edebilirim.
easyhid protonla beraber kurulu geliyor..
yaptığınız herhangi bir hex dosyasını verebilir misiniz?
rapid e yüklüyorum linki veririm birazdan
çok teşekkür ederim.
ne diyim. alçak gerilim(220), yüksek gerilim
(34KV)'de bir sorununuz olursa büyük ihtimal yardımcı olabilirim sanırım.(belki zaten biliyorsunuzdur da içimden geldi yani.)
lazım olursa high voltage probe isterim :)
büyüğünden mi küçüğünden mi :D
Proton+ proteus (http://rapidshare.com/files/168553332/proton___proteus_setup.rar.htm)
yine çalıştıramadım. bir led yak söndür yapayım dedim. o da olmadı.
programı yuklediğine dair o.k. veriyro ama boardda bir hareket yok.
16f628 de prog ve testte sorun olmuyor. kristali değiştirdim yine olmadı.
yeni bir prog.kartı alsam mı diye düşünüyorum.
prog.kartı ve usb girişi(yaptıgım kartta)arızalıymış. şu anda tanıyor.
hem micro c ile hem de proton ile.
yardımlarınız için teşekkur ederim.
Pc ye Format Attım şimdi Proteus ta Hid Yüklediğimde Sürücü İstiyor. Deli Olacam :( Bir İlmi Mi Var ?
mchid.dll dosyasını system32'ye attınız mı?
belki bundandır.
paylaşırsanız sevinirim.
proteus ta 4550'yi göremedim. yerine hangi pic'i kullanmamiz gerek?
usb'yi çıkarmak için ne yazmamız lazım ve nereye?(pick devices'de göremedim)
4550 yide 2550 yide kullanabiliyorum
tebrik ederim.
:D
yok o manada değil
herikiside lib. de var demek isdim.
verdiğiniz dosyada mı(Proton+ proteus)?
bir de diğer sorularıma yanıt verebilir misiniz?
(http://img367.imageshack.us/img367/8373/picst5.jpg)
7,2 sp 6 yı yükle yukardaki lınk le gelen 7,1
http://www.hizliresim.com/2008/12/4/5581.bmp
Alıntı Yapbir de diğer sorularıma yanıt verebilir misiniz?
sorular ?
mchid.dll dosyasını attınız mı? eğer öyleyse sorun çözüldü mü?
az evvel proteus indirdim. 6 7,2. fakat program sessiz sedasız bir anda çıkıyor. normal mi? patch yaptım ve ok verdi.
Proteus 7.2 SP 6 (http://rapidshare.com/files/170618355/Proteus_7.2_Sp6_Updated-Fixed_07-2008.rar.htm)