Byte an digitaler Schnittstelle ausgeben



  • 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 werden

    DLL:
    __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/...)





  • 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 warten

    Wobei 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.


Anmelden zum Antworten