Byte an digitaler Schnittstelle ausgeben
-
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.
-
Unter Windows gibt es Sleep(ms); // Millisekunden warten
Bei den *ix*en gibt es sleep(s); // Sekunden warten
und aus der #include <unistd.h> auch usleep(us); // Mikrosekunden wartenWobei alle Funktionen einen Integer oder Long-Wert erwarten. (Nix mit sleep(0.2))
Es gibt noch select aus den socket/winsock das man mißbrauchen kann.
struct timeval timeout; timeout.tv_sec = 2; timeout.tv_usec = 0; select (0, NULL, NULL, NULL, &timeout);
Oder wenn es gar nichts anderes gibt:
void delay_ms(unsigned ms) { clock_t zeit, timeout; zeit = clock(); timeout = (ms) * (CLOCKS_PER_SEC / 1000); while (clock() - zeit < timeout); }
Das fährt aber die Prozessorlast hoch.
-
danke erstmals!
aber wenn ich mit #include <unistd.h> die unistd.h einbinde und dann usleep() verwende, bekomme ich die Fehlermeldung, dass er in der unistd.h "getopt.h" nicht findet...was kann das sein?
-
huhu002 schrieb:
aber wenn ich mit #include <unistd.h> die unistd.h einbinde und dann usleep() verwende, bekomme ich die Fehlermeldung, dass er in der unistd.h "getopt.h" nicht findet...was kann das sein?
Das mit usleep ist die Fortsetztung von "Bei den *ix*en ...".
Du hast Windows.
-
aber auch wenn ich windows.h inkludiere und Sleep() verwende, bekomme ich Fehlermeldungen aus der WinDef.h...
-
Das kann nicht sein. Sleep gehört zur WinAPI, du machst etwas falsch.