USB Cihaz

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

muhittin_kaplan

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.

wsxwsx

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

muhittin_kaplan

peki combined yada composite usb devices nasıl yaparız. yani bununla ilgili bir desc dosyas felan mı var ?

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)

muhittin_kaplan

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.

ground

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..
⌒╮'╭⌒╮⌒╮.
╱◥██◣                  
| 田︱田田|              
╬╬╬╬╬╬╬╬╬

Picproje - Sözde değil özde paylaşım..

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.

wsxwsx

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?)

ground

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?
⌒╮'╭⌒╮⌒╮.
╱◥██◣                  
| 田︱田田|              
╬╬╬╬╬╬╬╬╬

Picproje - Sözde değil özde paylaşım..

muhittin_kaplan


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

wsxwsx

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.

muhittin_kaplan

evet gönderebiliyorum istediğim porta aktarabiliyorum şu an

jaco33

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).

jaco33

bu easyhid'i de kuramıyorum pc'ye bir türlü :?:

muhittin_kaplan

fuse ları programlayıcıda ayarlıyorum hiç kod a gömmedim.
ama problem nedir belki yardım edebilirim.