Hallo, da ich ein wenig Erfahrung mit assembler habe, wollte ich fragen: Kann jmd. ein asm source code posten mit dem man die Ein- und Ausgänge des Controller K8055 steuern kann? Folgendes ist gedacht: wenn die Analogeingänge einen bestimmten Wert überschreiten, so sollen zwei Digitalausgänge gesetzt werden. Analogeingänge sind an einem Abstandssensor angeschlossen und die Digitalausgänge an eine Motorsteuerungsplatine. Hat das schon mal jemand assembliert oder es versucht? Danke
Dein Vorhaben ist ziemlich exotisch. Die "normale" Ansteuerung der Karte geschieht ja von einem PC aus über eine spezielle Ansteuerbibliothek. Die Ansteuerbibliothek kapselt die eigentliche Ansteuerung der Karte über USB vor dem Anwender und bietet dafür eine einheitliche Schnittstelle für Ein- und Ausgabefunktionen. Für Windows liefert Vellemann eine Ansteuerbibliothek in Form einer DLL, die aus verschiedenen Hochsprachen heraus angesprochen werden kann. Grundsätzlich wäre es möglich diese Ansteuerbibliothek auch aus Assembler heraus anzusprechen. Wenn du Ahnung hast, wie z.B. Windows-DLLs angesprochen werden, um z.B. eine Messagebox darzustellen, sollte dir das Prinzip bekannt vorkommen. Für andere Betriebssysteme und für exotische Hochsprachen gibt es Ansteuerroutinen von Dritten. Es ist klar, dass die USB Grundroutinen dann jeweils auf das Betriebssystem abgestimmt sind. Diese Implementierungen könntest du dir zum Vorbild nehmen, wenn du alles von Hand zu Fuss in Assembler machen willst oder notgedrungen machen musst. Tipp: Links zu K8055 findest du auf meiner Benutzerseite (Seitensymbol rechts oben neben meinem Benutzernamen)
Danke für die schnelle Antwort. Also mein Problem ist, dass ich erstmal nur mit masm eine Verbindung über usb zu dem k8055 herstellen will und nur einen bit setzten möchte. Doch das klappt irgendwie nicht, deswegen meine Frage nach einem kurzen code. Wer mir einen kleinen asm code als Anschubser geben kann, dem wäre ich sehr dankbar. Das Ergebnis wird hier zu sehen sein: http://www.rueha.de/Technikpreis_2008/ Die Bahn fährt schon mit der Software vom K8055, jetzt muss nur noch die Pogrammierung gemacht werden. Danke P.S. Pressertikel unter: http://www.bko-bkf.de/temp_show.php?ide=kf2008-02-18-4711
Lzaman wrote: > Also mein Problem ist, dass ich erstmal nur mit masm eine Verbindung > über usb zu dem k8055 herstellen will und nur einen bit setzten möchte. > Doch das klappt irgendwie nicht, deswegen meine Frage nach einem kurzen > code. > > Wer mir einen kleinen asm code als Anschubser geben kann, dem wäre ich > sehr dankbar. Was willst Du mit Code, wenn Du ihn nicht mal draufkriegst? Erstmal mußt Du den Chip programmieren können. Du mußt also erstmal rauskriegen, ob auf dem Chip ein USB-Bootloader drauf ist und ob man diesen aktivieren kann. Ich gehe mal davon aus, daß das aber nicht der Fall ist. Die Firmware wird fest reingebrannt sein und auslesegeschützt. Du mußt Dir also erstmal nen PIC besorgen und dann per Programmiergerät einen USB-Bootloader reinbrennen. Dann erst kannst Du anfangen, ein Assemblerprogramm zu schreiben und es in den Chip flashen und sehen, ob es läuft. Peter
Also der Code sollte auf dem mini PC laufen. Und unter masm will ich nur die Verbindung zum Board herstellen und erstmal einen Eingang setzen über einen EXTERNEN PC. Die Firmware will ich nicht ändern. Es müsste doch klappen mit Einbindung der DLL unter masm.
Ich denke auch, dass sich die DLL unter MASM ansprechen lässt. Voraussetzung ist, dass auf dem Mini-PC entweder ein Windows (vermutlich echtes, kein mobiles Windows CE o.ä.) läuft und du die Vellemann DLLs aus dem Assemblercode heraus ansprichst. Die Vellemann DLLs benutzen selbst wieder Windows Funktionen, daher die Zusatzbedingung. Technisch musst du halt unter Assembler das Thema DLLs beherrschen. Dafür gibt es Tutorials z.B. http://www.joachimrohde.com/cms/xoops/modules/articles/article.php?id=75 und da dir bei der Vellemann DLL die INC/LIB Dateien nicht zur Verfügung stehen (bzw. ich nicht weiss, ob und wie man *.h und *.lib Dateien für VC++ entsprechend umformen kann), wird der Weg wohl auf das LoadLibrary/GetProcAdress Verfahren hinauslaufen. Viel einfacher wäre es wahrscheinlich, wenn du nicht auf Assembler beharrst, sondern eine Hochsprache wie Visual Basic, C (auch das freie GCC geht, es gibt auch einen freien Borland C Compiler, den du benutzen könntest), Delphi, Python, Java... benutzt und Beispielcode für deinen Zweck anpasst. Mit Assembler und diesem Thema wirst du weltweit ziemlich einsam dastehen.
Also erstmal danke für die freundliche Antwort. Wir haben schon eine asm datei, die aber nicht so ganz klappt. ich habe diese mal hochgeladen.
Dieser Sourcecode ist ein rudimentärer Server über TCP/IP Sockets. Es ist kein Code für die Ansteuerung der K8055-Karte enthalten. Funktioniert dieser Servercode an sich und ist "nur" die K8055 Ansteuerung einzubauen (was genau soll gesteuert werden)? Oder funktioniert alles "nicht so ganz"?
Ja das ist richtig der Code hat eine Serverfunktion mit einer Grafikoberfläche in Java. Wir wollen jetzt nur die Verbindung zum USB Controller als reinen ASM Code, das müssten doch nur ein paar Zeilen sein. Vorgestellt habe wir uns, dass man eine exe Datei startet und ein Digitaloutput aktiv wird (z. B. Output 8), damit man erstmal sehen kann ob die Verbindung zur Controllerkarte über USB funzt. Wenn wir diesen hinbekommen mit eurer Hilfe, werden wir auch in der Lage sein den Code zu erweitern und können Schleifen usw. einbauen.
Wie würde denn der Befehl in MASM für die Verbindung zum K8055 Board lauten ? Und wie Lautet das Kommando einen Digitaloutput zu betätigen. Welche includes muss man nehmen ?
> Wir wollen jetzt nur die Verbindung zum USB Controller als reinen ASM > Code, das müssten doch nur ein paar Zeilen sein. Wie du meinst. ICh schätze um die 50 Zeilen, weil einiges an Parametern übergeben werden muss. Schwer zu sagen, da ich in ASM nicht bewandert bin. > Und wie Lautet das Kommando einen Digitaloutput zu betätigen RTFM. Es gibt mehrere Möglichkeiten. eine davon ist SetDigitalChannel für das Setzen einer log. 1 an einem Kanal. (bzw. die Gegenfunktion ist ClearDigitalChannel) > Welche includes muss man nehmen ? Wie ich bereits bereits geschrieben habe, gibt es keine fertigen Assembler-Includes. Die musst du selber schreiben oder aus den fertigen Includes für Hochsprachen umschreiben. Oder du verwendest die ebenfalls bereits erwähnte dynamische Methode, um die DLL zur Laufzeit mit LoadLibrary nachzuladen und die gewünschten Adressen der Funktionen (OpenDevice, SetDigitalChannel, CloseDevice) mit GetProcAdress herauszufinden. Alle notwendigen Funktionen findest du im DLL-Manual von Vellemann beschrieben. Allerdings beschrieben für die Hochsprachen VB6, Borland C++ Builder, Delphi, MS VC6 und VC2005 sowie Java (http://users.pandora.be/RE-Applications/enDownload.htm) In einer Hochsprache kann das Codestück ohne Fehlerbehandlung in acht Zeilen geschrieben werden (Pseudocode) // einmalig bei Programmstart hL = LoadLibrary("K8055D.dll") pOpenDevice = GetProcAdress(hL, "OpenDevice") pSetDigitalChannel = GetProcAdress(hL, "SetDigitalChannel") pCloseDevice = GetProcAdress(hL, "CloseDevice") pOpenDevice(kartenadresse 0 bis ...) // ggf. mehrfach zur Programmlaufzeit pSetDigitalChannel(wunschwert 1 bis 8) // einmalig bei Programmende pCloseDevice() FreeLibrary(hL)
Da ich mich jetzt entschieden habe und einem tipp folgen werde, will ich alles in C++ machen. Allerdings bin ich totaler Anfänger in dieser Hochsprache. Gibt es vielleicht dafür schon fertige Codes mit der exe datei oder kann jemand helfen? danke
Danke so etwas habe ich gemeint. Vielen Dank erstmal an alle und super Forum ist das hier. Jetzt müsste es doch nicht mehr schwer sein eine if schleife einzubauen, die bei einem AnalogEingangsWert>100 die Digitaleingänge auf null setzt oder?
int main(){ int Analog; int port; int mwAnalog = 0; int mwCounter = 0; init(); OpenDevice(0); mwAnalog = 0; mwCounter = 0; while (1) { Analog=ReadAnalogChannel(1); std::cout << "Analogport1 = " << Analog << std::endl; mwAnalog = mwAnalog + Analog; mwCounter++; if (mwCounter>=10) { if (mwAnalog>100) { SetDigitalChannel(1); } else { ClearDigitalChannel(1); } mwCounter = 0; mwAnalog = 0; } delay_ms(100); } CloseDevice(); return 0; } So, damit wird jetzt in einer Endlosschleife der Analoge Wert ausgelesen und jede Sekunde der gebildete Mittelwert angeschaut. Davon abhängig wird der Ausgang gesetzt oder gelöscht. So jetzt schau aber mal das Du das hinbekommst. Gruß Sven
So alles funzt, die Abstandswarner geben Analogwerte an die K8055 und diese setzt dann durch eine If Schleife die entsprechenden Digitalausgänge sowie die beiden PWM Ausgänge für die zwei Motoren. Jetzt habe ich nur noch ein Problem. Die Funktion ClearAllDigital und ClearAllAnalog klappt nicht. hat jemand vielleicht eine Lösung dafür? Sonst muss man ja jeden Ausgang einzeln "clearen". Den Code bis jetzt habe ich mal hochgeladen.
Viel fällt mir dazu nicht ein. Ich muss das auf einer K8055 Karte selbst ausprobieren. In der Zwischenzeit ein schwacher Debugversuch: Prüf mal, welchen Wert die Funktionspointer ClearAllDigital und ClearAllAnalog besitzen. In der obigen init() werden diese Zeiger über GetProcAddress initialisiert. Allerdings ohne zu prüfen, ob die Zuweisung erfolgreich ist. Im Fehlerfall ist der Rückgabewert von GetProcAddress NULL. Und wenn sich die Probleme bestätigen, könntest su einen Workaround machen - schreib dir eigene Löschfunktionen, die in einer Schleife die einzelnen Kanäle zurücksetzen. EDIT: Und, sieht doch schon ganz gut aus so mit einer Hochsprache statt in ASM, oder? Ehrlichen Respekt, dass du das in so kurzer Zeit geschafft hast!
ADD: Zeig auch mal, wie du die beiden komischen Funktionen in deinem Sourcecode einsetzt. Vielleicht stimmt der Aufruf nicht. Es sollte so aussehen: ClearAllDigital(); ClearAllAnalog();
Ja hab auch ganze nacht getüfftelt, hatte vorher nur basic erfahrungen (2 jahre lang), aber mit c bzw. c++ kann man ja fast alles realisieren. Übrigens die Funktionen in der K8055.cpp sind mit func0 definiert. Das müsste ja so korrekt sein. Im Code würde ich die so schreiben : ClearAllDigital; (also ohne ()) Vielleicht ist da der Fehler, ich werde das heute abend mal testen. habe die K8055.cpp mal hochgeladen. Sonst werde ich es mal mit Goto machen.
Noch eine kurze Frage: Wie kann ich eine Warteschleife einbauen, also dass bei einer erfüllten Bedingung das prog erst 3-5 sek wartet bevor es weiter läuft? Danke
Wird wahrscheinlich mit sleep(5000); klappen. Wenn nicht frage ich nochmal nach.
Der Windows-Kernel hat da eine Funktion Sleep (beachte das S am Anfang) die du benutzen könntest. Als Argument wird die Anzahl der zu pennenden Millisekunden angegeben (Variable vom DWORD Typ). Der Prototyp wird mit windows.h eingebunden.
Lzaman wrote: > Übrigens die Funktionen in der K8055.cpp sind mit func0 definiert. Das > müsste ja so korrekt sein. > > Im Code würde ich die so schreiben : > ClearAllDigital; (also ohne ()) > > Vielleicht ist da der Fehler, Bingo. Das was du da hast ist kein Funktionsaufruf, sondern du stellst die Speicheradresse der Funktion fest, um dann nichts weiter damit zu tun. Ein freundlicher Compiler könnte eine Warnung schmeisse "Code has no effect" oder so ähnlich, aber das wars dann auch: Ist eine gültige C++ Anweisung, die nichts bewirkt. Wenn du eine Funktion aufrufen willst, dann sind die ( ) obligatorisch!
So danke hab jetzt mal mit ClearAllDigital( ) probiert und es funzt. hab nur noch ein kleines Problem. Versuche es erstmal selbst bis morgen, ansonsten müsste ich euch nochmal um Hilfe bitten. Bis morgen.
So ich würde das Thema hier gerne beenden. Ich habe ne menge in C++ Programmierung gelernt. Jetzt würde ich gerne ein neues Thema eröffnen (schon wegen der Überschrift, hat ja nix mehr mit ASEMMBLER zu tun).
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.