Problem mit K8055

Hardware- und Elektronikbasteleien, Ansteuerung von Schnittstellen und Peripherie.
Fragen zu "Consumer"-Problemen kommen in Offtopic.
Benutzeravatar
onny
Beiträge: 400
Registriert: 27.04.2005 17:50
Kontaktdaten:

Problem mit K8055

Beitrag von onny »

Code: Alles auswählen

    OpenConsole()
    ConsoleTitle ("Control your K8055! Programmed by oNNy")                                                                                        
retype:
    ClearConsole() : ConsoleLocate (5,2) 
    Print ("Welcome to -Control your K8055!-. Input your command here!")
    ConsoleLocate (5,3) 
    Print ("Type help For more informations!   ")
    ConsoleLocate (8,6) 
    Print ("Enter your command here:   ")
    command$=Input()

    If command$ = "connect K8055" Or command$ = "connect k8055"
    ClearConsole() :     ConsoleLocate (5,3) 
    Print ("Loading libary") : OpenLibrary(0, "K8055D.dll")
    For a = 0 To 10 : Delay(20) : Print (".") : Next
    ConsoleLocate (5,4) : Print ("Connecting")
    CallCFunction(0, "OpenDevice",0)
    For a = 0 To 10 :  Delay(20) : Print (".") : Next
    Delay(1000) : ConsoleLocate (5,5) 
    Print ("Connected! Got 32 commands!")
    Else
    If command$ = "exit" Or command$ = "Exit" Or command$ = "EXIT" : End : EndIf
    Goto retype : EndIf
    
    retype2:
    ConsoleLocate (8,10) 
    Print ("Enter your command here:   ")
    command2$=Input()
    
    If Mid(command2$,0,13) = "blink channel"
    If Mid(command2$,17,1) = "1"
    ;For a = 0 To 50
    CallCFunction(0, "SetDigitalChannel",Mid(command2$,14,1))
    ;Delay(Val(Mid(command$,20,Len(command2$)-19)))
    ;CallCFunction(0, "ClearDigitalChannel",Mid(command2$,14,1))
    ;Next
    Else
    EndIf : EndIf
    
    If command2$ = "test digital"
    For a = 0 To 8
    CallCFunction(0, "SetDigitalChannel",a)
    Delay(100)
    CallCFunction(0, "ClearDigitalChannel",a)
    Next
    Goto retype2
    EndIf
    
    If Mid(command2$,0,7) = "channel"
    If Mid(command2$,11,1) = "1"
    CallCFunction(0, "SetDigitalChannel",Val(Mid(command2$,8,1)))
    EndIf
    If Mid(command2$,11,1) = "0"
    CallCFunction(0, "ClearDigitalChannel",Val(Mid(command2$,8,1)))
    EndIf
    Goto retype2
    EndIf
    ;If command$ = "channel2 -1"
    ;CallCFunction(0, "SetDigitalChannel",2)
    ;Goto retype2
    ;EndIf

    Delay (6000)
    CloseConsole()
 
hi, wenn ich mit meinem consolen-programm mehr als zweimal den blink test durchführe und mehrere befehle schicke stürzt mein programm ab...

fehlt da irgendein initalisierungs befehl?
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Ich hab mir zu diesen Bausatzt Vellemann K8055 bei Conrad.de mal die Bauanleitung heruntergeladen und sehe dort auf der ersten Seite unter
Spezifikationen folgenden Satz:
*Allgemeine Konvertierungszeit: 20ms pro Befehl
Das würde für mich bedeuten, das ich nach jeden Befehl min. 20ms warten muss bevor ich den nächsten sende.

Du hast da folgendes Geschrieben:

Code: Alles auswählen

...
For a = 0 To 8
    CallCFunction(0, "SetDigitalChannel",a)
    Delay(100)
    CallCFunction(0, "ClearDigitalChannel",a)
    Next 
...
Demnach wird unmittelbar nach dem ClearDigitalChannel die Funktion
SetDigitalChannel aufgerufen. Vieleicht muss da noch ein Delay vor dem
Next eingefügt werden.

