Forum: Mikrocontroller und Digitale Elektronik Ein ASM SourceCode für die Vellemann K8055?


von Lzaman (Gast)


Lesenswert?

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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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)

von Lzaman (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Lzaman (Gast)


Lesenswert?

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.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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.

von Lzaman (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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"?

von Lzaman (Gast)


Lesenswert?

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.

von Lzaman (Gast)


Lesenswert?

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 ?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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

von Lzaman (Gast)


Lesenswert?

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

von Sven (Gast)


Lesenswert?


von Lzaman (Gast)


Lesenswert?

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?

von Sven (Gast)


Lesenswert?

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

von Lzaman (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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!

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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();

von Lzaman (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Lzaman (Gast)


Lesenswert?

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

von Lzaman (Gast)


Lesenswert?

Wird wahrscheinlich mit
sleep(5000); klappen.

Wenn nicht frage ich nochmal nach.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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!

von Lzaman (Gast)


Lesenswert?

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.

von Lzaman (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.