Byte an digitaler Schnittstelle ausgeben
-
Hallo Leute!
Ich bin noch relativ neu in C, und möchte über eine 24 bit digitale Schnittstelle ein Byte (eigentlich reicht ein Bit) ausgeben, um dann mittels TTL und Relais einen Motor zu steuern (ein- und ausschalten, also z.B. LSB=1 --> 5V).
In der Treiberdoku wird hierfür die Funktion outp() verwendet, allerdings wird diese nicht mehr unterstützt wie ich gelesen habe.
Treibermäßig ist ein Header (dscud.h) und eine dll (dscud.dll) dabei, bringen die was?
Gibt es irgendeine Alternative zu outp() oder eine andere Lösung?Ich wär auch für ein kleines Code-Beispiel sehr dankbar, da ich wie gesagt noch relativ neu bin.
Danke im Voraus!
huhu002
-
huhu002 schrieb:
In der Treiberdoku wird hierfür die Funktion outp() verwendet, allerdings wird diese nicht mehr unterstützt wie ich gelesen habe.
Hat derjenige, der dir von outp() abgeraten hat, denn keine Alternative angeboten? Ansonsten könntest du dir mal den Inhalt dieses Headers ansehen, was er für Funktionen zur Verfügung stellt.
-
im Header gibt es folgende Register-Funktionen und DIO-Funktionen:
BYTE DSCUDAPICALL dscOutp(DWORD address, BYTE value);
BYTE DSCUDAPICALL dscDIOSetConfig(DSCB board, BYTE* config_bytes);
BYTE DSCUDAPICALL dscDIOOutputByte(DSCB board, BYTE port, BYTE digital_value);
BYTE DSCUDAPICALL dscDIOOutputWord(DSCB board, BYTE port, WORD digital_value);Funktioniert das über diese Funktionen? Aber wo definiere ich dann meine base+adresse?
-
Lies die Dokumentation durch, evtl. hilft es dir, wenn du abklären kannst, was sich hinter "DSCB board" verbirgt. Dies scheint eine Quasi-Ersatzadresse zu sein.
-
huhu002 schrieb:
Funktioniert das über diese Funktionen? Aber wo definiere ich dann meine base+adresse?
Vielleicht mit
// Driver Level Functions BYTE DSCUDAPICALL dscInit(WORD version); void DSCUDAPICALL dscFree(void); // Board Level Init/Free BYTE DSCUDAPICALL dscInitBoard(BYTE board_type,DSCCB *createboard_info,DSCB *board);
Steht so zumindest in einem dscud.h das ich mit Google gefunden habe.
-
Hab jetzt mal folgendes probiert:
#include "dscud.h" int main() { BYTE* config_bytes; BYTE digital_value; BYTE port; port = 0; digital_value = 1; config_bytes = 255; dscFreeBoard(DSC_DMM32AT); dscDIOSetConfig()Config(DSC_DMM32AT, config_bytes);//Um den Port auf Output zu setzen dscDIOOutputByte(DSC_DMM32AT, port, digital_value);//Schreiben }
Bekomme aber als Error aber für alle 3 Funktionen "undefined reference to ...", obwohl er doch die dscud.h inkludiert hat? Das mit dem Pointer versteh ich auch nicht so recht!
Kann mir da jemand helfen, wär sehr dankbar!
-
Du musst auch noch die Library selber mit dazu linken. Die wird etwa dscud.lib heißen. Zudem wird wohl noch die dscud.dll benötigt.
Wie wärs wenn du mit den Init-Funktionen anfängst.
dscInit wird die Libraray initialisieren. Die wird die dll laden.
dscInitBoard dementsprechend für deine Karte. Die Parameter müssen in der Beschreibung stehen.
Das dscFreeBoard sollte wohl erst aufgerufen werden wenn du die Karte nicht mehr brauchst. Also am Ende vom Programm.
Der Hersteller der Karte hat auf seiner Webseite bestimmt eine FAQ oder Beispielprogramme. Zumindest wird eine EMail-Adresse stehen.
-
die dll hab ich inzwischen schon eingebunden.
in der Doku gibts eine dscinitBoard:
BYTE DSCUDAPICALL dscInitBoard(BYTE boardtype, DSCCB* dsccb, DSCB* board);
Allerdings sind die Parameter nirgends definiert...
Gibt es eigentlich keine andere Methode, um das zu erreichen was ich möchte?
-
Schau mal hier unter 2.7 (Calling Universal Driver API Functions):
http://www.phys.unsw.edu.au/~jl/GATTINO/Manual/DMM_manual/manual_Table_of_Contents.htmlDie Doku für den Universal Driver solltest du aber auch haben.
-
das hab ich mir bereits angesehen, aber auch da steht nichts bzgl. der Parameter dsccb und board...
-
huhu002 schrieb:
das hab ich mir bereits angesehen, aber auch da steht nichts bzgl. der Parameter dsccb und board...
Aus der Doku (Meine Kommentare sind nach dem // )#include "dscud.h" // :warning: hier stehen die Parameter DSCB dscb; DSCCB dsccb; int main() { if ((result = dscInit(DSC_VERSION)) != DE_NONE) return result; dsccb.base_address = 0x300; // :warning: Deine Basisadresse hier dsccb.int_level = 5; // Ob du das hier brauchst, haengt von deine Board ab dsccb.dma_level = 1; dsccb.clock_freq = 10000000L; // :warning: DSC_DMM32 ist hier der board_type. Dein Board musst du kennen // der Typ steht als Makro in der dscud.h if ((result = dscInitBoard(DSC_DMM32, &dsccb, &dscb)) != DE_NONE) return result; // :warning: Hier kannst du dann deine eigenen Sachen machen. Z.B. das Bit setzen. /* Application code goes here */ if ((result = dscFreeBoard(dscb)) != DE_NONE) return result; if ((result = dscFree()) != DE_NONE) return result; return 0; }
Also steht doch alles drin.
-
DirkB schrieb:
Du musst auch noch die Library selber mit dazu linken. Die wird etwa dscud.lib heißen. Zudem wird wohl noch die dscud.dll benötigt.
Das ist falsch.
Man benötigt entweder eine DLL oder eine LIB.
In der DLL oder LIB steht die Definition des Codes/der Variablen,
d.h. hier müssen Funktionen/Variablen als Schnittstelle nach außen angegeben werdenDLL: __declspec( dllexport ) int blafasel; /* nicht standardkonform */ LIB: int blafasel;
In der nutzenden Anwendung steht dann die Deklaration
aus einer DLL nutzen: __declspec( dllimport ) int blafasel; /* nicht standardkonform */ aus einer LIB nutzen: extern int blafasel;
-
Die LIB und die DLL sind nicht gleichwertig.
Die LIB macht den Umgang mit der DLL leichter.Z.B das laden/freigeben der DLL.
-
Leute, welche gleichnamige Libs und Dlls in einem Projekt verwenden, sind entweder Stümper (die wissen nicht was sie tun) oder masochistisch veranlagt (hinsichtlich Fehlersuche/Debugging/Wartbarkeit/...)
-
Ich meinte
http://de.wikipedia.org/wiki/Dynamic_Link_Library#Einbinden_einer_DLL_und_Aufrufen_dieser_Funktion
Besonders das "Zu beachten ..."
-
erst eimal danke für die antworten, ihr habt mir sehr geholfen!
das Programm funktioniert soweit, aber es dürfte ein Problem bzgl. Compiler geben. Ich habe es mit dem GCC COmpiler kompiliert, da bekomme ich als Error "Windriver Board Initialization Failure".
Hat da jemand diesbezgl. Erfahrung?
Wenn ich es nun in Microsoft Visual C++ probiere (da müsste es funktionieren), kann ich den C-Code direkt übernhemen, oder?
-
huhu002 schrieb:
Wenn ich es nun in Microsoft Visual C++ probiere (da müsste es funktionieren), kann ich den C-Code direkt übernhemen, oder?
Eigentlich schon. Für welches Windows willst du das denn compilieren?
-
für Windows XP.
Ich hab es jetzt in Visual C++ probiert, ergibt aber leider den gleichen Error.
Kann es sein, dass Windows einfach den Zugriff auf die Hardware blockiert?
-
huhu002 schrieb:
Ich hab es jetzt in Visual C++ probiert, ergibt aber leider den gleichen Error.
Kann es sein, dass Windows einfach den Zugriff auf die Hardware blockiert?Ja klar.
Wenn die Programme Direkt-IO machen gibt es ein Problem. Das ist ja auch der Grund warum outp nicht mehr funktioniert.
Für den Zugriff als Nutzer sind ja die Gerätetreiber da.Lass das Programm mal mit Administratorenrechte laufen.
(Rechte Maustaste und Ausführen als ...)
-
so, nun funktioniert es! Das Problem war eine interne Fehlerabfrage der Config-Funktion mit einer if-Schleife, die er wohl unbedingt haben wollte...
aber gleich noch eine Frage an den Profi
: wie kann ich in C einen delay setzen, so wie "time.sleep(sec) in python? Also z.B. eine for-Schleife mit zwei Befehlen, zwischen denen z.B. 2 Sekunden vergehen sollen.