Grüße ..Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
onny
Beiträge: 400
Registriert: 27.04.2005 17:50
Kontaktdaten:

Beitrag von onny »

ich hoffe das ist das problem! vielen dank für deine antwort und für deine mühen!
Benutzeravatar
onny
Beiträge: 400
Registriert: 27.04.2005 17:50
Kontaktdaten:

Beitrag von onny »

schade, ich frage zurzeit mit einer konsole die digitalen input channels ab, jede DREI sekunden und es scheint im zuviel zu sein. aufjedenfall meldet pb keine fehler, nur die u.i. verschwindet und es tut sich nichtsmehr :(

Code: Alles auswählen

Procedure checkanalog(Parameter)

  Repeat
  Delay(3000)
If CallCFunction(0, "ReadDigitalChannel",1) = 1
SetGadgetState(31,1) : Else : SetGadgetState(31,0) : EndIf
  Delay(3000)
If CallCFunction(0, "ReadDigitalChannel",2) = 1
SetGadgetState(32,1) : Else : SetGadgetState(32,0) : EndIf
  Delay(3000)
If CallCFunction(0, "ReadDigitalChannel",3) = 1
SetGadgetState(33,1) : Else : SetGadgetState(33,0) : EndIf
  Delay(3000)
If CallCFunction(0, "ReadDigitalChannel",4) = 1
SetGadgetState(34,1) : Else : SetGadgetState(34,0) : EndIf
  Delay(3000)
If CallCFunction(0, "ReadDigitalChannel",5) = 1
SetGadgetState(35,1) : Else : SetGadgetState(35,0) : EndIf
  ForEver

EndProcedure
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Wenn ich das richtig sehe, machst du die Delay(3000) zwischen jeden Endif und danach IF. Damit erzeugst du in der Repeatabfrage fast ein Stillstand deines Programms. Mach die doch vor dem :Endif in jeder I-Abfrage.
Vorallem brauchst du ja nicht so eine grosse Zeit warten. Da müsste
bei jeder Funktionsübermittlung mindestens ein Delay(20) hinen.

Ich denke mal, das es so aussehen müsste.

Code: Alles auswählen

Procedure checkanalog(Parameter)

  Repeat
 
If CallCFunction(0, "ReadDigitalChannel",1) = 1
 Delay(20)
SetGadgetState(31,1) : Else : SetGadgetState(31,0) : EndIf
 
If CallCFunction(0, "ReadDigitalChannel",2) = 1
Delay(20)
SetGadgetState(32,1) : Else : SetGadgetState(32,0) : EndIf
 
If CallCFunction(0, "ReadDigitalChannel",3) = 1
Delay(20)
SetGadgetState(33,1) : Else : SetGadgetState(33,0) : EndIf
 
If CallCFunction(0, "ReadDigitalChannel",4) = 1
Delay(20)
SetGadgetState(34,1) : Else : SetGadgetState(34,0) : EndIf
  
If CallCFunction(0, "ReadDigitalChannel",5) = 1
Delay(20)
SetGadgetState(35,1) : Else : SetGadgetState(35,0) : EndIf
  ForEver

EndProcedure
Leider kann ich das nicht testen.
[Edit]
Was noch fehlt, ist eine Abbruchbedingung, daß die Repeat/Forever-Schleife auch verlassen werden kann.
Sonst läuft die Procedure unendlich.
[/Edit]

Grüße, Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
onny
Beiträge: 400
Registriert: 27.04.2005 17:50
Kontaktdaten:

Beitrag von onny »

leider ist es nun, so wie du es jetzt gepostet hast, nach 3 sekunden wieder beendet. ich glaube ich kann echt nur eine bestimmte anzahl von befehlen schicken, egal ob delay() oder nicht. Auch wenn ich es compiliere läuft es nicht anderst. Ich hab bis jetzt jede DLL-Version ausprobiert, leider ohne Erfolg. Kann es sein das es unkompatibel mit PB ist? Nützt es was wenn ich CallFunctionFast verwende?

Übrigens ist mir aufgefallen das ich CallCFunction benutze.... wo ist der unterschied zwichen C und ohne C, Fast und normal CallFunction?

Oder ist mein System unkompatiebel?
Ich teste jetzt einfach mal und versuche das Problem zu lösen :cry:

//edit: mit callfunction normal scheint es zu funktionieren :D
:bounce:
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

OK, dann hattest du die falsche DLL, da im Ordner DLL Ver2.0 with examples
zwei DLL's vorhanden sind.
Einmal die für StandardCall und einmal die für StandardCCall
K8055D.DLL und die K8055D_C.DLL .

Hauptsache es läuft :allright:

Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
onny
Beiträge: 400
Registriert: 27.04.2005 17:50
Kontaktdaten:

Beitrag von onny »

So, bin jetzt schon recht weit gekommen! Mein Programm ist jetzt schon eine echte alternative zum Demo-Programm das bei der CD dabei liegt!
Wenn es fertig ist könnte man es ja evtll. in den Showcase stecken ;D

Bild

Der Code ist an manchen stellen noch nicht optimiert -.- !!

Code: Alles auswählen

OpenLibrary(0, "K8055D.dll") : CallCFunction(0, "OpenDevice",0)
Procedure checkdigital(Parameter)
Repeat : For f = 1 To 5
If CallFunction(0, "ReadDigitalChannel",f) = 1 : Delay(20)
SetGadgetState(30 + f,1) : Else : SetGadgetState(30 + f,0) : EndIf
Next
channel1 = CallFunction(0, "ReadAnalogChannel",1)
channel2 = CallFunction(0, "ReadAnalogChannel",2) : Delay(20)
SetGadgetState(61,channel1)
SetGadgetState(62,channel2)
SetGadgetText(63,StrU(channel1,long))
SetGadgetText(64,StrU(channel2,long))
ForEver : EndProcedure
OpenWindow(0,x,y,600,300,#PB_Window_ScreenCentered | #PB_Window_SystemMenu,"ONNYS ROBOTER STEUERUNG")
CreateGadgetList(WindowID())
Frame3DGadget(9,5,3,285,160,"Analog Output-Channels")
ButtonGadget(0,200,21,80,20,"Set all digital")
ButtonGadget(1,200,46,80,20,"Clear all digital")
ButtonGadget(2,200,71,80,20,"TEST")
ButtonGadget(3,200,96,80,20,"Würfel")
For c = 0 To 8
CheckBoxGadget(10+c,15,21+hight3,80,15,"Channel " + StrU(c,long))
TrackBarGadget(20+c,90,21+hight3,100,15,0,100)
hight3 + 15 : Next
Frame3DGadget(29,295,3,285,210,"Digital Input-Channels")
For b = 0 To 5
CheckBoxGadget(30+b,310,23 + hight,80,15,"Channel " + StrU(b,long)) : DisableGadget(30 +b,1)
ComboBoxGadget(40+b,400,21 + hight2,170,200)
AddGadgetItem(40+b,0,"No action...")
AddGadgetItem(40+b,1,"Run program (...)")
AddGadgetItem(40+b,2,"Simulate key (...)")
AddGadgetItem(40+b,3,"Shutdown Windows!")
AddGadgetItem(40+b,4,"Reboot Windows!")
AddGadgetItem(40+b,3,"Standby Windows!")
SetGadgetState(40+b,0)
hight + 26 : hight2 + 25 : Next
ButtonGadget(50,310,180,100,20,"Combo")
Frame3DGadget(60,5,165,285,120,"Analog Input-Channels")
ProgressBarGadget(61,15,190,200,20,0,300,#PB_ProgressBar_Smooth)
ProgressBarGadget(62,15,220,200,20,0,300,#PB_ProgressBar_Smooth)
TextGadget(63,225,193,60,15,"Loading")
TextGadget(64,225,223,60,15,"Loading")
CreateThread(@checkdigital(), 154)
Repeat : EventID = WaitWindowEvent()
If EventID = #PB_EventGadget
If GetGadgetState(41) = 1
program41$ = OpenFileRequester("Choose file...","*.*","*.*",0)
EndIf
For a = 0 To 8 : If GetGadgetState(10 + a) = 1
CallFunction(0, "SetDigitalChannel",a)
Else : CallFunction(0, "ClearDigitalChannel",a)
EndIf : Next
Select EventGadgetID()
Case 0 : CallFunction(0, "SetAllDigital")
Case 1 : CallFunction(0, "ClearAllDigital")
Case 2 
For d = 0 To 8 : CallFunction(0, "SetDigitalChannel",d)
Delay(20) : CallFunction(0, "ClearAllDigital") : Next
Case 3 : CallFunction(0, "ClearAllDigital")
For a = 0 To Random(6)
CallFunction(0, "SetDigitalChannel",Random(6)) : Next
EndSelect : EndIf : Until EventID = #PB_Event_CloseWindow
CallCFunction(0, "CloseDevice") : CloseLibrary(0) : End

Download compilierte Version + DLL: http://share.gulli.com/dl/files/1940963505

Thx zu allen HELFERN!

//edit: update sourcecode + complied program!
ParnosDias van Boston

Beitrag von ParnosDias van Boston »

Hi, Onny.

Die Beschreibung "Analog Output-Channels" sollte man in "Digital Output-Channels 1- 8" aendern.

Da ist nur die "0 oder "1" vorhanden. Flasche voll oder Flasche leer.......bei mir immer "schnell" leer ( ich trinke Analog).
Deshalb kann man auch mit den Slidern nichts einstellen.

Als "Analog Output-Channels" kannst du "SetAnalogChannel 0-255" verwenden.
Hier sind aber nur 2 Ausgaenge (DAC) vorhanden, die man ueber Slider regeln kann.

Entweder als Ersatz eines Potis einer Motorendstufe ( 0-5/10 Volt ) oder (PWM) fuer
eigene Entwicklungen (Speed ueber die Aenderung der Frequenz, statt die Aenderung der Spannung).

Vor dem Beenden des Programmes muss noch ein "ClearAllDigital/Analog" eingesetzt werden
damit der Anwender, der NATUERLICH keine Anleitungen liesst und das Programm einfach beendet,
sich nicht an seiner immer weiter drehenden Maschine aufhaengt.

Die Presse: Mann erhaengte sich an drehendem Kleiderbuegel.

Die "Analog Output" kann man direkt an die Endstufen anschliessen, wenn sie mindestens 5 Volt vertragen.
Bei der Richtungsaenderung nimmt man 4 Digitalausgaenge ueber Joystick ( mit allen Richtungen und Speed), oder
Joystick mit 4 Schaltern, die dann ueber Optokoppler angeschlossen werden.

Du kannst aber auch Drehgeber an das Interface anschliessen, ( eine Lichtschranke auf Raedern, mit versetzten Augen)
die dir sagt, welche Richtung du eingelegt hast und welchen Speed deine Eingabe vorlegt.
Das Teil sagt dir aber auch nur die Werte, wenn du sie mit Static zwichenspeicherst.

.....wann war mein erstes Auge hier, wann kam mein zweites Auge....war mein erstes vor dem zweiten,
dann bin ich nach links gefahren, war mein zweites vor dem ersten, dann bin ich nach rechts gefahren.........
......wie oft habe ich geblinzelt............alles gezaehlt ?

Sowas funktioniert , doch fuer das Programm unausstehlich.
Dazu hat man dann Drehgeber gebaut, die die Werte speichern und auch die Position wiedererkennen.


Et is schon spaet.

Adios

PDvB
tinux
Beiträge: 12
Registriert: 06.12.2006 02:29
Wohnort: Bayern
Kontaktdaten:

K8055

Beitrag von tinux »

Hallo,

Habe auch eins für K8055.
Bild
http://www.gojowczyk.privat.t-online.de/K8055_Demo.zip

Grüße ..Tinux
Zuletzt geändert von tinux am 18.01.2011 00:38, insgesamt 1-mal geändert.
Antworten