USB mit Procedure auslesen Pic-controller 2550

Hardware- und Elektronikbasteleien, Ansteuerung von Schnittstellen und Peripherie.
Fragen zu "Consumer"-Problemen kommen in Offtopic.
Fairman68
Beiträge: 12
Registriert: 06.01.2006 20:00
Wohnort: Weiden i. d. Opf.

USB mit Procedure auslesen Pic-controller 2550

Beitrag von Fairman68 »

Hallo Leute, ich versuche über Usb einen PIC zu beschreiben und auszulesen, ich sende immer 64Byte hin und her .. das klappt ganz wunderbar bis auf eine Sache.. :D

Das beschreiben und auslesen des PICs geht nur in der Hauptschleife, es soll aber in eine Procedure verpackt werden.. Eine Procedure zum lesen und eine zum schreiben
Und genau dort geht es nicht mehr. :cry:
Ich bekomme dann immer die Fehlermeldungen in beiden Proceduren => invalid memory access (read error at address 64)
Ich habe hier mal den Code.. ich selber vermute das ein Parameter nicht übergeben wird.. aber welcher.. ich finde den Fehler einfach nicht und nun brauche ich Hilfe von Profis..

Code: Alles auswählen

hDLLINST.l = LoadLibrary_(@"usb.dll") 
Prototype.l _MPUSBGetDLLVersion() 
Prototype.l _MPUSBGetDeviceCount(pVID_PID.s)
Prototype.l _MPUSBOpen(instance,pVID_PID.s,pEP.s,dwDir,dwReserved)
Prototype.l _MPUSBWrite(handle,pData,dwLen,pLength,dwMilliseconds)
Prototype.l _MPUSBRead(handle,pData,dwLen,pLength,dwMilliseconds)
Prototype.l _MPUSBClose(handle)

Global _MPUSBGetDLLVersion._MPUSBGetDLLVersion  = GetProcAddress_(hDLLINST.l , "_MPUSBGetDLLVersion") 
Global _MPUSBGetDeviceCount._MPUSBGetDeviceCount = GetProcAddress_(hDLLINST.l , "_MPUSBGetDeviceCount") 
Global _MPUSBOpen._MPUSBOpen   = GetProcAddress_(hDLLINST.l , "_MPUSBOpen") 
Global _MPUSBWrite._MPUSBWrite = GetProcAddress_(hDLLINST.l , "_MPUSBWrite") 
Global _MPUSBRead._MPUSBRead   = GetProcAddress_(hDLLINST.l , "_MPUSBRead") 
Global _MPUSBClose._MPUSBClose = GetProcAddress_(hDLLINST.l , "_MPUSBClose") 

Global Dim USB_In. c (64) 
Global Dim USB_Out.c (64)

#VID = "vid"

