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 :twisted:

...und einen "Timer" suche ich immer noch :praise:

@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 :D

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! :mrgreen: im Download sind die Beta's ja...

Wie habt ihr das die ganze Zeit gemacht, wenn ihr mal was pollen müsst??? :shock:

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) :mrgreen:

Re: Notation dll Deklaration

Verfasst: 10.11.2009 21:00
von six1
So, jetzt kracht es :mrgreen: ...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
:bounce:

Thx!

Das "@" war es... ich muss mich an die Struktur erst gewöhnen :mrgreen:

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)