USB Interface für WIN mit 4xIN/6xOUT/1xAD/1xIR und 1xTemp

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
mpz
Beiträge: 497
Registriert: 14.06.2005 15:53
Computerausstattung: Win 10 Pro, 16 GB Ram, Intel I5 CPU und TI1070 Grafikkarte, PB 5.73 / 6.00 beta4
Wohnort: Berlin, Tempelhof

USB Interface für WIN mit 4xIN/6xOUT/1xAD/1xIR und 1xTemp

Beitrag von mpz »

Hallo Leute,
mein Projekt mit einem USB-HDI Interface für Windows wurde überarbeitet und ist erneut abgeschlossen. Ich habe einen PIC Microcontroller an den USB Port des PCs geschaltet um Steuerungsaufgaben zu erledigen. Das Ergebnis ist eine Interface mit 4 x In, 6 x Out, 1x AD Wandler, 1 x IR Empfänger (RC-5 = Funktioniert mit einer Philips Fernbedienung) und einen Temperaturmesser (Genauigkeit von -50 bis 125 Grad, 0,5 Grad genau). Die Stromversorgung erfolgt über den USB Port. Der Bauteileaufwand ist gering, der PIC 18F2550 kostet z.b. 7.70 Euro bei www.reichelt.de. Das Gesamtprojekt liegt circa bei 20 Euro.

Grafik: Stromlaufplan
Der erste Code beinhaltet die Steuerungsoberfläche für Windows.
Der zweite Code beinhaltet den Hexcode (Betriebssystem) für den Microcontroller.
Grafik: Einstellung für das PIC Programmiergerät

Alle Angaben sind natürlich ohne Gewähr!

P.S: Man kann alle Funktionen auch einzeln verwenden. D.h nur die Eingänge oder Ausgänge etc. Die Bauteil für die anderen Funktionen läßt man einfach weg...

Gruß
MPZ


Stromlaufplan
Bild


Steuerungsoberfläche

Code: Alles auswählen

; "MPZ PIC IO INTERFACE.pb"
; 
; PowerBasic Example um ein PIC 18F2550 über USB als I/O Interface anzusteuern.
; Der PIC 18F2550 besitzt 24x I/O´s und 10x 10bit AD´s
; Dieses Programm erlaubt die Eingabe von 4x digitalen Eingängen
;                                         6x digitalen Ausgängen  
;                                         1x AD Wandlung mit 10 bit
;                                         1x Temperaturmessung von -50 - +125 ºC in 0.5 ºC
;                                         1x IR Eingang nach dem RC-5 Standard (IR Philips)
;
; PowerBasic Example to use a PIC 18F2550 with USB as I/O Interface.
; The PIC 18F2550 has 24x I/O´s and 10x 10bit AD´s
; This Programm works with 4x digital Inputs
;                          6x digital Outputs  
;                          1x AD conversion with 10 bit
;                          1x temperature measurement from -50 - +125 ºC in 0.5 ºC
;                          1x IR Input with RC-5 Standard (IR Philips)

;  
; Version 1.01 by MPZ Dez.2006
; for PB 4.02
; 
; benötigt wird die mcHID.dll von der Firma Mecanique. Die mcHID Library ist 
; Bestandteil der EasyHID Software:
; You need the mcHID.dll from the company Mecanique. The mcHID Library is included
; in the EasyHID Software:
; http://www.mecanique.co.uk/software/EasyHID.zip 
;
; Ein direkter Download der DLL ist über den folgenden Link möglich
; Direct downloadlink 
; http://www.docpro.com.br/arquivos/mcHID.zip
;
; Definierte Übergabeparameter
;
; Wert Übergabeparameter Funktion 
;  1   no                Reset ; PIC wird resetet und gibt alle Daten neu aus
;  reserviert
;  10  x                 Out PortA,(x) ; Ausgabe von PortA
;  11  x                 Out PortB,(x) ; Ausgabe von PortB
;  12  x                 Out PortC,(x) ; Ausgabe von PortC
;  13  x                 Out PortD,(x) ; Ausgabe von PortD
;  reserviert
;  14  x                 In PortA,(x) ; Eingabe von PortA
;  15  x                 In PortB,(x) ; Eingabe von PortB
;  16  x                 In PortC,(x) ; Eingabe von PortC
;  17  x                 In PortD,(x) ; Eingabe von PortD
;  reserviert
;  20  x,y               AD1(x*256+y) ; AD Wandlung mit 10 bit AD Wandler 1
;  21  x,y               AD2(x*256+y) ; AD Wandlung mit 10 bit AD Wandler 2
;  20 bis 30...
;  30  x,y              AD10(x*256+y) ; AD Wandlung mit 10 bit AD Wandler 10
;  reserviert
;  32  x,y,z              Temp(x,y,z) ; Temperaturwert x = +/-, y = Grad, z = .5 in Grad Celsius
;  reserviert
;  40  x,y,z              IR-5(x,y) ; Infrarot Eingang x = Gerät, y = Befehl, z = Wechsel 
;                         zwischen 1 und 2 bei neuem Tastendruck, oder Wert bleibt konstant
;
 
Enumeration
  #Window_0
  #Text_Status
  #Text_DIGI_IN
  #Text_Temperatur
  #Text_Temperatur_IN
  #Text_IR_Status
  #Text_IR_Status_IN
  #Listview_INPUT
  #Text_AN
  #Analog_AD
  #Text_OUT
  #Button_OUT1
  #Button_OUT2
  #Button_OUT3
  #Button_OUT4
  #Button_OUT5
  #Button_OUT6
EndEnumeration


; Global

