Aktuelle Zeit: 23.02.2020 00:35

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: USB mit Procedure auslesen Pic-controller 2550
BeitragVerfasst: 28.05.2008 12:11 
Offline

Registriert: 06.01.2006 20:00
Wohnort: Weiden i. d. Opf.
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:
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 28.05.2008 12:26 
Offline
Benutzeravatar

Registriert: 20.09.2004 22:53
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 28.05.2008 13:04 
Offline

Registriert: 06.01.2006 20:00
Wohnort: Weiden i. d. Opf.
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..


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 29.05.2008 00:08 
Offline
Benutzeravatar

Registriert: 02.10.2007 07:19
Versuch mal den Procedure-Aufruf von "USB-Schreiben" mit:
Code:
USB-Schreiben(USB_Out)

und in der Proz dann:
Code:
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:
_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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 29.05.2008 21:05 
Offline

Registriert: 06.01.2006 20:00
Wohnort: Weiden i. d. Opf.
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:
;{ 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 29.05.2008 23:47 
Offline
Benutzeravatar

Registriert: 02.10.2007 07:19
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:
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 30.05.2008 23:13 
Offline

Registriert: 06.01.2006 20:00
Wohnort: Weiden i. d. Opf.
hallo,
erstmals vielen dank für den Tip mit den code :allright:
Code:
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:
;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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 31.05.2008 00:10 
Offline
Benutzeravatar

Registriert: 02.10.2007 07:19
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:
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:
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 31.05.2008 16:38 
Offline
Benutzeravatar

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

Gruß
Helle


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 02.06.2008 18:43 
Offline

Registriert: 06.01.2006 20:00
Wohnort: Weiden i. d. Opf.
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:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ]  Gehe zu Seite 1, 2  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye