Seite 2 von 6
Re: Notation dll Deklaration
Verfasst: 10.11.2009 19:14
von H.Brill
Probiers zuerst mal so :
Code: Alles auswählen
#Library = 0
Prototype pDoGetInfraCode(Array.l, Diagrammlength.l)
OpenLibrary(#Library, "Deinedll")
Global DoGetInfraCode.pDoGetInfraCode = GetFunction(#Library, "DoGetInfraCode")
Global ret.l
Dim bArray.b(4) ;wenn es z.B. 4 Werte sein sollen
; Array mit Werten füllen
ret = DoGetInfraCode(@bArray(), 4)
...
CloseLibrary(#Library)
Mit den Prototypes hast du den Vorteil der Parameter-
überprüfung.
Re: Notation dll Deklaration
Verfasst: 10.11.2009 19:16
von Kaeru Gaman
wenn du einen pointer als integer angeben willst, dann muss das ein .i sein.
Re: Notation dll Deklaration
Verfasst: 10.11.2009 19:42
von six1
Die dll läuft. Ich habe es über Prototypen deklariert.
Code: Alles auswählen
Prototype DoGetInfraCode (*TimeCodeDiagram.b, DiagramLength.l); As integer;
If AVR309_DLL
Global DoGetInfraCode.DoGetInfraCode = GetFunction(AVR309_DLL, "DoGetInfraCode") ; (byval *TimeCodeDiagram.b, DiagramLength.l) as integer;
endif
Die Ansteuerung des Mega8 läuft bereits in Teilen... ich kämpfe mit den sogennanten "Gadgets" die sonstwo "Components" heißen
...und einen "Timer" suche ich immer noch
@H.Brill: ja, so habe ich es umgesetzt. Funktioniert einwandfrei
@Kaeru Gaman: jo, .b, .i, .l ... hab ich auf der Pfanne

so ein paar Sachen kann ich mir denken (manchmal klappt's)

Re: Notation dll Deklaration
Verfasst: 10.11.2009 20:02
von H.Brill
Ab PB-Version 4.40 gibt es ja auch einen
WindowTimer. Ist nur noch nicht in der
Hilfe dokumentiert, nur in den Beispielcodes.
Hier ein Beispielcode :
Code: Alles auswählen
#Window = 0
#Editor = 0
Global text.s, i.l
text = "Ich schreibe 10 mal jede Sekunde diesen Text !"
Enumeration
#Timer1
EndEnumeration
var = 1000 ; ms
If OpenWindow(#Window, 0, 0, 400, 200, "Timer example", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
EditorGadget(#Editor, 10, 10, 240, 150,#PB_Editor_ReadOnly)
AddWindowTimer(#Window, #Timer1, var)
i = 1
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Timer
Select EventTimer()
Case #Timer1
AddGadgetItem(#Editor, i, text)
If i > 10
RemoveWindowTimer(#Window, #Timer1)
Break
EndIf
i = i + 1
EndSelect
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
Re: Notation dll Deklaration
Verfasst: 10.11.2009 20:04
von Kaeru Gaman
einen nativen Timer gibts erst ab 4.4, die ist noch in der Beta.
für 4.3 kannst du das mit nem Callback lösen
http://www.purebasic.fr/german/viewtopi ... 561#109561
und btw... ich hatte mich ein Stück weit vertan... es muss
*TimeCodeDiagram.
Byte
heißen.
Der Unterschied besteht zwischen
Type und
Structure.
über einen Stukturierten Pointer kann man dann die Elemente direkt ansprechen.
... aber ob das überhaupt so in die Deklaration der Funktion reingehört, weiß ich nicht.
Re: Notation dll Deklaration
Verfasst: 10.11.2009 20:08
von six1
Ehyy man, ich habe nur die 4.31
kann ich die 4.4 irgendwo downloaden... schon?
Der Windows TimerEvent ist EXAKT!!! das was ich brauche!
EDIT: jaja, wer lesen kann ist klar im Vorteil und die lustigen Kringel sind die Buchstaben!
im Download sind die Beta's ja...
Wie habt ihr das die ganze Zeit gemacht, wenn ihr mal was pollen müsst???
DANKE!!! sieht schon ganz gut aus. Ich teste gerade den seriellen Datenverkehr. Die Serielle kann man übrigens über die Funktionen auf 1Bd genau einstellen! (es geht also auch 2431 Bd)

Re: Notation dll Deklaration
Verfasst: 10.11.2009 21:00
von six1
So, jetzt kracht es

...immer wieder schön!
Code: Alles auswählen
#NO_ERROR = 0
Global PORTA.b, PORTB.b, PORTC.b, UsedPorts.b
...
Prototype pDoGetInDataPorts ( DataInByteB.b, DataInByteC.b, DataInByteD.b, UsedPorts.b); As integer;
Global DoGetInDataPorts.pDoGetInDataPorts = GetFunction(AVR309_DLL, "DoGetInDataPorts") ; ( DataInByteB.b, DataInByteC.b, DataInByteD.b, UsedPorts.b) as integer;
...
Case #Poll_Timer
--> kracht If DoGetInDataPorts(PORTA, PORTB, PORTC, UsedPorts) = NO_ERROR
SetGadgetText(#State_Text_1, "Device connected!");
Else
SetGadgetText(#State_Text_1, "Device not connected!");
EndIf
...
irgendwie kann der dll Aufruf die Variablen PORTA, PORTB, PORTC, UsedPorts nicht beschreiben, scheint mir...
Code: Alles auswählen
Fehlermeldung: [ERROR]Invalid memory access. (write error at address 1)
Gleicher Aufruf über Delphi geht. Die dll verursacht also den Fehler nicht.
Re: Notation dll Deklaration
Verfasst: 10.11.2009 21:09
von ts-soft
Erwartet die DLL die Byte ByRef oder ByVal? Kannste also mit @PORTA oder Du definierst den Parameter als .i (Integer), eins von beiden sollte gehen.
Gruß
Thomas
Re: Notation dll Deklaration
Verfasst: 10.11.2009 21:12
von six1
Thx!
Das "@" war es... ich muss mich an die Struktur erst gewöhnen
Timer Event läuft gut, wenn man den Atmel an den USB Port steckt, wir er sofort als "Device connected" erkannt!
Re: Notation dll Deklaration
Verfasst: 11.11.2009 08:42
von H.Brill
Läuft ja wohl über eine virtuelle
ser. Schnittstelle. Sendet der
Atmel kontinuierlich Daten ?
Dann muß man den serial Port
zumindest pollen, damit keine Daten
verloren gehen. Schau mal bei :
AvailableSerialPortInput(#SerialPort)