اطلاعیه

Collapse
No announcement yet.

PDIUSBD12 in bascom آموزش

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    PDIUSBD12 in bascom آموزش

    با سلام
    مدتی بود دنبال یه سورس ساده واسه PDIUSBD12 که اگه دوستان باهاش آشنا باشن !! میگشتم
    ولی خوب سورس هایی که به زبانهایی مثل اسمبلی و ... نوشته میشه رو بسختی میشه درک کرد
    من اینجا یه سورس واسه این تراشه گذاشتم که به زبان بیسیک هست و خودم تست کردم و 100% جواب گرفتم
    در ضمن من این سورس رو از روی سورسی که اساتید محترم زحمتشو کشیده بودن و به زبان سی نوشته بودن تبدیل کردم به سورس بیسیک
    یه توضیح کوچولو هم واسه سخت افزارش میدم:
    پورت A برای ارتباط با دیتای D12
    پورت D.2 به پایه اینتراپت D12 وصل میشه که یه مقاومت بالاکش هم نیاز داره و یا میتونین مقاومت بالاکش خود میکرو رو فعال کنید
    پورت D.3 به RD چیپ D12
    پورت D.4 به WR
    پورت D.5 به A0 چیپ D12 وصل میشه

    دیگه چیز خاصی هم نداره فقط حتماً یادتون باشه برای USBD12 از یه کریستال 6 مگ استفاده میشه که باید حتماً با دو تا خازن 22 پیکو زمین بشه واگر نه درست عمل نمیکنه (البته کار میکنه ولی باگ زیادی پیش میاره)
    برای بهتر کار کردنش هم میتونین از کابلهای یو اس بی نویز گیر دار استفاده کنید یا از فریت بید استفاده نمایید
    و در ضمن بهتره رشته های شیلد کابل که به بدنه وصل میشه رو به زمین وصل کنید

    دیگه موردی نبود
    امیدوارم دوستانی که میخان تازه باهاش کار کنن بتونن از این چیزی یاد بگیرن و به دردشون بخوره

    در ضمن برای درایورش هم از windriver jungo استفاده کنید (البته اگه حوصله DDK رو ندارید :mrgreen

    من به زودی یه درایور همراه با یه فایل اکتیو ایکس مینویسم که بشه به راحتی با ویژوال بیسیک ارتباط برقرار کرد.

    اینم کد

    کد:
    'GRSRINFO@GMAI.COM
    Declare Sub Write_command()
    Declare Sub Int_pdi()
    Declare Sub Write_data()
    Declare Sub Bus_reset()
    Dim Temp(16) As Byte
    Dim Address_device As Byte
    Declare Sub Read_data()
    Declare Sub Endpoint_ctrl_out()
    Declare Sub Endpoint_ctrl_in()
    Declare Sub Standard_request()
    Declare Sub Get_status()
    Declare Sub Set_feature()
    Declare Sub Clear_feature()
    Declare Sub Set_address()
    Declare Sub Get_descriptor()
    Declare Sub Endpoint1_out()
    Declare Sub On_datain()
    Declare Sub Endpoint2_in()
    
    Dim Bmrequesttype As Byte
    Dim Brequest As Byte
    Dim Wvalue As Word
    Dim Windex As Word
    Dim Wlengh As Word
    Dim Ttmp As Byte
    Dim Index As Byte
    Dim Global_length As Word
    Dim Index_descriptor As Word
    Dim Device_descriptor(18) As Byte
    Dim Configuration_discriptor(32) As Byte
    Dim String_discriptor(50) As Byte
    Dim P As Byte
    Dim Bufferi(16) As Byte
    Dim Buffero(64) As Byte
    
    $regfile = "m32def.dat"
    $crystal = 8000000
    $baud = 9600
    Disable Interrupts
    
    Buffero(1) = Asc( "S")
    Buffero(2) = Asc( "a")
    Buffero(3) = Asc( "l")
    Buffero(4) = Asc( "a")
    Buffero(5) = Asc( "m")
    
    Device_descriptor(1) = 18
    Device_descriptor(2) = 1
    Device_descriptor(3) = &H00
    Device_descriptor(4) = &H02
    Device_descriptor(5) = 0
    Device_descriptor(6) = 0
    Device_descriptor(7) = 0
    Device_descriptor(8) = 16
    Device_descriptor(9) = &H71
    Device_descriptor(10) = &H04
    Device_descriptor(11) = &H64
    Device_descriptor(12) = &H13
    Device_descriptor(13) = 0
    Device_descriptor(14) = 0
    Device_descriptor(15) = 0
    Device_descriptor(16) = 1
    Device_descriptor(17) = 0
    Device_descriptor(18) = 1
    
    Configuration_discriptor(1) = 9
    Configuration_discriptor(2) = 2
    Configuration_discriptor(3) = &H20
    Configuration_discriptor(4) = 0
    Configuration_discriptor(5) = 1
    Configuration_discriptor(6) = 1
    Configuration_discriptor(7) = 0
    Configuration_discriptor(8) = &H80
    Configuration_discriptor(9) = &H32
    '//
    Configuration_discriptor(10) = 9
    Configuration_discriptor(11) = 4
    Configuration_discriptor(12) = 0
    Configuration_discriptor(13) = 0
    Configuration_discriptor(14) = 2
    Configuration_discriptor(15) = &HFF
    Configuration_discriptor(16) = &HFF
    Configuration_discriptor(17) = &HFF
    Configuration_discriptor(18) = 0
    '//
    Configuration_discriptor(19) = 7
    Configuration_discriptor(20) = 5
    Configuration_discriptor(21) = &H82
    Configuration_discriptor(22) = 2
    Configuration_discriptor(23) = 64
    Configuration_discriptor(24) = 0
    Configuration_discriptor(25) = 0
    '//
    Configuration_discriptor(26) = 7
    Configuration_discriptor(27) = 5
    Configuration_discriptor(28) = 1
    Configuration_discriptor(29) = 2
    Configuration_discriptor(30) = 16
    Configuration_discriptor(31) = 0
    Configuration_discriptor(32) = 0
    
    String_discriptor(1) = 4
    String_discriptor(2) = 3
    String_discriptor(3) = &H9
    String_discriptor(4) = 4
    '//
    String_discriptor(5) = 14
    String_discriptor(6) = 3
    String_discriptor(7) = Asc( "N")
    String_discriptor(8) = 0
    String_discriptor(9) = Asc( "a")
    String_discriptor(10) = 0
    String_discriptor(11) = Asc( "s")
    String_discriptor(12) = 0
    String_discriptor(13) = Asc( "s")
    String_discriptor(14) = 0
    String_discriptor(15) = Asc( "e")
    String_discriptor(16) = 0
    String_discriptor(17) = Asc( "r")
    String_discriptor(18) = 0
    String_discriptor(19) = Asc( " ")
    String_discriptor(20) = 0
    String_discriptor(21) = Asc( "U")
    String_discriptor(22) = 0
    String_discriptor(23) = Asc( "S")
    String_discriptor(24) = 0
    String_discriptor(25) = Asc( "B")
    String_discriptor(26) = 0
    String_discriptor(27) = Asc( " ")
    String_discriptor(28) = 0
    String_discriptor(29) = Asc( "T")
    String_discriptor(30) = 0
    String_discriptor(31) = Asc( "e")
    String_discriptor(32) = 0
    String_discriptor(33) = Asc( "s")
    String_discriptor(34) = 0
    String_discriptor(35) = Asc( "t")
    String_discriptor(36) = 0
    String_discriptor(37) = Asc( " ")
    String_discriptor(38) = 0
    String_discriptor(39) = Asc( " ")
    String_discriptor(40) = 0
    String_discriptor(41) = Asc( " ")
    String_discriptor(42) = 0
    String_discriptor(43) = Asc( " ")
    String_discriptor(44) = 0
    String_discriptor(45) = Asc( " ")
    String_discriptor(46) = 0
    String_discriptor(47) = Asc( " ")
    String_discriptor(48) = 0
    String_discriptor(49) = Asc( " ")
    String_discriptor(50) = 0
    
    'print ""
    'print "Initialize MCU .... ";
    Temp(1) = 0
    Ddrd.2 = 0
    Ddrd.3 = 1
    Ddrd.4 = 1
    Ddrd.5 = 1
    Portd.3 = 1
    Portd.4 = 1
    Portd.5 = 0
    'Gicr = &H40
    'Mcucr = 0
    'Mcucsr = 0
    'Gifr = 40
    Dim Ts As Bit
    Ts = 0
    'print "OK!"
    Int_pdi
    'Bus_reset
    Config Int0 = Low Level
    On Int0 Intr0
    Enable Interrupts
    Enable Int0
    'Do
    'If Ts = 1 Then
    'End
    'End If
    'Loop
    Do
    Loop
    End
    
    Intr0:
    Int_pdi
    Return
    
    Sub Int_pdi()
    Ttmp = &HF4
    Write_command
    Ttmp = 2
    Read_data
    ''print Temp(1)
    
    If Temp(1).6 = 1 Then
    'print "Bus_Reset .... ";
    Bus_reset
    'print "OK!"
    
    Elseif Temp(1).7 = 1 Then
    'print "Suspend_ch"
    
    Elseif Temp(1).0 = 1 Then
    'print "Endpoint_ctrl_out"
    Endpoint_ctrl_out
    
    Elseif Temp(1).1 = 1 Then
    'print "Endpoint_ctrl_in"
    Endpoint_ctrl_in
    
    Elseif Temp(1).2 = 1 Then
    'print "Endpoint1_Out"
    Endpoint1_out
    Elseif Temp(1).3 = 1 Then
    'print "Endpoint1_In"
    
    Elseif Temp(1).4 = 1 Then
    'print "Endpoint2_Out"
    
    Elseif Temp(1).5 = 1 Then
    'print "Endpoint2_In"
    Endpoint2_in
    End If
    Ts = 1
    End Sub
    
    Sub Bus_reset()
    Address_device = 0
    Ttmp = &HD0
    Write_command
    Ttmp = &H80
    Write_data
    Ttmp = &HD8
    Write_command
    Ttmp = &H01
    Write_data
    Ttmp = &HF3
    Write_command
    Ttmp = &H1E
    Write_data
    Ttmp = &H02
    Write_data
    'Waitms 10
    'Write_command &HFB
    'Write_data &HC0
    End Sub
    
    Sub Write_command()
    Ddra = &HFF
    Portd.3 = 1
    Portd.5 = 1
    Porta = Ttmp
    Portd.4 = 0
    Portd.4 = 1
    Portd.5 = 0
    End Sub
    
    Sub Write_data()
    Ddra = &HFF
    Portd.3 = 1
    Porta = Ttmp
    Portd.4 = 0
    Portd.4 = 1
    End Sub
    
    Sub Read_data()
    Dim I As Byte
    ''print "NUM:";
    ''print ttmp
    Portd.4 = 1
    Ddra = 0
    Porta = &HFF
    For I = 1 To Ttmp
    Portd.3 = 0
    Temp(i) = Pina
    ''print "I:";
    ''print I
    Portd.3 = 1
    Next
    End Sub
    
    Sub Endpoint_ctrl_out()
    Dim Ttp As Byte
    Dim Data_packet(16) As Byte
    Dim Tp As Byte
    Ttmp = &H40
    Write_command
    Ttmp = 1
    Read_data
    Ttp = Temp(1)
    ''print "Ttp:";
    ''print Hex(ttp)
    If Ttp.0 = 1 Then
      If Ttp.5 = 1 Then
       Ttmp = &H00
       Write_command
       Ttmp = &HF0
       Write_command
       Ttmp = 16
       Read_data
       Ttmp = &HF1
       Write_command
       Ttmp = &HF2
       Write_command
       Ttmp = &H41
       Write_command
       Ttmp = &HF1
       Write_command
       Ttmp = &HF2
       Write_command
       ''print "Data_Packet:"
       'For Tp = 1 To 16
       ''print Tp;
       ''print ":";
       ''print Hex(temp(tp));
       ''print "  ";
       'Next
       ''print ""
       If Temp(2) = 8 Then
         Bmrequesttype = Temp(3)
         Brequest = Temp(4)
         Wvalue = Temp(6)
         Shift Wvalue , Left , 8
         Wvalue = Wvalue Or Temp(5)
         Windex = Temp(8)
         Shift Windex , Left , 8
         Windex = Windex Or Temp(7)
         Wlengh = Temp(10)
         Shift Wlengh , Left , 8
         Wlengh = Wlengh Or Temp(9)
         Tp = Bmrequesttype And &H60
         If Tp = &H00 Then
          Standard_request
         Elseif Tp = &H20 Then
          'print "Class_Request"
         Elseif Tp = &H40 Then
          'print "Vendor_Request"
         Else
          Ttmp = &H40
          Write_command
          Ttmp = &H1
          Write_data
         End If
       Else
         Ttmp = &H40
         Write_command
         Ttmp = &H1
         Write_data
       End If
      End If
    End If
    
    End Sub
    
    Sub Standard_request()
    'print "Standard_Request"
    Select Case Brequest
      Case &H00
       'print "Get_Status"
       Get_status
      Case &H01
       'print "Clear_Feature"
       Clear_feature
      Case &H03
       'print "Set_Feature"
       Set_feature
      Case &H05
       'print "Set_Address"
       Set_address
      Case &H06
       'print "Get_Discriptor"
       Get_descriptor
      Case &H07
       'print "Set_Discriptor"
      Case &H08
       'print "Get_Configuration"
      Case &H09
       'print "Set_Configuration"
      Case &H0A
       'print "Get_Interface"
      Case &H0B
       'print "Set_Interface"
      Case Else
       Ttmp = &H40
       Write_command
       Ttmp = &H1
       Write_data
    End Select
    End Sub
    
    Sub Get_status()
    Dim Dstt As Byte
    Dstt = Bmrequesttype And 3
    If Dstt < 3 Then
      Ttmp = &HF0
      Write_command
      Ttmp = 0
      Write_data
      Ttmp = 2
      Write_data
      Ttmp = 0
      Write_data
      Ttmp = 0
      Write_data
      Ttmp = &HFA
      Write_command
    Else
      Ttmp = &H41
      Write_command
      Ttmp = &H1
      Write_data
    End If
    End Sub
    
    Sub Set_feature()
    Dim Stf As Byte
    Stf = Bmrequesttype And 3
    Select Case Stf
    Case 0
      If Wvalue = 1 Then
       Ttmp = &H41
       Write_command
       Ttmp = &H1
       Write_data
      End If
    Case 2
      If Wvalue = 0 Then
       Ttmp = &H40 + Low(windex)
       Write_command
       Ttmp = &H1
       Write_data
       Ttmp = &H01
       Write_command
       Ttmp = &HF0
       Write_command
       Ttmp = &H0
       Write_data
       Ttmp = &H0
       Write_data
       Ttmp = &HFA
       Write_command
      End If
    Case Else
      Ttmp = &H41
      Write_command
      Ttmp = &H1
      Write_data
    End Select
    End Sub
    
    Sub Clear_feature()
    Dim Clf As Byte
    Clf = Bmrequesttype And 3
    Select Case Clf
    Case 0
      If Wvalue = 1 Then
       Ttmp = &H41
       Write_command
       Ttmp = &H1
       Write_data
      End If
    Case 2
      If Wvalue = 0 Then
       Ttmp = &H40 + Low(windex)
       Write_command
       Ttmp = &H0
       Write_data
       Ttmp = &H01
       Write_command
       Ttmp = &HF0
       Write_command
       Ttmp = &H0
       Write_data
       Ttmp = &H0
       Write_data
       Ttmp = &HFA
       Write_command
      End If
    Case Else
      Ttmp = &H41
      Write_command
      Ttmp = &H1
      Write_data
    End Select
    End Sub
    
    Sub Set_address()
    Dim Ads As Byte
    Address_device = Low(wvalue)
    Ads = &H80 Or Address_device
    Ttmp = &HD0
    Write_command
    Ttmp = Ads
    Write_data
    Ttmp = &H01
    Write_command
    Ttmp = &HF0
    Write_command
    Ttmp = 0
    Write_data
    Ttmp = 0
    Write_data
    Ttmp = &HFA
    Write_command
    End Sub
    
    Sub Get_descriptor()
    Dim Data_length As Word
    Dim Type_descriptor As Byte
    Dim Length As Byte
    Dim Iig As Byte
    Global_length = 0
    Index = &H40
    'print "Wlengh: ";
    'print Hex(wlengh)
    Data_length = Wlengh
    'print "wvalue: ";
    'print Hex(wvalue)
    Type_descriptor = High(wvalue)
    Iig = 1
    'print "Type_descriptor: ";
    'print Type_descriptor
    Select Case Type_descriptor
    Case 1
    P = 1
    Length = Device_descriptor(1)
    Case 2
    P = 2
    Length = Configuration_discriptor(3)
    Case 3
    If Low(wvalue) = 1 Then
    P = 4
    Length = 14
    Iig = 5
    Else
    P = 3
    Length = 4
    End If
    Case 4
    P = 5
    Length = 9
    Iig = 10
    Case 5
    P = 6
    Length = 7
    Iig = 19
    End Select
    If Data_length > Length Then
    Data_length = Length
    End If
    Global_length = Data_length
    Index_descriptor = Iig
    If Global_length = 0 Then
      Ttmp = &H40
      Write_command
      Ttmp = &H1
      Write_data
      Ttmp = &H41
      Write_command
      Ttmp = &H1
      Write_data
    Else
      Endpoint_ctrl_in
    End If
    End Sub
    
    Sub Endpoint_ctrl_in()
    Dim Endlen As Byte
    Dim Leng As Byte
    Dim Tpe As Byte
    Dim Ipe As Byte
    Ttmp = &H41
    Write_command
    Ttmp = 1
    Read_data
    Tpe = Temp(1) And &H40
    'print "TPE: ";
    'print Tpe
    'print "Temp: ";
    'print Hex(temp(1))
    'print "index: ";
    'print Index
    If Index <> Tpe Then
      Index = Temp(1) And &H40
      'print "Index: ";
      'print Index
      'print "Global_length: ";
      'print Global_length
      If Global_length > 16 Then
      Leng = 16
      Else
      Leng = Global_length
      End If
      'print "Len: ";
      'print Leng
      Endlen = Leng + Index_descriptor
      Endlen = Endlen - 1
      'print "Endlen: ";
      'print Endlen
      Ttmp = &H01
      Write_command
      Ttmp = &HF0
      Write_command
      Ttmp = &H00
      Write_data
      Ttmp = Leng
      Write_data
      'print "Index_descriptor: ";
      'print Index_descriptor
      For Ipe = Index_descriptor To Endlen
       If P = 1 Then
         Ttmp = Device_descriptor(ipe)
         'print "Device: ";
         'print Ttmp
       Elseif P = 2 Or P = 5 Or P = 6 Then
         Ttmp = Configuration_discriptor(ipe)
         'print "configuration: ";
         'print Ttmp
       Elseif P = 3 Or P = 4 Then
         Ttmp = String_discriptor(ipe)
         'print "string: ";
         'print Ttmp
       End If
       Write_data
       Global_length = Global_length - 1
      Next
      'print "Global_length: ";
      'print Global_length
      Index_descriptor = Endlen + 1
      'print "Index_descriptor: ";
      'print Index_descriptor
      Ttmp = &HFA
      Write_command
      If Global_length = 0 Then
       Ttmp = &H01
       Write_command
       Ttmp = &HF0
       Write_command
       Ttmp = 0
       Write_data
       Ttmp = &HFA
       Write_command
      End If
    End If
    
    End Sub
    
    Sub Endpoint1_out()
    Dim Ieo As Byte
    Ttmp = &H42
    Write_command
    Ttmp = &H02
    Write_command
    Ttmp = &HF0
    Write_command
    Ttmp = 16
    Read_data
    Ttmp = &HF2
    Write_command
    For Ieo = 1 To 16
    Bufferi(ieo) = Temp(ieo)
    Next
    On_datain
    End Sub
    
    Sub On_datain()
    Dim Ion As Byte
    Print "Data in:"
    For Ion = 1 To 16
    Print Ion;
    Print ":";
    Print Hex(bufferi(ion));
    Print " ";
    Next
    Print ""
    End Sub
    
    Sub Endpoint2_in()
    Dim Iei As Byte
    Ttmp = &H45
    Write_command
    Ttmp = &H05
    Write_command
    Ttmp = &HF2
    Write_command
    Ttmp = &HF0
    Write_command
    Ttmp = 0
    Write_data
    Ttmp = 64
    Write_data
    For Iei = 1 To 16
    Ttmp = Buffero(iei)
    Write_data
    Next
    Ttmp = &HFA
    Write_command
    End Sub

    #2
    پاسخ : PDIUSBD12 in bascom آموزش

    در ضمن اگه فرست داشتم توضیحات خط به خط واستون میزارم
    اگه دوستی بتونه تو این زمینه کمک کنه هم ممنون میشم چون من یه کم الن وقتم کمه

    دیدگاه


      #3
      پاسخ : PDIUSBD12 in bascom آموزش

      اینم داشته باشید تا بعد :biggrin:
      اینم یه درایور کوچولو که با jungo windriver درست کردم
      و یه برنامه کوچولویه دیگه که با ویژوال بیسیک نوشتم که میتونین 14 بایت بفرستید و 64 بایت بخونین

      برای نمونه میتونید هاپر ترمینال رو جرا کنید و با باود 9600 ببینید چیه میفرستید

      http://rapidshare.com/files/157268809/usbsr.zip.html

      دیدگاه


        #4
        پاسخ : PDIUSBD12 in bascom آموزش

        سلام
        با تشکر از شما دوست عزیز
        از اونجایی که خیلی از ما دنبال اینترفیس یو اس بی میگشتیم . لطفا توضیحات بیشتری راجع به کاربرد این سیستم در مدارهای میکرو کنترلری و همچنین هزینه های مدار بدید . ممنون

        دیدگاه


          #5
          پاسخ : PDIUSBD12 in bascom آموزش

          نوشته اصلی توسط alinasseri
          سلام
          با تشکر از شما دوست عزیز
          از اونجایی که خیلی از ما دنبال اینترفیس یو اس بی میگشتیم . لطفا توضیحات بیشتری راجع به کاربرد این سیستم در مدارهای میکرو کنترلری و همچنین هزینه های مدار بدید . ممنون
          1-کاربرد این سیستم در میکروکنترلر:
          دوست عزیز کاربرد این چیپ ارتباط بین دستگاه جانبی شما که میتونه هر وسیله ای که توسط شما طراحی شده باشه با کامپیوتر است که تو چیپ هایی که تو ایران گیر میاد جو سریعتریناش هست
          در ضمن این چیپ یک فیزیکال لایر هست یعنی Device نیست مثل چیپ های FTDI. (توضیح: مثلاً FT232 یه مبدل یو اس بی به سریال هست که برنامه فرم ویر اون تو خود چیپ بصورت سخت افزاری وجود داره و امکان تغییر بخصوصی نداره)
          خوب اینکه چرا ما برای ارتباط با کامپیوتر باید از یو اس بی استفاده کنیم و سراغ پورت های مثل پارالل و سریال نریم که همه میدونن و خیلی جاهای دیگه هم براش بحث شده
          در مورد ارتباط با یو اس بی هم که دو راه وجود داره
          1) استفاده از چیپ های مبدل ( که پروتکل یو اس بی رو به پرتکل های دیگه تبدیل کنه )
          در مورد این گزینه باید بگم واسه کارای سریع و انتقال های زیاد مناسب نیست و پول هدر دادنه چون شما سرعت یو اس بی رو با این چیپ مشکنید و مثلاً به سریال تبدیلش میکنید و حداکثر با سرعت 115 کیلو بیت در ثانیه اطلاعات رد و بدل میکنید
          که این سرعت واسه کارایی مثل لاگ گرفتن و یا یه قفل سخت افزاری خوبه
          2) استفاده از چیپ هایی که لایه فیزیکی رو به عهده میگیرند و با دو مد DMA و IO کار میکنند
          که تو این رده میتونید سرعت های قابل ملاحظه ای رو داشته باشید . تو ایران همون PDIUSBD12 گیر میاد و اونم ایران الکترونیک داره (اگه تا حالا تموم نکرده باشه)

          2- هزینه :
          قیمت چیپش که من خریدم 2500 تومن و یه کریستال 6 مگ و چند تا خازن مقاومت سر هم 3000 تومن میشه

          دیدگاه


            #6
            پاسخ : PDIUSBD12 in bascom آموزش

            در ضمن چون برنامه دستگاه رو خودتون باید بنویسید درایور خاصی هم توسط شرکت سازنده عرضه نمیشه چون اصولاً این چیپ ها واسه کارای حرفه ای هستن مثل چاپگر ها و ... که درایورشو
            خود شرکت مصرف کننده باید بنویسه

            دیدگاه


              #7
              پاسخ : PDIUSBD12 in bascom آموزش

              سلام جناب سروان
              امکانش هست برنامه به زبان سی اون را هم بگذاری واسه ما که از بیسیک سر در نمی آریم.
              قربانت.

              دیدگاه


                #8
                پاسخ : PDIUSBD12 in bascom آموزش

                چرا امکانش نباشه ؟
                /************************************************** ***
                Chip type : ATmega32
                Program type : Application
                Clock frequency : 16.000000 MHz
                Memory model : Small
                External SRAM size : 0
                Data Stack size : 512
                ************************************************** ***/

                #include <mega32.h>


                #define DIR_74LS245 PORTD.6
                #define PDIUSBD12_A0 PORTD.5
                #define PDIUSBD12_WR PORTD.4
                #define PDIUSBD12_RD PORTD.3


                void Write_Command(unsigned char com);
                void Write_Data(unsigned char data);
                void Read_Data(unsigned char *TEMP,unsigned char num);
                void Bus_Reset();
                void Endpoint_Ctrl_Out();
                void Standard_Request();
                void Get_Status();
                void Set_Feature();
                void Clear_Feature();
                void Set_Address();
                void Get_Descriptor();
                void Endpoint_Ctrl_In();
                void Endpoint1_Out();
                void Endpoint2_In();

                //global variables
                unsigned char *p;
                unsigned char Address_Device;
                unsigned int Global_Length;
                unsigned int index_Descriptor;
                unsigned char index;
                char bmRequestType;
                char bRequest;
                int wValue;
                int wIndex;
                int wLength;

                //---------------------------------------------
                unsigned char Device_Descriptor[] = {

                // Device

                18, //bLength
                1, //bDescriptorType
                0x00, //bcdUSB(low byte)
                0x02, //bcdUSB(high buye)
                0, //bDeviceClass
                0, //bDeviceSubClass
                0, //bDeviceProtocol
                16, //bMaxPacketSize (0)
                0x71, //idVendor (low byte)
                0x04, //idVendor (high byte)
                0x10, //idProduct (low byte)
                0x01, //idProduct (high byte)
                0x00, //bcdDevice (low byte)
                0x00, //bcdDevice (high byte)
                0 , //iManufacturer
                1, //iProduct
                0, //iSerialNumber
                1 //bNumConfigurations
                };
                //-------------------------------------
                unsigned char Configuration_Descriptor[] = {

                // Configuration
                9, //bLength
                2, //bDescriptorType
                0x20, //wTotalLength (low byte)
                0x00, //wTotalLength (high byte)
                1, //bNumInterfaces
                1, //bConfigurationValue
                0, //iConfiguration
                0x80, //bmAttributes(Bus powered , No remote wakeup)
                0x32, //MaxPower(100mA)

                // Interface
                9, //bLength
                4, //bDescriptionType
                0, //bInterfaceNumber
                0, //bAlternateSetting
                2, //bNumEndpoints
                0xFF, //bInterfaceClass
                0xFF, //bInterfaceSubClass
                0xFF, // bInterfaceProtocol
                0, //iInterface

                // Endpoint 1
                7, //bLength
                5, //bDescriptorType
                0x82, //bEndpointAddress
                2, //bmAttributes
                64, //wMaxPacketSize (low byte)
                0, //wMaxPacketSize (high byte)
                0, //bInterval

                // Endpoint 2
                7, //bLength
                5, //bDescriptorType
                0x01, //bEndpointAddress
                2, //bmAttributes
                16, //wMaxPacketSize (low byte)
                0, //wMaxPacketSize (high byte)
                0 //bInterval
                };
                //-----------------------------------
                unsigned char String_Descriptor[] = {
                // String0
                4, // bLength
                3, // bDescriptorType
                0x09, // wLangID (low byte) (English)
                0x04, // wLangID (high byte)

                // String1
                46, // bLength
                3, // bDescriptorType
                //USB Parallel Converter
                'U', 00, 'S', 00, 'B', 00, ' ', 00, 'P', 00,
                'a', 00, 'r', 00, 'a', 00, 'l', 00, 'l', 00,
                'e', 00, 'l', 00, ' ', 00, 'C', 00, 'o',00,
                'n', 00, 'v', 00, 'e', 00, 'r', 00, 't',00,
                'e', 00, 'r', 00
                };

                //------------------------------------
                void main(void)
                {
                DDRB=0xFF;
                DDRA=0xFF;
                DDRC=0xFF;
                PORTC=0x00;
                DIR_74LS245=1;
                PDIUSBD12_RD=1;
                PDIUSBD12_WR=1;
                PDIUSBD12_A0=0;
                GICR=0x40;
                MCUCR=0x00;
                MCUCSR=0x00;
                GIFR=0x40;
                #asm("sei&quot
                while(1);

                }
                //---------------------------------
                interrupt [EXT_INT0] void PDI_Interrupt()
                {
                unsigned char TEMP[2];
                Write_Command(0xF4);
                Read_Data(TEMP,2);
                //if(TEMP[0] & 0x80)
                // Suspend_ch();
                if(TEMP[0] & 0x40)
                Bus_Reset();
                if(TEMP[0] & 0x01)
                Endpoint_Ctrl_Out();
                if(TEMP[0] & 0x02)
                Endpoint_Ctrl_In();
                if(TEMP[0] & 0x04)
                Endpoint1_Out();
                //if(TEMP[0] & 0x08)
                // Endpoint1_In();
                // if(TEMP[0] & 0x10)
                // Endpoint2_Out();
                if(TEMP[0] & 0x20)
                Endpoint2_In();

                }
                //--------------------------------
                void Write_Command(unsigned char com)
                {
                DDRA=0xFF;
                PDIUSBD12_RD=1;
                PDIUSBD12_A0=1;
                PORTA=com;
                PDIUSBD12_WR=0;
                PDIUSBD12_WR=1;
                PDIUSBD12_A0=0;

                }
                //----------------------------------
                void Write_Data(unsigned char data)
                {
                DDRA=0xFF;
                PDIUSBD12_RD=1;
                PDIUSBD12_A0=0;
                PORTA=data;
                PDIUSBD12_WR=0;
                PDIUSBD12_WR=1;

                }
                //-----------------------------------
                void Read_Data(unsigned char *TEMP,unsigned char num)
                {
                unsigned char i;
                PDIUSBD12_WR=1;
                DDRA=0x00;
                for(i=0;i<=num;i++){
                PDIUSBD12_RD=0;
                TEMP[i]=PINA;
                PDIUSBD12_RD=1;
                }
                }
                //-----------------------------------
                void Bus_Reset()
                {
                Address_Device=0;
                Write_Command(0xD0);
                Write_Data(0x80);
                Write_Command(0xF3);
                Write_Data(0x1E);
                Write_Data(0x02);
                Write_Command(0xD8);
                Write_Data(0x01);
                }
                //--------------------------------------
                void Endpoint_Ctrl_Out()
                {
                unsigned char TEMP[1],Data_Packet[16];
                Write_Command(0x40);
                Read_Data(TEMP,1);
                if(TEMP[0] & 0x01){
                if(TEMP[0] & 0x20){
                Write_Command(0x00);
                Write_Command(0xF0);
                Read_Data(Data_Packet,16);
                Write_Command(0xF1);
                Write_Command(0xF2);
                Write_Command(0x41);
                Write_Command(0xF1);
                Write_Command(0xF2);
                if(Data_Packet[1] == 8){
                bmRequestType=Data_Packet[2];
                bRequest=Data_Packet[3];
                wValue=Data_Packet[5];
                wValue=(wValue<<8)|Data_Packet[4];
                wIndex=Data_Packet[7];
                wIndex=(wIndex<<8)|Data_Packet[6];
                wLength=Data_Packet[9];
                wLength=(wLength<<8)|Data_Packet[8];
                switch(bmRequestType & 0x60){
                case 0x00:
                Standard_Request();
                break;
                case 0x20:
                //Class_Request();
                break;
                case 0x40:
                //Vendor_Request();
                break;
                default:
                Write_Command(0x40);
                Write_Data(0x01);
                }
                }else{
                Write_Command(0x40);
                Write_Data(0x01);
                }
                }
                if((TEMP[0] & 0x1E) !=0){
                //Error();
                }
                }
                }
                //------------------------------------
                void Standard_Request()
                {
                switch(bRequest){
                case 0x00:
                Get_Status();
                break;
                case 0x01:
                Clear_Feature();
                break;
                case 0x03:
                Set_Feature();
                break;
                case 0x05:
                Set_Address();
                break;
                case 0x06:
                Get_Descriptor();
                break;
                case 0x07:
                //Set_Descriptor();
                break;
                case 0x08:
                //Get_Configuration();
                break;
                case 0x09:
                // Set_Configuration();
                break;
                case 0x0A:
                //Get_Interface();
                break;
                case 0x0b:
                // Set_Interface();
                break;
                default:
                Write_Command(0x40);
                Write_Data(0x01);
                }
                }
                //-----------------------------------
                void Get_Status()
                {
                unsigned char Data,Flag=0;
                switch(bmRequestType & 0x03){
                case 0:
                Data=0;break;
                case 1:
                Data=0;break;
                case 2:
                Data=0;break;
                default:
                Write_Command(0x41);
                Write_Data(0x01);
                Flag=1;
                }
                if(Flag==0){
                Write_Command(0xF0);
                Write_Data(0);
                Write_Data(2);
                Write_Data(Data);
                Write_Data(0);
                Write_Command(0xFA);
                }
                }
                //-----------------------------
                void Set_Feature()
                {
                switch(bmRequestType & 0x03){
                case 0:
                if(wValue==1){
                Write_Command(0x41);
                Write_Data(0x01);
                }
                break;
                case 2:
                if(wValue==0){
                Write_Command(0x40 + wIndex);
                Write_Data(0x01);
                Write_Command(0x01);
                Write_Command(0xF0);
                Write_Data(0);
                Write_Data(0);
                Write_Command(0xFA);
                break;
                }
                default:
                Write_Command(0x41);
                Write_Data(0x01);
                }
                }
                //---------------------------------
                void Clear_Feature()
                {
                switch(bmRequestType & 0x03){
                case 0:
                if(wValue==1){
                Write_Command(0x41);
                Write_Data(0x01);
                }
                break;
                case 2:
                if(wValue==0){
                Write_Command(0x40 + wIndex);
                Write_Data(0x00);
                Write_Command(0x01);
                Write_Command(0xF0);
                Write_Data(0);
                Write_Data(0);
                Write_Command(0xFA);
                break;
                }
                default:
                Write_Command(0x41);
                Write_Data(0x01);
                }
                }
                //---------------------------------
                void Set_Address()
                {
                Address_Device=wValue;
                Write_Command(0xD0);
                Write_Data(0x80 | Address_Device);
                Write_Command(0x01);
                Write_Command(0xF0);
                Write_Data(0);
                Write_Data(0);
                Write_Command(0xFA);
                }
                //------------------------------------
                void Get_Descriptor()
                {
                unsigned char Type_Descriptor,Length,i;
                unsigned int DataLen;
                DataLen = wLength;
                Global_Length=0;
                index=0x40;
                Type_Descriptor=wValue>>8;
                i=0;
                switch(Type_Descriptor){
                case 1:
                p=Device_Descriptor;
                Length=p[i];break;
                case 2:
                p=Configuration_Descriptor;
                Length=p[i+2]+1;break;
                case 3:
                p=String_Descriptor;
                Length=0;
                for(i=0;i<sizeof(String_Descriptor)-1;i+=Length)
                {
                Length=p[i];
                if(wValue==0x301){
                i+=Length;
                Length=p[i];
                }
                break;
                }
                default:
                if(Type_Descriptor == 5 | Type_Descriptor==4){
                p=Configuration_Descriptor;
                Length=0;
                for(i=0;i<sizeof(Configuration_Descriptor)-1;i+=Length)
                {
                Length=p[i];
                if(Type_Descriptor==p[i+1])
                break;
                }
                }
                }
                if(DataLen > Length)DataLen=Length;
                Global_Length=DataLen;
                index_Descriptor=i;
                if(Global_Length==0){
                Write_Command(0x40);
                Write_Data(0x01);
                Write_Command(0x41);
                Write_Data(0x01);
                }else
                Endpoint_Ctrl_In();
                }
                //-------------------------------
                void Endpoint_Ctrl_In()
                {
                unsigned char TEMP[1],Length,EndLen;
                Write_Command(0x41);
                Read_Data(TEMP,1);
                if(index !=(TEMP[0] & 0x40)){
                index=TEMP[0] & 0x40;
                if(Global_Length > 16)
                Length=16;
                else
                Length=Global_Length;
                EndLen=Length+index_Descriptor;
                Write_Command(0x01);
                Write_Command(0xF0);
                Write_Data(0);
                Write_Data(Length);

                while(index_Descriptor < EndLen){
                Write_Data(p[index_Descriptor]);
                index_Descriptor++;
                Global_Length--;
                }
                Write_Command(0xFA);
                if(Global_Length==0){
                Write_Command(0x01);
                Write_Command(0xF0);
                Write_Data(0);
                Write_Command(0xFA);
                }
                }
                }
                //--------------------------------
                void Endpoint1_Out()
                {
                unsigned char Get_Data[16],i;
                Write_Command(0x42);
                Write_Command(0x02);
                Write_Command(0xF0);
                Read_Data(Get_Data,16);
                Write_Command(0xF2);
                DIR_74LS245=0;
                for(i=0;i<16;i++)
                PORTC=Get_Data[i];

                }
                //--------------------------------
                void Endpoint2_In()
                {
                unsigned int i;
                Write_Command(0x45);
                Write_Command(0x05);
                Write_Command(0xF2);
                Write_Command(0xF0);
                Write_Data(0);
                Write_Data(64);
                for(i=0;i<64;i++)
                Write_Data(i);
                Write_Command(0xFA);

                }

                دیدگاه


                  #9
                  پاسخ : PDIUSBD12 in bascom آموزش

                  راستی به علت اینکه قوانین کپی رایت رعایت بشه :
                  این برنامه سی نوشته شده توسط مولفین کتاب مرجع کامل میکروکنترلرهای AVR انتشارات نص هستش

                  دیدگاه


                    #10
                    پاسخ : PDIUSBD12 in bascom آموزش

                    GRS جان سلام.
                    میشه بفرمائید سرعت انتقال دیتاش ماکزیمم چقدر بود؟؟
                    خداوند جهاد را برای سرافرازی اسلام واجب کرد.
                    حضرت فاطمه (س)

                    دیدگاه


                      #11
                      پاسخ : PDIUSBD12 in bascom آموزش

                      نوشته اصلی توسط ایمان
                      GRS جان سلام.
                      میشه بفرمائید سرعت انتقال دیتاش ماکزیمم چقدر بود؟؟
                      ببینید دوست عزیز این چیزیه که تو دیتاشیتش نوشته بود :
                      The PDIUSBD12 fully conforms to the USB specification Rev. 2.0 (basic speed). It is
                      also designed to be compliant with most device class specifications: Imaging Class,
                      Mass Storage Devices, Communication Devices, Printing Devices, and Human
                      Interface Devices. As such, the PDIUSBD12 is ideally suited for many peripherals like
                      Printer, Scanner, External Mass Storage (Zip Drive), Digital Still Camera, etc. It offers
                      an immediate cost reduction for applications that currently use SCSI
                      implementations.
                      همینجور که میبینید نوشته با ستاندارد یو اس بی 2 و مناسب برای زیپ درایو و دستگاه های ذخیره سازی و دوربین دیجیتال و ...
                      که خوب حتماً سرعت فول رو پشتیبانی میکنه که میتونه تو این دستگاه ها استفاده بشه واگرنه فیلیپس یه همچین چیزی رو نمینوشت
                      من فکر کنم اگه میکروتون ساپرت کنه (البته AVR رو بعید میدونم) بشه تا 12 مگ ازش گرفت

                      دیدگاه


                        #12
                        پاسخ : PDIUSBD12 in bascom آموزش

                        نوشته اصلی توسط grs


                        ببینید دوست عزیز این چیزیه که تو دیتاشیتش نوشته بود :
                        The PDIUSBD12 fully conforms to the USB specification Rev. 2.0 (basic speed). It is
                        also designed to be compliant with most device class specifications: Imaging Class,
                        Mass Storage Devices, Communication Devices, Printing Devices, and Human
                        Interface Devices. As such, the PDIUSBD12 is ideally suited for many peripherals like
                        Printer, Scanner, External Mass Storage (Zip Drive), Digital Still Camera, etc. It offers
                        an immediate cost reduction for applications that currently use SCSI
                        implementations.
                        همینجور که میبینید نوشته با ستاندارد یو اس بی 2 و مناسب برای زیپ درایو و دستگاه های ذخیره سازی و دوربین دیجیتال و ...
                        که خوب حتماً سرعت فول رو پشتیبانی میکنه که میتونه تو این دستگاه ها استفاده بشه واگرنه فیلیپس یه همچین چیزی رو نمینوشت
                        من فکر کنم اگه میکروتون ساپرت کنه (البته AVR رو بعید میدونم) بشه تا 12 مگ ازش گرفت
                        که میشه 1MByte/S
                        خداوند جهاد را برای سرافرازی اسلام واجب کرد.
                        حضرت فاطمه (س)

                        دیدگاه

                        لطفا صبر کنید...
                        X