If Usbgeraete = _MPUSBGetDeviceCount(#VID)
MessageRequester("Info", "Kein Device gefunden", 0)
;End
EndIf
;----------------------------------------------------------------------------------
Procedure USB_Schreiben()
  S = _MPUSBOpen (0, #VID, "\MCHP_EP1" , 0 , 0)
      _MPUSBWrite(S, @USB_Out(0), 64, 0, 50)
      _MPUSBClose(S)
EndProcedure

Procedure USB_Lesen()
  L = _MPUSBOpen (0, #VID, "\MCHP_EP1" , 1 , 0)
      _MPUSBRead (L , @USB_In(0) , 64 ,64 + @USB_In(0) , 100)
      _MPUSBClose(L)
EndProcedure
;---------------------------------------------------------------------------------

  If OpenWindow(0, 246, 185, 850, 311, "USB-Test",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
      CreateGadgetList(WindowID(0))
      StringGadget(1, 20, 10,  810, 90, "")
      StringGadget(2, 20, 160, 810, 90, "")
      ButtonGadget(3, 380, 120, 130, 20, "ok")
  EndIf



Repeat
EventID = WaitWindowEvent()
If EventID = #PB_Event_Gadget
Select EventGadget()

Case 3
For Q = 0 To 64
USB_Out(Q) = Val(StringField(GetGadgetText(1), Q + 1, ",") ) 
Next Q 
;USB_Schreiben()
USB_Lesen()
;---------------------------------------------------------------------------------
;{ USB_Schreiben
  S = _MPUSBOpen (0, #VID, "\MCHP_EP1" , 0 , 0);                   diese beiden sollen als
      _MPUSBWrite(S, @USB_Out(0), 64, 0, 100)  ;                   Proceduren ausgelagert 
      _MPUSBClose(S)                           ;                   werden.. siehe oben..
 ;}

;{ USB_Lesen
  Dim USB_In.c(64)
  L = _MPUSBOpen (0, #VID, "\MCHP_EP1" , 1 , 0)
      _MPUSBRead (L, @USB_In (0) , 64 , 64 + @USB_In(0), 100)
      _MPUSBClose(L)
;}
;---------------------------------------------------------------------------------
Text.s = ""
For I = 0 To 63
Text + Str(USB_In(I))+", "
Next i 
SetGadgetText(2, Text)
            
EndSelect
EndIf
Until EventID = #PB_Event_CloseWindow
End 
Ich bedanke mich schon mal von allen, die sich meinen problem annehmen..

gruß Günni
Benutzeravatar
Helmut
Beiträge: 162
Registriert: 20.09.2004 22:53

Beitrag von Helmut »

Das kann nicht sein, das die "0" mit zählt bei der Byteanzahl "64".
Wäre zu einfach..... oder?
Mit 63, haste schon getestet?
Gruß Helmut
Fairman68
Beiträge: 12
Registriert: 06.01.2006 20:00
Wohnort: Weiden i. d. Opf.

Beitrag von Fairman68 »

Hi, es funzt einwandfrei, solange ich nicht die Proceduren aufrufe sondern alles in der Hauptschleife lasse... das ist ja das komische.. /:->

aussedem wäre das nicht relevant, da er sowieso nur 64 Byte schreibt/liest..
Benutzeravatar
BlueHoschi
Beiträge: 97
Registriert: 02.10.2007 07:19

Beitrag von BlueHoschi »

Versuch mal den Procedure-Aufruf von "USB-Schreiben" mit:

Code: Alles auswählen

USB-Schreiben(USB_Out)
und in der Proz dann:

Code: Alles auswählen

Procedure USB-Schreiben(USB_Out)
.
.
.
EndProcedure
Nur zum Test, Du hast zwar alles Global gemacht, aber bei mir klappt das auch nicht immer.
Da ja eigentlich alles gleich geschrieben ist, hast Du vielleicht Probleme damit das die Variablen
nicht in die Proz übernommen werden.
Warum auch immer. Ist nur ´ne Theodora... oder wie das heißt

//Edit:
Hab´gerade gesehen das es da doch einen Unterschied gibt:

Code: Alles auswählen

_MPUSBWrite(S, @USB_Out(0), 64, 0, 100)
100 im Hauptcode und 50 in der Proz, ist das so richtig?
Wer Dir Steine in den Weg legt, pflastert den vielleicht.

PB 5.21, Win 7 64 bit
Fairman68
Beiträge: 12
Registriert: 06.01.2006 20:00
Wohnort: Weiden i. d. Opf.

Beitrag von Fairman68 »

hallo,
ich habe nun mal die Ratschläge von BlueHoschi befolgt, und alles ein bisschen umgestellt und gekürzt, aber leider ohne Erfolg.

Wenn die Procedure nicht aufgerufen wird läuft wie gesagt alles wunderbar, nur in der Procedure gibs dann wieder die Fehlermeldung.

Den Code habe ich nun so umgestellt das mein problem jeder der Lust hat auch mal Testen kann (es muss kein USB-Gerät angschlossen sein), dann werdet ihr mein problem sehen.

Code: Alles auswählen

;{ USB_Einrichten
Prototype.l _MPUSBGetDLLVersion () 
Prototype.l _MPUSBGetDeviceCount(pVID_PID.s)
Prototype.l _MPUSBOpen          (instance,pVID_PID.s,pEP.s,dwDir,dwReserved)
Prototype.l _MPUSBWrite         (handle,pData,dwLen,pLength,dwMilliseconds)
Prototype.l _MPUSBRead          (handle,pData,dwLen,pLength,dwMilliseconds)
Prototype.l _MPUSBClose         (handle)

Global  USB_DLL.l = LoadLibrary_(@"usb.dll") 
Global  USB_GetDLLVersion. _MPUSBGetDLLVersion   = GetProcAddress_(USB_DLL, "_MPUSBGetDLLVersion" ) 
Global  USB_GetDeviceCount._MPUSBGetDeviceCount  = GetProcAddress_(USB_DLL, "_MPUSBGetDeviceCount") 
Global  USB_Open.          _MPUSBOpen            = GetProcAddress_(USB_DLL, "_MPUSBOpen"          ) 
Global  USB_Write.         _MPUSBWrite           = GetProcAddress_(USB_DLL, "_MPUSBWrite"         ) 
Global  USB_Read.          _MPUSBRead            = GetProcAddress_(USB_DLL, "_MPUSBRead"          ) 
Global  USB_Close.         _MPUSBClose           = GetProcAddress_(USB_DLL, "_MPUSBClose"         ) 

Global Dim USB_Out.c (64)

#VID = "ff0b"
 ;}

;----------------------------------------------------------------------------------
Procedure USB_Schreiben()
  S = USB_Open (0, #VID, "\MCHP_EP1" , 0 , 0)
      USB_Write(S, @USB_Out(0), 64, 0, 100)
      USB_Close(S)
EndProcedure
;----------------------------------------------------------------------------------


;Start Hauptprogramm 

; Die Daten die gesendet werden sollen
USB_Out(1) = 0
USB_Out(2) = 33
;usw.... bis byte 64

;{ USB_Schreiben über Procedure
USB_Schreiben()
 ;}

;{ USB_Schreiben im Hauptprogramm 
  S = USB_Open (0, #VID, "\MCHP_EP1" , 0 , 0)
      USB_Write(S, @USB_Out(0), 64, 0, 100)
      USB_Close(S)          
 ;}

End
Benutzeravatar
BlueHoschi
Beiträge: 97
Registriert: 02.10.2007 07:19

Beitrag von BlueHoschi »

Den gleichen Effekt habe ich auch wenn ich den Proz-Aufruf auskommentiere, im Hauptproggi
//Edit:
Ist ja auch logisch, habe die DLL ja net. Kannst Du mal einen Link geben?

//Doppeledit:
Meistens ist "Invalid Memory Access" ein Zeichen dafür das man etwas falsch an die DLL
übergeben hat, einen Parameter oder ein Flag.
Vielleicht mal vereinfachen ohne Prototypes und direkt ansprechen.
Sowas einfaches wie:

Code: Alles auswählen

If OpenLibrary...
Und dann in der Proz den Funktionsaufruf genauso einfach halten, wenn es dann klappt,
stimmt irgendwas mit der Werteübergabe an die Proz nicht.
Jedenfalls hast Du dann schonmal einen Ansatz und vielleicht auch schon eine Idee.
Wer Dir Steine in den Weg legt, pflastert den vielleicht.

PB 5.21, Win 7 64 bit
Fairman68
Beiträge: 12
Registriert: 06.01.2006 20:00
Wohnort: Weiden i. d. Opf.

Beitrag von Fairman68 »

hallo,
erstmals vielen dank für den Tip mit den code :allright:

Code: Alles auswählen

OpenLibrary(0, "usb.dll")
Ist ja toll wie einfach und übersichtlich das geworden ist.. nochmals danke.

habe heute wiedermal Stunden vor der Kiste verbracht... :freak: das Resultat könnt ihr unten sehen.. doch das Problem besteht immer noch in gleicher Weise :cry:
hier könnt ihr die DLL runterladen und mal versuchen..
- http://www.da-schau-mal.de/usb.dll -

Code: Alles auswählen

;Versuch 3
;{ USB_Einrichten
If OpenLibrary(0, "usb.dll")
Global Dim USB_Out.c (64)
#VID  = "vid_04d8&pid_ff0b"
EndIf
 ;}

;------------------------------------------------------------------------------------
Procedure USB_Schreiben()
  S = CallFunctionFast(GetFunction(0, "_MPUSBOpen") , 0,#VID, "\MCHP_EP1" , 0, 0 )
      CallFunctionFast(GetFunction(0, "_MPUSBWrite"), S, @USB_Out, 64, 0, 100)
      CallFunctionFast(GetFunction(0, "_MPUSBClose"), S)
EndProcedure     
;------------------------------------------------------------------------------------

;Start Hauptprogramm 

; Die Daten die gesendet werden sollen
USB_Out(1) = 0
USB_Out(2) = 46
;usw.... bis byte 64

;{ USB_Schreiben über Procedure
;USB_Schreiben(): End         ;<   diese Zeile mit ; ein und ausschalten
 ;}

;{ USB_Schreiben im Hauptprogramm 
  S = CallFunctionFast(GetFunction(0, "_MPUSBOpen") , 0, #VID, "\MCHP_EP1", 0 ,0)
      CallFunctionFast(GetFunction(0, "_MPUSBWrite"), S, @USB_Out(0), 64, 0, 100)
      CallFunctionFast(GetFunction(0, "_MPUSBClose"), S)
 ;}
End
Es ist zum verzweifeln... >_< bin über jeden Vorschlag dankbar.
Benutzeravatar
BlueHoschi
Beiträge: 97
Registriert: 02.10.2007 07:19

Beitrag von BlueHoschi »

Sorry ich glaube ich kann es nicht testen weil ich nicht die notwendige Hardware angeschlossen habe.
Der Handle (S) ist immer -1, vermutlich weil nichts gefunden wird.

Code: Alles auswählen

Procedure USB_Schreiben(USB.w,S.w) 
   CallFunction(S,"_MPUSBWrite",USB,0,100)
   
EndProcedure 

For x = 1 To 64
USB_Out(x) = x 
Next 
 
S.w = USB_Open (0, #VID, "\MCHP_EP1" , 0 , 0) 
For x = 1 To 64
;Debug x
USB_Schreiben(USB_Out(x),S)
;Debug x
Next
USB_Close(S)
Probiers mal damit

**bin ja mal gespannt**

//Edit
Habe mal folgendes im Hauptprogramm ausprobiert:

Code: Alles auswählen

For x = 1 To 64 
      CallFunction (0, "_MPUSBOpen",0,#VID, "\MCHP_EP1" , 0,0)
      CallFunction(0,"_MPUSBWrite",USB,0,100)
      CallFunction(0,"_MPUSBClose")      Debug USB_Out(x)
 Next
Wenn ich irgendwo in einer der Zeilen die Argumente einfach wegnehme passiert nix. Also keine Fehlermeldung.
Möglicherweise stimmen die Argumente der Funktionsaufrufe nicht in der Reihenfolge oder der Wertigkeit, und in einer Proz
fällt das dann sozusagen erst auf.
Vielleicht mußt Du einfach nochmal genau nachschauen wie die Argumente zu bedienen sind.

//Doppeledit:
Hab´ es gerade mit einem lauffähigen Programm von mir getestet, und da war´s dann auch so.
Im Hauptprogramm keine Meldung und in einer Proz dann wohl!!
Wer Dir Steine in den Weg legt, pflastert den vielleicht.

PB 5.21, Win 7 64 bit
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag von Helle »

Setze S mal als globale Variable. Testen kann´s wohl keiner, der nicht die entsprechende Hardware (Vendor-und Product-ID) angeschlossen hat.

Gruß
Helle
Fairman68
Beiträge: 12
Registriert: 06.01.2006 20:00
Wohnort: Weiden i. d. Opf.

Beitrag von Fairman68 »

Hallo,
ich habe nun so ziemlich alles durch,es futzt einfach nicht. Auch in anderen Forums (auch Englische) kann mir keiner helfen.

Ich habe noch herausgefunden das alles was in der Procedure steht auch sauber ausgeführt wird.. der Fehler tritt tatsächlich erst beim Endprocedure auf. ????

Nun habe ich die letzten Tage die Kirche um den Altar gebaut, ich nehme nun sozusagen das Hauptprogramm als Procedure, und lagere alle anderen Sachen auf Proceduren aus, das ist zwar nicht die sauberste Art ein Programm zu schreiben aber.... es geht.. :wink:

Ich bedanke mich nochmal bei allen für die Mithilfe.. :allright:
Antworten