;{/ Globale Variablen
Global pVendorID.l, pProductID.l, DeviceHandle.l, ProductName.s
Global USB_HID.l,DIGITAL_OUT.b
Global Dim BufferIn.b(8),Dim BufferOut.b(8)

#WM_APP = 32768
#WM_HID_EVENT = #WM_APP + 200
#NOTIFY_PLUGGED = 1
#NOTIFY_UNPLUGGED = 2
#NOTIFY_CHANGED = 3
#NOTIFY_READ = 4

#VendorID = 6017    ; Vendor ID "MPZ PIC I/O"
#ProductID = 2000   ; ProductID "MPZ PIC I/O"

ProductName.s = Space(256) 

;BufferIn.b(8), BufferOut (8)
;Buffer (0) = Controllregister
;Buffer (1) = Outregister x
;Buffer (2) = Outregister y
;Buffer (3) = Outregister z
;Buffer (4) = free for Future functions
;}

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 310, 185, 391, 272, "MPZ PIC I/O Interface",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_WindowCentered )
    If CreateGadgetList(WindowID(#Window_0))
      TextGadget(#Text_Status, 135, 10, 120, 20, "No Device", #PB_Text_Center | #PB_Text_Border)
      TextGadget(#Text_DIGI_IN, 30, 40, 330, 12, "DIGITAL IN 1 - IN 4 / TIME", #PB_Text_Center)
      TextGadget(#Text_Temperatur, 10, 220, 120, 20, "Temperatur in °C", #PB_Text_Center)
      TextGadget(#Text_Temperatur_In, 50, 240, 40, 20, "no", #PB_Text_Center | #PB_Text_Border)
      TextGadget(#Text_IR_Status, 220, 220, 120, 20, "IR Befehl", #PB_Text_Center)
      TextGadget(#Text_IR_Status_In, 240, 240, 80, 20, "no + no", #PB_Text_Center | #PB_Text_Border)
      ListViewGadget(#Listview_INPUT, 30, 56, 330, 50)
      TextGadget(#Text_AN, 30, 110, 330, 12, "ANALOG IN ", #PB_Text_Center)
      ProgressBarGadget(#Analog_AD, 30, 130, 330, 20, 0, 1024, #PB_ProgressBar_Smooth)
      TextGadget(#Text_OUT, 20, 160, 350, 20, "DIGITAL OUT 1 - OUT6", #PB_Text_Center)
      ButtonGadget(#Button_OUT1, 20, 180, 50, 30, "OUT 1", #PB_Button_Default | #PB_Button_Toggle)
      ButtonGadget(#Button_OUT2, 80, 180, 50, 30, "OUT 2", #PB_Button_Default | #PB_Button_Toggle)
      ButtonGadget(#Button_OUT3, 140, 180, 50, 30, "OUT 3", #PB_Button_Default | #PB_Button_Toggle)
      ButtonGadget(#Button_OUT4, 200, 180, 50, 30, "OUT 4", #PB_Button_Default | #PB_Button_Toggle)
      ButtonGadget(#Button_OUT5, 260, 180, 50, 30, "OUT 5", #PB_Button_Default | #PB_Button_Toggle)
      ButtonGadget(#Button_OUT6, 320, 180, 50, 30, "OUT 6", #PB_Button_Default | #PB_Button_Toggle)
     EndIf
     ProcedureReturn = 1
  EndIf
EndProcedure

;{/ DLL LIB

Prototype  hidConnect (pHostWin.l); As Boolean
Prototype  hidDisconnect (); As Boolean
Prototype  hidRead (pHandle.l, pData.b); As Boolean
Prototype  hidWrite (pHandle.l, pData.b); As Boolean
Prototype  hidReadEx (pVendorID.l, pProductID.l, pData.b); As Boolean
Prototype  hidWriteEx (pVendorID.l, pProductID.l, ByRef.b); As Boolean
Prototype  hidGetVendorName (pHandle.l, pText.s, pLen.l); As Long
Prototype  hidGetProductName (pHandle.l, pText.s, pLen.l); As Long
Prototype  hidGetSerialNumber (pHandle.l, pText.s, pLen.l); As Long
Prototype  hidGetVendorID (pHandle.l); As Long
Prototype  hidGetProductID (pHandle.l); As Long
Prototype  hidGetVersion (pHandle.l); As Long
Prototype  hidGetInputReportLength (pHandle.l); As Long
Prototype  hidGetOutputReportLength (pHandle.l); As Long
Prototype  hidGetHandle (pVendoID.l, pProductID.l); As Long
Prototype  hidGetItem (pIndex.l); As Long
Prototype  hidGetItemCount (); As Long
Prototype  hidSetReadNotify (pHandle.l, pValue.b);
Prototype  hidIsReadNotifyEnabled (pHandle.l); As Boolean
Prototype  hidIsAvailable (pVendorID.l, pProductID.l);  As Boolean


Define mcHID_DLL.l = OpenLibrary(#PB_Any, "mcHID.dll") 

If mcHID_DLL 
    Global hidConnect.hidConnect = GetFunction(mcHID_dll,"Connect") ; (ByVal pHostWin As Long) As Boolean
    Global hidDisconnect.hidDisconnect = GetFunction(mcHID_dll,"Disconnect");  () As Boolean
    Global hidRead.hidRead = GetFunction(mcHID_dll,"Read");  (ByVal pHandle As Long, ByRef pData As Byte) As Boolean
    Global hidWrite.hidWrite = GetFunction(mcHID_dll,"Write");  (ByVal pHandle As Long, ByRef pData As Byte) As Boolean
    Global hidReadEx.hidReadEx = GetFunction(mcHID_dll,"ReadEx");  (ByVal pVendorID As Long, ByVal pProductID As Long, ByRef pData As Byte) As Boolean
    Global hidWriteEx.hidWriteEx = GetFunction(mcHID_dll,"WriteEx");  (ByVal pVendorID As Long, ByVal pProductID As Long, ByRef pData As Byte) As Boolean
    Global hidGetVendorName.hidGetVendorName = GetFunction(mcHID_dll,"GetVendorName");  (ByVal pHandle As Long, ByVal pText As String, ByVal pLen As Long) As Long
    Global hidGetProductName.hidGetProductName = GetFunction(mcHID_dll,"GetProductName");  (ByVal pHandle As Long, ByVal pText As String, ByVal pLen As Long) As Long
    Global hidGetSerialNumber.hidGetSerialNumber = GetFunction(mcHID_dll,"GetSerialNumber");  (ByVal pHandle As Long, ByVal pText As String, ByVal pLen As Long) As Long
    Global hidGetVendorID.hidGetVendorID = GetFunction(mcHID_dll,"GetVendorID");  (ByVal pHandle As Long) As Long
    Global hidGetProductid.hidGetProductid = GetFunction(mcHID_dll,"GetProductID");  (ByVal pHandle As Long) As Long
    Global hidGetVersion.hidGetVersion = GetFunction(mcHID_dll,"GetVersion"); (ByVal pHandle As Long) As Long
    Global hidGetInputReportLength.hidGetInputReportLength = GetFunction(mcHID_dll,"GetInputReportLength");  (ByVal pHandle As Long) As Long
    Global hidGetOutputReportLength.hidGetOutputReportLength = GetFunction(mcHID_dll,"GetOutputReportLength");  (ByVal pHandle As Long) As Long
    Global hidGetHandle.hidGetHandle = GetFunction(mcHID_dll,"GetHandle");  (ByVal pVendoID As Long, ByVal pProductID As Long) As Long
    Global hidGetItem.hidGetItem = GetFunction(mcHID_dll,"GetItem");  (ByVal pIndex As Long) As Long
    Global hidGetItemCount.hidGetItemCount = GetFunction(mcHID_dll,"GetItemCount");  (ByVal pIndex As Long) As Long
    Global hidSetReadNotify.hidSetReadNotify = GetFunction(mcHID_dll,"SetReadNotify"); ByVal pHandle As Long, ByVal pValue As Boolean)
    Global hidIsReadNotifyEnabled.hidIsReadNotifyEnabled = GetFunction(mcHID_dll,"IsReadNotifyEnabled");  (ByVal pHandle As Long) As Boolean
    Global hidIsAvailable.hidIsAvailable = GetFunction(mcHID_dll,"IsAvailable"); (ByVal pVendorID As Long, ByVal pProductID As Long) As Boolean
Else
    MessageRequester("Fehlermeldung", "Das Programm konnte die mcHID.dll Datei nicht öffnen", #PB_MessageRequester_Ok)
    End
EndIf 
;}

ProcedureDLL mcHID_Free(); DLL FREE
  If mcHID_DLL
    CloseLibrary(#PB_Any)
  EndIf
  XLTable_DLL = 0
EndProcedure

;- Window Callback 
Procedure WinProc(hWnd,Msg,wParam,lParam) 
 result = #PB_ProcessPureBasicEvents 
 
 If Msg = #WM_HID_EVENT 
       
       Select wParam
           ; HID device has been plugged message...
        Case #NOTIFY_PLUGGED
           ;HID device has been plugged
           DeviceHandle = hidGetHandle(#VendorID, #ProductID)
           If DeviceHandle
              hidGetProductName (DeviceHandle.l,ProductName,256) 
              SetGadgetText(#Text_Status, ProductName)   

              ; Reset für PIC eingefügt
              BufferOut(0) = 0
              BufferOut(1) = 1
              hidWrite (DeviceHandle.l,@BufferOut()) ; Send Out 
            
           EndIf
        Case #NOTIFY_UNPLUGGED
           ;HID device has unplugged
           DeviceHandle = hidGetHandle(#VendorID, #ProductID)
           If Not DeviceHandle
              SetGadgetText(#Text_Status, "No Device")
           EndIf
        Case #NOTIFY_CHANGED
           ;HID device has been changed
           If DeviceHandle 
              hidSetReadNotify (DeviceHandle, #True) ;read event...
           EndIf
          ;DeviceHandle = hidGetHandle(#VendorID, #ProductID)
          ;hidSetReadNotify (DeviceHandle, #True) ! IMPORTANT ! Read works only With this flag
        Case #NOTIFY_READ
           ; READ works only if the hidSetReadNotify flag is set 
           If hidRead(DeviceHandle, @BufferIn(0))
              ;AddGadgetItem(#Listview_INPUT,0, "Read: "+Str(BufferIn(0)) +"/"+ Str(BufferIn(1))+"/"+Str(BufferIn(2))+"/"+Str(BufferIn(3))+"/"+Str(BufferIn(4))+"/"+Str(BufferIn(5))+"/"+Str(BufferIn(6))+"/"+Str(BufferIn(7))+"/"+Str(BufferIn(8)))
              If BufferIn(1) = 16 ; In PortC,(x) ; Eingabe von PortC
                 If BufferIn(2) = 1 
                    AddGadgetItem(#Listview_INPUT,0, "Button 1 at "+FormatDate("%hh:%ii:%ss", Date()))             
                 ElseIf BufferIn(2) = 2
                    AddGadgetItem(#Listview_INPUT,0, "Button 2 at "+FormatDate("%hh:%ii:%ss", Date()))             
                 ElseIf BufferIn(2) = 4
                    AddGadgetItem(#Listview_INPUT,0, "Button 3 at "+FormatDate("%hh:%ii:%ss", Date()))             
                 ElseIf BufferIn(2) = 8
                   AddGadgetItem(#Listview_INPUT,0, "Button 4 at "+FormatDate("%hh:%ii:%ss", Date()))
                 EndIf 
              ElseIf BufferIn(1) = 20 ; AD1(x*256+y) ; AD Wandlung mit 10 bit AD Wandler 1
                 AD_Wert = BufferIn(2)*256
                 If BufferIn(3) > 0 
                    AD_Wert = AD_Wert + BufferIn(3)
                 Else
                    AD_Wert = AD_Wert + 256 + BufferIn(3)
                 EndIf
                 SetGadgetState   (#Analog_AD,AD_Wert)
              ElseIf BufferIn(1) = 32 ; Temp(x,y,z) ; Temperaturwert 
                 If BufferIn(2) = 1 
                    Temperatur$ = "+" + Str (BufferIn(3)) + "." + Str (BufferIn(4))
                 Else
                    Temperatur$ = "-" + Str (BufferIn(3)) + "." + Str (BufferIn(4))
                 EndIf
                 SetGadgetText(#Text_Temperatur_IN, Temperatur$)
              ElseIf BufferIn(1) = 40 ; IR-5(x,y) ; Infrarot Eingang x = Gerät, y = Befehl
                 SetGadgetText(#Text_IR_Status_IN, Str(BufferIn(2)) + " + "+Str(BufferIn(3)))
                 AddGadgetItem(#Listview_INPUT,0, "IR = "+Str(BufferIn(2))+" + "+Str(BufferIn(3))+" + "+Str(BufferIn(4)))             
              EndIf  
           Else 
              AddGadgetItem(#Listview_INPUT,0, "Read Error!")
           EndIf
        EndSelect
   
   EndIf

  
  ProcedureReturn result 
EndProcedure 

;{ Mainunit
If Open_Window_0()

hidconnect (WindowID(#Window_0))
SetWindowCallback(@WinProc())

  Repeat
    EventID = WaitWindowEvent()

    Select EventID
  
    Case #PB_Event_Gadget
  
      Select EventGadget()
          
      Case #Button_OUT1
          If GetGadgetState(#Button_OUT1)
             DIGITAL_OUTA = DIGITAL_OUTA | %000001
          Else
             DIGITAL_OUTA = DIGITAL_OUTA & %111110
          EndIf
          BufferOut(0) = 0
          BufferOut(1) = 10 ; Out PortA,(x) ; Ausgabe von PortA
          BufferOut(2) = DIGITAL_OUTA
          hidWrite (DeviceHandle.l,@BufferOut()) ; Send Out 

      Case #Button_OUT2
          If GetGadgetState(#Button_OUT2)
             DIGITAL_OUTC = DIGITAL_OUTC | %000010
          Else
             DIGITAL_OUTC = DIGITAL_OUTC & %111101
          EndIf
          BufferOut(0) = 0
          BufferOut(1) = 12 ; Out PortC,(x) ; Ausgabe von PortC
          BufferOut(2) = DIGITAL_OUTC
          hidWrite (DeviceHandle.l,@BufferOut()) ; Send Out

      Case #Button_OUT3
          If GetGadgetState(#Button_OUT3)
             DIGITAL_OUTA = DIGITAL_OUTA | %000100
          Else
             DIGITAL_OUTA = DIGITAL_OUTA & %111011
          EndIf
          BufferOut(0) = 0
          BufferOut(1) = 10 ; Out PortA,(x) ; Ausgabe von PortA
          BufferOut(2) = DIGITAL_OUTA
          hidWrite (DeviceHandle.l,@BufferOut()) ; Send Out

      Case #Button_OUT4
          If GetGadgetState(#Button_OUT4)
             DIGITAL_OUTA = DIGITAL_OUTA | %001000
          Else
             DIGITAL_OUTA = DIGITAL_OUTA & %110111
          EndIf
          BufferOut(0) = 0
          BufferOut(1) = 10 ; Out PortA,(x) ; Ausgabe von PortA
          BufferOut(2) = DIGITAL_OUTA
          hidWrite (DeviceHandle.l,@BufferOut()) ; Send Out

      Case #Button_OUT5
          If GetGadgetState(#Button_OUT5)
             DIGITAL_OUTC = DIGITAL_OUTC | %010000
          Else
             DIGITAL_OUTC = DIGITAL_OUTC & %101111
          EndIf
          BufferOut(0) = 0
          BufferOut(1) = 12 ; Out PortC,(x) ; Ausgabe von PortC
          BufferOut(2) = DIGITAL_OUTC
          hidWrite (DeviceHandle.l,@BufferOut()) ; Sende Daten zu einem HID Gerät

      Case #Button_OUT6
          If GetGadgetState(#Button_OUT6)
             DIGITAL_OUTA = DIGITAL_OUTA | %100000
          Else
             DIGITAL_OUTA = DIGITAL_OUTA & %011111
          EndIf
          BufferOut(0) = 0
          BufferOut(1) = 10 ; Out PortA,(x) ; Ausgabe von PortA
          BufferOut(2) = DIGITAL_OUTA
          hidWrite (DeviceHandle.l,@BufferOut()) ; Sende Daten zu einem HID Gerät
     
    EndSelect
  EndSelect
  
Until EventID = #PB_Event_CloseWindow

  hidDisconnect ()
  mcHID_Free()
EndIf
End
;}
;
Betriebssystem PIC 18F2550 (mpz_pic_io.HEX)

Code: Alles auswählen

;PIC_IO.HEX File wird erstellt
;-----------------------------
If CreateFile(1, "PIC_IO.HEX" )
    Restore StringData
    Repeat
    Read Daten.s
        If Daten.s = "End" : Break : EndIf
        WriteStringN(1,Daten.s)
    ForEver
    CloseFile (1)
EndIf

DataSection
  StringData:
  Data.s ":100000003FEF07F0FFFFFFFFE9CF01F0EACF02F07B"
  Data.s ":10001000E1CF03F0E2CF04F0D9CF05F0DACF06F05C"
  Data.s ":10002000D0EC04F001C0E9FF02C0EAFF03C0E1FF29"
  Data.s ":1000300004C0E2FF05C0D9FF06C0DAFF11000401C9"
  Data.s ":100040000401376B1E0E716E0401400E096F5B0ECA"
  Data.s ":100050000A6F040E0B6F880E086F9B0E0E6F040E56"
  Data.s ":100060000F6F0D6B400E0C6F1200040104012A6B20"
  Data.s ":1000700014EE9BF024EE18F0080E2A5D04E2E6CFA1"
  Data.s ":10008000DEFF2A2BF9D7080E3E6F3F6B12000401EA"
  Data.s ":1000900004012A6B14EE20F024EE18F0020E2A5D03"
  Data.s ":1000A00004E2E6CFDEFF2A2BF9D7020E3E6F3F6B4C"
  Data.s ":1000B00012000401800E040110634FD01351030895"
  Data.s ":1000C0002FE0135102080EE01351010801E044D063"
  Data.s ":1000D000010E396F520E3A6F140E3B6F120E3E6FC7"
  Data.s ":1000E0003F6B3AD0010E396F450EE16E040EE26EA1"
  Data.s ":1000F0001245E126000EE222E6CF3AF4E7CF3BF4C8"
  Data.s ":10010000F86AF76A040E3A25F66E3B51F7220900A9"
  Data.s ":10011000F5CF3EF409000A00F5CF3FF40A001CD0E9"
  Data.s ":10012000010E396F020E126502D0030E126F490ED6"
  Data.s ":10013000E16E040EE26E1245E126000EE222E6CFE9"
  Data.s ":100140003AF4E7CF3BF43AC4F6FF3BC4F7FF0800AC"
  Data.s ":10015000F5503E6F3F6B00D0348312000401010E56"
  Data.s ":100160000401396F716A726A736A746A756A766AB1"
  Data.s ":10017000776A786A796A7A6A7B6A7C6A7D6A7E6A5B"
  Data.s ":100180007F6A326B336B12C431F4125103E1050EF6"
  Data.s ":10019000306F04D0060E306F1FEC00F01200040127"
  Data.s ":1001A0000401186B196B10511F0B020814E0105159"
  Data.s ":1001B0001F0B01080CE010511F0B000801E02CD0B0"
  Data.s ":1001C000010E0401396F34A101D0188325D0010E2E"
  Data.s ":1001D0000401396F21D0010E0401396F14510F0B46"
  Data.s ":1001E0000800F350296B000F286F040E29231451C7"
  Data.s ":1001F000800B01E0010E0400F35028253C6F000E37"
  Data.s ":1002000029213D6F3CC4E1FF3DC4E2FFE750040BF0"
  Data.s ":1002100002E0010E186F00D0010E0401396309E1FC"
  Data.s ":10022000180E3A6F040E3B6F3493020E3E6F3F6B15"
  Data.s ":1002300000D012000401010E0401125D0CE1105106"
  Data.s ":100240001F0B000808E1010E396F030E115D02E17A"
  Data.s ":10025000348101D03491000E0401125D37E1105158"
  Data.s ":100260001F0B020833E114510F0B00082FE0010EA1"
  Data.s ":10027000396F14510F0B0800F350296B000F286FD2"
  Data.s ":10028000040E29231451800B01E0010E0400F350E9"
  Data.s ":1002900028253C6F000E29213D6F030E115D07E1FB"
  Data.s ":1002A000840E3CC4E1FF3DC4E2FFE76E0FD014AF03"
  Data.s ":1002B00007D0000E3CC4E1FF3DC4E2FFE76E06D06C"
  Data.s ":1002C000880E3CC4E1FF3DC4E2FFE76E120004016A"
  Data.s ":1002D000010E0401135D04E0030E135D10E01AD05B"
  Data.s ":1002E000000E0401125D04E0010E125D07E012D061"
  Data.s ":1002F000020E0401396F35EC00F00CD00BD0000E6B"
  Data.s ":100300000401125D01E006D0020E0401396F47ECD2"
  Data.s ":1003100000F000D0180E04013A6F040E3B6F3493C6"
  Data.s ":1003200012000401020E0401135D04E0030E135DCC"
  Data.s ":100330000EE01AD0000E0401125D01E015D0020E8D"
  Data.s ":100340000401396F5B0E3C6F040E3D6F0DD0000E43"
  Data.s ":100350000401125D01E008D0020E0401396F200E85"
  Data.s ":100360003C6F040E3D6F00D012000401080E040122"
  Data.s ":100370003E5D000E3F5905E23EC440F43FC441F4E7"
  Data.s ":1003800004D0080E406F000E416F04930491415158"
  Data.s ":10039000030B041340C405F440513E5F41513F5BE1"
  Data.s ":1003A000180E3C6F040E3D6F34A31AD03AC4F6FF0A"
  Data.s ":1003B0003BC4F7FFF86A3CC4E1FF3DC4E2FF04011F"
  Data.s ":1003C0004051411105E1F6CF3AF4F7CF3BF41FD08D"
  Data.s ":1003D0000900F5CFE6FF0900400701E24107EFD72A"
  Data.s ":1003E0003AC4E1FF3BC4E2FF3CC4D9FF3DC4DAFF9D"
  Data.s ":1003F00004014051411105E1E1CF3AF4E2CF3BF471"
  Data.s ":1004000006D0E6CFDEFF400701E24107F1D7120038"
  Data.s ":10041000040104011051600BE842E842E842E8425E"
  Data.s ":10042000E84200085CE111510C0858E0115107083E"
  Data.s ":1004300055E011510B0846E011510A0834E0115102"
  Data.s ":1004400003082EE0115101082BE01151000825E0AE"
  Data.s ":100450001151080816E01151090810E01151060861"
  Data.s ":100460000AE01151050801E03AD0010E0401396F8C"
  Data.s ":10047000040E306F34D059EC00F031D0AEEC00F007"
  Data.s ":100480002ED0010E0401396F310E3A6F040E3A6F0F"
  Data.s ":100490003493010E3E6F3F6B22D0CFEC00F01FD0A3"
  Data.s ":1004A0001AEC01F01CD0010E0401396F14513A6F9F"
  Data.s ":1004B0003B6B320E3A27040E3B233493010E3E6F02"
  Data.s ":1004C0003F6B0DD0010E0401396FE26A320E142524"
  Data.s ":1004D000E16E040EE22212C4E7FF01D000D0040155"
  Data.s ":1004E00012000401040110511F0B010878E114519E"
  Data.s ":1004F000000875E11151060801E02AD013512108C6"
  Data.s ":1005000007E01351220812E0135123081DE01DD00B"
  Data.s ":10051000020E0401396F010E316304D09A0E3A6F56"
  Data.s ":10052000140E3B6F090E3E6F3F6B0FD0020E04019D"
  Data.s ":10053000396F010E316307D0C80E3A6F140E3B6F4E"
  Data.s ":100540002F0E3E6F3F6B01D000D00401348300D0EA"
  Data.s ":1005500004011051600BE842E842E842E842E842F8"
  Data.s ":1005600001083DE111510B0834E01151030825E069"
  Data.s ":1005700011510A081CE0115102080DE0115109083F"
  Data.s ":1005800007E01151010801E02AD067EC01F027D003"
  Data.s ":1005900091EC01F024D0020E0401396F350E3A6F50"
  Data.s ":1005A000040E3B6F3493010E3E6F3F6B18D0020E6A"
  Data.s ":1005B0000401396F1351356F12D0020E0401396FE7"
  Data.s ":1005C000360E3A6F040E3B6F3493010E3E6F3F6B55"
  Data.s ":1005D00006D0020E0401396F1251366F00D00401AB"
  Data.s ":1005E00012000401000E040139630AD0080E016FE5"
  Data.s ":1005F000100E026F040E036F840E006F046F30D074"
  Data.s ":10060000040110AF1ED004013E51165D3F51175931"
  Data.s ":1006100004E216C43EF417C43FF4B5EC01F0010E39"
  Data.s ":100620000401386F080E016F100E026F040E036F85"
  Data.s ":10063000800E006F180E066F040E076FC80E046F51"
  Data.s ":100640000FD0020E0401386F056BC80E046F080E40"
  Data.s ":10065000016F180E026F040E036FC80E006F00D0FA"
  Data.s ":100660006D9800D012000401030E04010015436FC1"
  Data.s ":1006700001C442F442513E2743513F23180E3A6FC2"
  Data.s ":10068000040E3B6F3AC4E1FF3BC4E2FF3CC4D9FF18"
  Data.s ":100690003DC4DAFF04014251431105E1E1CF3AF4D0"
  Data.s ":1006A000E2CF3BF406D0E6CFDEFF420701E243078C"
  Data.s ":1006B000F1D712000401020E0401135D04E0030EE1"
  Data.s ":1006C000135D17E020D0000E0401125D01E01BD085"
  Data.s ":1006D00004012A6B14EE5BF024EE9BF0080E2A5DF9"
  Data.s ":1006E00004E2E6CFDEFF2A2BF9D7080E3E6F3F6B00"
  Data.s ":1006F0000AD0000E0401125D01E005D0020E0401D3"
  Data.s ":100700003E6F3F6B00D012000401000E0401386FF1"
  Data.s ":10071000080E016F100E026F040E036F880E006F3B"
  Data.s ":10072000000E046F12000401000E0401386F000E69"
  Data.s ":10073000396F3E6B3F6B08EC02F0000E0401396329"
  Data.s ":1007400002D071EC02F0F1EC02F012000401020E92"
  Data.s ":100750000401386311D033EC03F0020E0401396355"
  Data.s ":1007600002D05AEC03F0040100BD03D0C80E006FA4"
  Data.s ":1007700002D0880E006F03D084EC03F000D012008A"
  Data.s ":100780000401040E0401306309D012C46EFF6E50E0"
  Data.s ":1007900003E0050E306F02D0030E306F010E04012E"
  Data.s ":1007A00038630BD0B5EC01F0040104BD03D0C80ED2"
  Data.s ":1007B000046F02D0880E046F03D084EC03F000D0E5"
  Data.s ":1007C000120004010401376B08BF1BD009512C65CE"
  Data.s ":1007D00002D009C42CF4376B14EE5BF02DC4D9FFA2"
  Data.s ":1007E0002EC4DAFF2C51375D04E2E6CFDEFF372B53"
  Data.s ":1007F000F9D7400E096F400E0817087D880E0813C0"
  Data.s ":1008000000D004013751120004016D92699468947C"
  Data.s ":10081000120004016A6A686A9F0E6B6E3B0E696E75"
  Data.s ":100820006E6A716A726A736A746A756A766A776ADE"
  Data.s ":10083000786A796A7A6A7B6A7C6A7D6A7E6A7F6A8C"
  Data.s ":10084000160E706E68A602D06896FCD76D9884EC80"
  Data.s ":1008500003F004013491316B030E306F1200040178"
  Data.s ":10086000698468986D8212000401689C120004017A"
  Data.s ":1008700070A003D084EC03F07090689A1200040119"
  Data.s ":100880006892120004017C0E6C1404012F6F000E9C"
  Data.s ":100890002F6301D005D0040E2F6301D00ED010D0ED"
  Data.s ":1008A000040100513C0BE842E8420D0803E193ECDF"
  Data.s ":1008B00003F002D0A6EC03F003D0C0EC03F000D0AC"
  Data.s ":1008C000120004017C0E6C1404012F6F080E2F63BC"
  Data.s ":1008D00001D005D00C0E2F6301D00DD00DD057C420"
  Data.s ":1008E0002DF458C42EF4080E04012C6FE1EC03F033"
  Data.s ":1008F0000401446F01D000D01200E9CF51F4EACFD7"
  Data.s ":1009000052F4E1CF53F4E2CF54F4D9CF55F4DACF17"
  Data.s ":1009100056F40401000E0401306301D034D069A400"
  Data.s ":1009200004D068A402D004EC04F06DB22CD069A00D"
  Data.s ":1009300004D068A002D009EC04F069A804D068A82B"
  Data.s ":1009400002D02FEC04F069AC04D068AC02D034ECD7"
  Data.s ":1009500004F069AA04D068AA02D037EC04F069A2B6"
  Data.s ":1009600004D068A202D03FEC04F0030E0401306111"
  Data.s ":1009700001D009D069A607D068A605D042EC04F0E2"
  Data.s ":1009800061EC04F0689656C4DAFF55C4D9FF54C42C"
  Data.s ":10099000E2FF53C4E1FF52C4EAFF51C4E9FF120071"
  Data.s ":1009A000A0AA05D0A1AA03D07DEC04F0A19A120060"
  Data.s ":1009B000340E566EFF0E556E562E01D003D0552EB6"
  Data.s ":1009C000FED7FAD7D00E556E552EFED71200040171"
  Data.s ":1009D00004010CBFFED7400E2C6502D0400E2C6FD8"
  Data.s ":1009E0002A6B2DC4E1FF2EC4E2FF24EE9BF02C51B4"
  Data.s ":1009F0002A5D04E2E6CFDEFF2A2BF9D704012CC4DE"
  Data.s ":100A00000DF4400E0C170C7D880E0C131200040E12"
  Data.s ":100A1000566EFF0E556E562E01D003D0552EFED7C2"
  Data.s ":100A2000FAD7380E556E552EFED700001200810EF3"
  Data.s ":100A3000556E552EFED7000000001200530E556E65"
  Data.s ":100A4000552EFED712001A0E576EFF0E566EFF0E71"
  Data.s ":100A5000556E572E01D007D0562E01D003D0552EFB"
  Data.s ":100A6000FED7FAD7F6D77F0E566EFF0E556E562E6E"
  Data.s ":100A700001D003D0552EFED7FAD7590E556E552EFC"
  Data.s ":100A8000FED700000000120004016DB61200140E23"
  Data.s ":100A90006F6E000E0401306F346B316B6D6A696AE2"
  Data.s ":100AA0006D86010E306FD8EC04F06DBA06D0686A1E"
  Data.s ":100AB000696A69806988020E0401306F12001200B1"
  Data.s ":100AC0004C6A04010CBF4C2A4C50000A02E02E6A0A"
  Data.s ":100AD0000CD0A09A2BC02DF42CC02EF42DC02CF4D9"
  Data.s ":100AE000E7EC04F0A08A010E2E6E2EC04BF012002F"
  Data.s ":100AF000240E556E552EFED700001200010E556EC5"
  Data.s ":100B0000552EFED70000120004016DA612006D6A7A"
  Data.s ":100B1000696A000E0401306F1200F26AF50EF16E80"
  Data.s ":100B2000C00EF06ED09E9D6AA06A9E6AA16A0F0EEA"
  Data.s ":100B3000C112020E926EFF0E936E040E946E896ABD"
  Data.s ":100B40008A6A8B6A1200809082908094809682924A"
  Data.s ":100B5000809A1200276A26C04DF0010E4B6E4D5050"
  Data.s ":100B600004E04B364B90FF0FFBD74BC029F0291CFC"
  Data.s ":100B7000286E24C04BF025C04CF04BC0E9FF24C0C8"
  Data.s ":100B80004EF025C04FF04FC04BF04BC0EAFF120EA5"
  Data.s ":100B9000E924E16EEACFE2FF2850EF162850E7166D"
  Data.s ":100BA00007EC05F02950E71217EC05F02950EF1477"
  Data.s ":100BB0004D6E4D50000A02E0010E276E07EC05F065"
  Data.s ":100BC00027C04BF0120026C04CF0010E4B6E4C506B"
  Data.s ":100BD00004E04B364B90FF0FFBD74BC02AF04B1C69"
  Data.s ":100BE000296E24C0E9FF25C04BF04BC0EAFF120E6E"
  Data.s ":100BF000E924E16EEACFE2FF286A285007081FE3E4"
  Data.s ":100C000028C04CF027C04BF04C5004E04B324B9EB8"
  Data.s ":100C1000FF0FFBD7010E4B144C6E2950EF162950D5"
  Data.s ":100C2000E7164C50000A02E02A50E71217EC05F0D4"
  Data.s ":100C30002A50E7122850070A02E0282ADED71EECC5"
  Data.s ":100C400005F01EEC05F0120004EE00F0050EEE6A51"
  Data.s ":100C5000EA62FDD723EC05F00401760E0401456F2E"
  Data.s ":100C6000140E466F760E476F140E486F260E496FAE"
  Data.s ":100C7000150E4A6F2E0E4B6F150E4C6F520E4D6FA8"
  Data.s ":100C8000150E4E6F7E0E4F6F150E506F24C057F429"
  Data.s ":100C900025C058F426C059F427C05AF444EC05F096"
  Data.s ":100CA000A19AA08AF28CF28E1200600E2B6E000EBA"
  Data.s ":100CB0002C6E24C060F025C061F026C062F027C011"
  Data.s ":100CC00063F00001646B656B666B080E2D6E60EC63"
  Data.s ":100CD00005F01200C26A070EC012C08E24C04BF08D"
  Data.s ":100CE0004B364B904B364B904B50C212C28078EC37"
  Data.s ":100CF00005F0C2824D6AC2B24D2A4D50010A02E18E"
  Data.s ":100D00000000F8D7C4CF4DF0000E4E6E4DC04EF02F"
  Data.s ":100D10004D6A4DC025F04EC026F0C3504D10256ED3"
  Data.s ":100D20004EC026F0000E2612C29025C04BF026C001"
  Data.s ":100D30004CF01200276A26C04CF0010E4B6E4C504E"
  Data.s ":100D400004E04B364B90FF0FFBD74BC02AF04B1CF7"
  Data.s ":100D5000296E24C0E9FF25C04BF04BC0EAFF120EFC"
  Data.s ":100D6000E924E16EEACFE2FF286A2850070825E36C"
  Data.s ":100D70002950EF162950E7167EEC05F02A50E712AD"
  Data.s ":100D80007EEC05F02A50EF144C6E4C50000A0CE03B"
  Data.s ":100D900028C04CF0010E4B6E4C5004E04B364B908B"
  Data.s ":100DA000FF0FFBD74B5027121EEC05F01EEC05F091"
  Data.s ":100DB0002850070A02E0282AD8D727C04BF0120093"
  Data.s ":100DC0004C6A82B44C2A4CC024F0006A4D6A82B44A"
  Data.s ":100DD0004D2AFA0E005CFF0ED8B0000E4B6E4B5041"
  Data.s ":100DE00024144C6E4D504C1802E1002AEFD7FA0E35"
  Data.s ":100DF000001802E10DEC07F0080E566EFF0E556E5E"
  Data.s ":100E0000562E01D003D0552EFED7FAD71D0E556EA3"
  Data.s ":100E1000552EFED70000000011D0070E566EFF0EB3"
  Data.s ":100E2000556E562E01D003D0552EFED7FAD7790E27"
  Data.s ":100E3000556E552EFED70000010E076E24C04BF0F4"
  Data.s ":100E40001200246AA09A0401060E0401306101D048"
  Data.s ":100E500008D06DB206D0445304E044C44BF0446B58"
  Data.s ":100E600004D04B6A0401446B00D0A08A120024C055"
  Data.s ":100E70004BF0120084EC05F0A19AA09A12000F6AC0"
  Data.s ":100E8000106A8DEC05F0086A096A0A6A0B6AA3EC1D"
  Data.s ":100E900005F0800E246E0F0E256E040E266EAAEC51"
  Data.s ":100EA00005F0800E246E0F0E256E040E266ECC0EFD"
  Data.s ":100EB000276EE3EC05F0800E246E0F0E256E040EF7"
  Data.s ":100EC000266E440E276EE3EC05F0C70E556E552EC8"
  Data.s ":100ED000FED700000000800E246E0F0E256E040E5B"
  Data.s ":100EE000266EAAEC05F0800E246E0F0E256E040E01"
  Data.s ":100EF000266ECC0E276EE3EC05F0800E246E0F0EEE"
  Data.s ":100F0000256E040E266EBE0E276EE3EC05F0A00ED5"
  Data.s ":100F1000246E000E256E600E266E000E276E24ECE9"
  Data.s ":100F200006F01A0E576EFF0E566EFF0E556E572EB8"
  Data.s ":100F300001D007D0562E01D003D0552EFED7FAD7B8"
  Data.s ":100F4000F6D77F0E566EFF0E556E562E01D003D08B"
  Data.s ":100F5000552EFED7FAD7590E556E552EFED70000E6"
  Data.s ":100F600000001A0E576EFF0E566EFF0E556E572E6E"
  Data.s ":100F700001D007D0562E01D003D0552EFED7FAD778"
  Data.s ":100F8000F6D77F0E566EFF0E556E562E01D003D04B"
  Data.s ":100F9000552EFED7FAD7590E556E552EFED70000A6"
  Data.s ":100FA0000000010E81144F6E4F50010A0FE10C50EA"
  Data.s ":100FB000000A0AE1100E246E010E256E266A276AC9"
  Data.s ":100FC00055EC06F0010E0C6EE7EF07F00C6A4F6A65"
  Data.s ":100FD00081B24F2A4F50010A0FE10D50000A0AE179"
  Data.s ":100FE000100E246E020E256E266A276A55EC06F056"
  Data.s ":100FF000010E0D6EFDEF07F00D6A4F6A81B44F2AA6"
  Data.s ":101000004F50010A0FE10E50000A0AE1100E246E43"
  Data.s ":10101000040E256E266A276A55EC06F0010E0E6E48"
  Data.s ":1010200013EF08F00E6A4F6A81B84F2A4F50010A39"
  Data.s ":101030000FE11150000A0AE1100E246E080E256E11"
  Data.s ":10104000266A276A55EC06F0010E116E29EF08F0AA"
  Data.s ":10105000116A000E131802E1210E12181EE1010E92"
  Data.s ":10106000246E6AEC06F04BC012F04CC013F04C50EA"
  Data.s ":10107000151802E114504B1810E0140E246E13C022"
  Data.s ":101080004BF04C6A4BC025F012C026F0276A55EC95"
  Data.s ":1010900006F012C014F013C015F0800E246E0F0E6F"
  Data.s ":1010A000256E040E266EAAEC05F04BC016F04B50D0"
  Data.s ":1010B000000A77E1800E246E0F0E256E040E266E58"
  Data.s ":1010C000CC0E276EE3EC05F0800E246E0F0E256E1D"
  Data.s ":1010D000040E266E440E276EE3EC05F0C70E556E27"
  Data.s ":1010E000552EFED700000000800E246E0F0E256ED8"
  Data.s ":1010F000040E266EAAEC05F0800E246E0F0E256EEF"
  Data.s ":10110000040E266ECC0E276EE3EC05F0800E246EE6"
  Data.s ":101110000F0E256E040E266EBE0E276EE3EC05F054"
  Data.s ":10112000800E246E0F0E256E040E266E9AEC06F0CD"
  Data.s ":101130004BC017F0800E246E0F0E256E040E266E27"
  Data.s ":101140009AEC06F04BC018F0175019182AE0185006"
  Data.s ":10115000FF0A0AE11A6AFF0E17104B6E4BC017F018"
  Data.s ":101160004B50010F176E02D0010E1A6E010E1714AC"
  Data.s ":101170004B6E050E4B02F3CF50F050C018F017C065"
  Data.s ":101180004BF04B324B9E4BC01BF0200E246E1AC00E"
  Data.s ":1011900025F04BC026F050C027F055EC06F017C0E4"
  Data.s ":1011A00019F0006A506A82B4502A5050010AFF0EAA"
  Data.s ":1011B000D8A4000E4F6E270E1D5C02E1100E1C5CC1"
  Data.s ":1011C000FF0ED8B0000E4B6E4F504B164B5207E03F"
  Data.s ":1011D0001C4A1D2A080E556E552EFED7E3D71C6AF1"
  Data.s ":1011E0001D6A4F6A82B44F2A4F50000AD8A4DAD041"
  Data.s ":1011F000506A82B4502A5050000AFF0ED8A4000E44"
  Data.s ":101200004F6E000E4B6E010E4B5C02E1040E005C53"
  Data.s ":10121000FF0ED8B0000E4B6E4F504B164B5202E0F3"
  Data.s ":10122000002AE6D7000E010802E10050040810E28F"
  Data.s ":10123000070E566EFF0E556E562E01D003D0552E5A"
  Data.s ":10124000FED7FAD7790E556E552EFED70000A9D7D6"
  Data.s ":101250000A6A0B6A020E566EFF0E556E562E01D0AC"
  Data.s ":1012600003D0552EFED7FAD74A0E556E552EFED70F"
  Data.s ":1012700000000000E0EC06F04B50000A03E108908B"
  Data.s ":1012800043EF09F00880E0EC06F04B50000A03E160"
  Data.s ":1012900009904CEF09F00980E0EC06F04B50000A91"
  Data.s ":1012A00003E10B9855EF09F00B88E0EC06F04B508A"
  Data.s ":1012B000000A03E10B965EEF09F00B86E0EC06F006"
  Data.s ":1012C0004B50000A03E10B9467EF09F00B84E0EC4C"
  Data.s ":1012D00006F04B50000A03E10B9270EF09F00B820D"
  Data.s ":1012E000E0EC06F04B50000A03E10B9079EF09F0B7"
  Data.s ":1012F0000B80E0EC06F04B50000A03E10A9A82EF03"
  Data.s ":1013000009F00A8AE0EC06F04B50000A03E10A9863"
  Data.s ":101310008BEF09F00A88E0EC06F04B50000A03E17D"
  Data.s ":101320000A9694EF09F00A86E0EC06F04B50000AAA"
  Data.s ":1013300003E10A949DEF09F00A84E0EC06F04B50BB"
  Data.s ":10134000000A03E10A92A6EF09F00A82E0EC06F037"
  Data.s ":101350004B50000A03E10A90AFEF09F00A800750F2"
  Data.s ":10136000000A1FE1010E0914506E50C04FF04F36B5"
  Data.s ":101370004F904F50000A03E10990C0EF09F0098037"
  Data.s ":10138000280E246E0BC025F00AC026F0010E0814AA"
  Data.s ":10139000506E010E09144F6E4F505024276E55ECBD"
  Data.s ":1013A00006F0076A21EC07F04BC01EF01F6A1E50C2"
  Data.s ":1013B0001F5C4DE2A0C020F0A1C021F00001A051AF"
  Data.s ":1013C000010A02E1FF0E196E20500A0A27E1010E00"
  Data.s ":1013D00021144B6E4B5203E08080F0EF09F08090B7"
  Data.s ":1013E000040E21144F6E4F50040A03E18084FAEF7B"
  Data.s ":1013F00009F08094080E21144F6E4F50080A03E143"
  Data.s ":10140000808604EF0AF08096200E21144F6E4F5014"
  Data.s ":10141000200A03E1808A0EEF0AF0809A20500C0A1D"
  Data.s ":1014200014E1020E21144F6E4F50020A03E1828034"
  Data.s ":101430001BEF0AF08290100E21144F6E4F50100ACD"
  Data.s ":1014400003E1828225EF0AF082921F2AB0D7A9D544"
  Data.s ":10145000FFD71200010000000200000000000000A1"
  Data.s ":10146000080081001700D000070001000000010003"
  Data.s ":101470000200000001000900020029000000010034"
  Data.s ":1014800001000000A000320009000400000000007C"
  Data.s ":10149000020003000000000000000900210001001C"
  Data.s ":1014A00001000000010022002F00000007000500DD"
  Data.s ":1014B0008100030040000000140007000500010047"
  Data.s ":1014C00003004000000014000600A000FF00090017"
  Data.s ":1014D0000100A10001000900030015000000260022"
  Data.s ":1014E0000000FF0075000800950008008100020060"
  Data.s ":1014F000090004001500000026000000FF00750030"
  Data.s ":101500000800950008009100020009000500150080"
  Data.s ":10151000000026000000FF00750008009500020092"
  Data.s ":10152000B1000200C0000400030009000400120022"
  Data.s ":10153000030055000000530000004200000020009E"
  Data.s ":10154000000054000000450000005300000054005B"
  Data.s ":101550000000160003004D000000500000005A007B"
  Data.s ":101560000000200000005500000053000000420071"
  Data.s ":10157000000020000000490000004F0000000200B1"
  Data.s ":101580000300FFFFFFFFFFFFFFFFFFFFFFFFFFFF66"
  Data.s ":020000040030CA"
  Data.s ":0E000000E43CEEF0FFF99BFFFFFFFFFFFFFF68"
  Data.s ":00000001FF"
  Data.s "End"

Die Einstellung für das PIC Programmiergerätes lautet:
Bild
Zuletzt geändert von mpz am 30.01.2009 10:35, insgesamt 6-mal geändert.
Working on - MP3D Engine -
Benutzeravatar
Helmut
Beiträge: 162
Registriert: 20.09.2004 22:53

Beitrag von Helmut »

Super, bin großer PIC Fan, das schaue ich mir genauer an.
Versuche mich gerade in PIC mit CAN-Bus (18FX58. in MBasic für PIC's.
Das Datenblatt ist für mich sehr schwierig, weil Englisch....
Das wär's doch, CAN-Bus vernetzung kombiniert mit Purebasic PC-Bedienung. Perfekte Haussteuerung.
Bleib' bitte am Ball, bzw an den PIC's :-)
Benutzeravatar
mueckerich
Beiträge: 220
Registriert: 13.09.2004 11:33
Wohnort: Am schönsten Flecken der Erde, zwischen PC und Motorrad

Beitrag von mueckerich »

GENIAL :allright:
Vielen Dank für die Veröffentlichung. Die Schaltung ist hervorragend für meine Steuerungsaufgabe geeignet.
"Wenn Sie glauben, mich verstanden zu haben, dann habe ich mich falsch ausgedrückt" ( Alan Greenspan)
Benutzeravatar
mpz
Beiträge: 497
Registriert: 14.06.2005 15:53
Computerausstattung: Win 10 Pro, 16 GB Ram, Intel I5 CPU und TI1070 Grafikkarte, PB 5.73 / 6.00 beta4
Wohnort: Berlin, Tempelhof

Beitrag von mpz »

Hallo Helmut,

ich programmiere den PIC in Picbasic Pro. Die Software unterstützt zwar auch einen PIC 18F2585 mit CAN Bus, aber ich habe keine Programmierbefehle für die CAN Bus Steuerung gefunden.
Der PIC 18F2550 (USB) unterstützt aber den I2C BUS. Über die maximale Leitungslänge habe ich aber nichts gefunden. Für den Hausbereich könnte es aber ausreichen. Ich sehe jetzt schon wie morgens die Kaffemaschine angeworfen wird, das Radio den richtigen Sender bekommt und das Auto im Winter (natürlich erst bei Minusgraden) vorgeheizt wird :lol:

Gibt es denn bei MBasic für den CAN Bus Steuerungsbefehle?


Hallo mueckerich,

Viel Spaß beim "steuern", im Notfall hat der PIC noch nen paar Ein/Ausgänge mehr :)

Gruß Michael
Working on - MP3D Engine -
Benutzeravatar
Helmut
Beiträge: 162
Registriert: 20.09.2004 22:53

Beitrag von Helmut »

Ein Beispiel aus der MBasic-Hilfe, so ein ähnliches gibt es auch für
SPI.
Einfach mal die Lib's ansehen. Gibt es auch für Pascal- und C -Freunde :-)
http://www.mikroe.com/en/compilers/

Sehr gute Info's über USB-PIC's gibt es auch bei Holger Klabunde, den Entwickler eines des besten Programmiergerätes für Mikrocontroller und Speicher in allen möglichen Ausführungen.
Leider hat er sein "Prommerprojekt" eingestellt.
Speziel den USB-Bootlader sollte man mal eroieren.
Hier der Link:

http://www.holger-klabunde.de/usb/18f2550.htm
Gehört aber eigentlich in die Elektronic-Rubrik.

Code: Alles auswählen

'*
'* Project name:
'    CAN
'  Copyright:
'    (c) mikroElektronika, 2005 - 2006
'* Revision History:
'     20050312:
'       - initial release.
' * Description:
'    This project is a simple demonstration of CAN on P18F448
'    with minor adjustments, it should work with any other PIC MCU
'    that has CAN module.
'
'    This code demonstrates how to use CAN library functions and procedures.

' * Test configuration:
'     MCU:             PIC18F448
'     Dev.Board:       EasyPIC3
'     Oscillator:      HS, 8.000 MHz
'     Ext. Modules:    None
'     SW:              mikroBasic v4.0 or higher
' * NOTES:
'     None
program CAN


dim aa       as byte
dim aa1      as byte
dim lenn     as byte
dim aa2      as byte
dim data     as byte[8]
dim id       as longint
dim zr       as byte
dim oldstate as byte

main:
  TRISB.0 = 1   ' designate pin RB0 as input
  PORTC = 0
  TRISC = 0
  PORTD = 0
  TRISD = 0
  aa = 0
  aa1 = 0
  aa2 = 0
  
  aa1 =  CAN_TX_PRIORITY_0 and             ' form value to be used
          CAN_TX_XTD_FRAME and             '     with CANSendMessage
          CAN_TX_NO_RTR_FRAME


  aa =   CAN_CONFIG_SAMPLE_THRICE and     ' form value to be used
          CAN_CONFIG_PHSEG2_PRG_ON and    '     with CANInitialize
          CAN_CONFIG_STD_MSG and
          CAN_CONFIG_DBL_BUFFER_ON and
          CAN_CONFIG_VALID_XTD_MSG and
          CAN_CONFIG_LINE_FILTER_OFF

  CANInitialize( 1,1,3,3,1,aa)                  ' initialize CAN module
  CANSetOperationMode(CAN_MODE_CONFIG,TRUE)     ' set CONFIGURATION mode
  ID=-1
  CANSetMask(CAN_MASK_B1,ID,CAN_CONFIG_XTD_MSG)   ' set all mask1 bits to ones
  CANSetMask(CAN_MASK_B2,ID,CAN_CONFIG_XTD_MSG)   ' set all mask2 bits to ones
  CANSetFilter(CAN_FILTER_B1_F1,12111,CAN_CONFIG_XTD_MSG)   ' set id of filter B1_F1 to 12111
  CANSetOperationMode(CAN_MODE_NORMAL,TRUE)       ' set NORMAL mode
  portd= $FF
  while true
    oldstate = 0
    zr = CANRead(id , Data , lenn, aa2)   ' receive data, if any
    if (id = 12111) and zr then
      portd = $AA
      portc = data[0]                     ' output data at portC
      data[0]=data[0]+1
      id=3
      delay_ms(1000)
      CANWrite(id,data,1,aa1)            ' send incremented data back
      if lenn = 2 then                   ' if message contains two data bytes
        portd = data[1]                  '     output second byte at portd
      end if
    end if
  wend
end.
Benutzeravatar
Helmut
Beiträge: 162
Registriert: 20.09.2004 22:53

Purebasic Haussteuerung :-)

Beitrag von Helmut »

@mueckerich, bzw. @alle

Wenn man den Bootlader der PIC-USB-Controller so einsetzt, dass man die Aplikationen über den PC schickt, kann man auch eine Art Knotenprogrammierung ähnlich dem KNX/ EIB-System, dem LIN, LON oder Powernetsytem machen.
Beispiel:
Ein PIC-Controller liegt am USBbus einer Haussteuerung, er läuft als 2-fach-Taster einer Lichtsteuerung. Nun soll er aber zusätzlich 2-Taster für die Rolladensteuerung haben.
Aplikation für den PIC-Prozessor schreiben, bei Wiederkehr der Versorgungsspannung, Resetknopf drücken und per USB-Bootlader programmieren und fertig.
Ist wie bei KNX/EIB mit dem Progtaster.
MfG
Helmut
Benutzeravatar
mpz
Beiträge: 497
Registriert: 14.06.2005 15:53
Computerausstattung: Win 10 Pro, 16 GB Ram, Intel I5 CPU und TI1070 Grafikkarte, PB 5.73 / 6.00 beta4
Wohnort: Berlin, Tempelhof

Beitrag von mpz »

Hmm,

ich muss zugeben, dass das MicroBasic mehr Funktionen bietet als das Picbasic. Ich habe mir daher die aktuelle Version runtergeladen und werde das Basic einmal testen. Die Einschränkung liegt wohl bei 2K Hexcode bei der Demoversion. Mein PIC Basic Programm liegt bei 0,7 K.

Jetzt müsste man nur noch ein PIC finden der USB und CAM hat. Alternativ zwei PICs koppeln...

Ich bin derzeit gerade am überlegen ob man nicht einen Infrarot Sender und Empfänger mit dem 18F2550 verbindet, um z.B. einen Roboter, Alarmanlage o.ä. zu steuern. Eine einfache IR Fernbedienung reicht dann auch aus um z.B. ein Programm zu steuern, ein Rückmeldung ist damit aber auch möglich...

Gruß Michael
Working on - MP3D Engine -
Benutzeravatar
Helmut
Beiträge: 162
Registriert: 20.09.2004 22:53

Beitrag von Helmut »

Der PIC hat ja nicht nur einen CAN-Port.
Seriel, RS485 I2C und SPI sind ja auch noch da.
Mbasic liefert mit dem Compiler:

CAN Library
CANSPI Library
Compact Flash Library
EEPROM Library
Ethernet Library
SPI Ethernet Library
Flash Memory Library
Graphic LCD Library
T6963C Graphic LCD Library
I²C Library
Keypad Library
LCD Library
LCD8 Library
Manchester Code Library
Multi Media Card Library
OneWire Library
PS/2 Library
PWM Library
RS-485 Library
Software I²C Library
Software SPI Library
Software UART Library
Sound Library
SPI Library
USART Library
USB HID Library
Util Library
SPI Graphic LCD Library
Port Expander Library
Benutzeravatar
Helmut
Beiträge: 162
Registriert: 20.09.2004 22:53

Beitrag von Helmut »

So, ich habe mir nun den PIC besorgt und mal die Soft in den PIC gebrannt, muß das Teil nicht im Gerätemanager (auch als HID-USB-Gerät) mit Treiber Info versorgt werden, wie auf der äußerst lehrreichen Seite
http://www.sprut.de/electronic/pic/8bit ... sb2550.htm
beschrieben ist ??
Bei mir meldet sich das Teil mit "Unbekanntes Gerät"
MfG
Helmut
Benutzeravatar
mpz
Beiträge: 497
Registriert: 14.06.2005 15:53
Computerausstattung: Win 10 Pro, 16 GB Ram, Intel I5 CPU und TI1070 Grafikkarte, PB 5.73 / 6.00 beta4
Wohnort: Berlin, Tempelhof

Beitrag von mpz »

Wenn das Gerät richtig als (MPZ) HID erkannt wird, werden Windows Treiber installiert. Die Schaltung bei Sprut wird anders programmiert, bzw hat einen anderen HID Header und benötigt dann einen separaten Treiber.

Ich vermute das Du einen Schaltungsfehler gemacht hast, z.B. ist der Kondensator an C2 ist sehr wichtig und muss wie angegeben geschaltet werden (Der Wert für C2 sollte 100 nF betragen). Weiter kann es die Anschaltung an den USB Port sein, D+ mit D- verwechselt. Falls es immer noch nicht klappt sende ich die gerne den HEX Code auch per EMail zu.

Gruß Michael
Working on - MP3D Engine -
Antworten