mikrocontroller.net

Forum: Compiler & IDEs LPT unter XP-vista


Autor: Lothar Sammel (magic33)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so nachdem ich mich dumm und fast Dä(h)mlich gesicht habe
hier ein funktionierendes DevC++ skript das
den LPT Controlregister (ausgabe) setzen kann unter winXP und unter 
Vista
PS:
 test_read_control
und system("pause")
ist in der Main ausgeklammert und sollte zuerst
getestet werden
die dll muss natürlich im suchpfad sein !!!
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
/* Definitions in the build of inpout32.dll are:            */
/*   short _stdcall Inp32(short PortAddress);               */
/*   void _stdcall Out32(short PortAddress, short data);    */
/* prototype (function typedef) for DLL function Inp32: */
     typedef short (_stdcall *inpfuncPtr)(short portaddr);
     typedef void (_stdcall *oupfuncPtr)(short portaddr, short datum);
#define PPORT_BASE 0x378
void test_write(void);
void test_read_control(void);
/* After successful initialization, these 2 variables
   will contain function pointers.
 */
     inpfuncPtr inp32fp;
     oupfuncPtr oup32fp;
/* Wrapper functions for the function pointers
    - call these functions to perform I/O.
 */
     short  Inp32 (short portaddr)
     {
          return (inp32fp)(portaddr);
     }

     void  Out32 (short portaddr, short datum)
     {
          (oup32fp)(portaddr,datum);
     } 


int main(void)
{
     HINSTANCE hLib;

     short x;
     int i;


     /* Load the library */
     hLib = LoadLibrary("inpout32.dll");

     if (hLib == NULL) {
          fprintf(stderr,"LoadLibrary Failed.\n");
          return -1;
     }

     /* get the address of the function */

     inp32fp = (inpfuncPtr) GetProcAddress(hLib, "Inp32");

     if (inp32fp == NULL) {
          fprintf(stderr,"GetProcAddress for Inp32 Failed.\n");
          return -1;
     }


     oup32fp = (oupfuncPtr) GetProcAddress(hLib, "Out32");

     if (oup32fp == NULL) {
          fprintf(stderr,"GetProcAddress for Oup32 Failed.\n");
          return -1;
     }


/*******************************************************/
/** IF WE REACHED HERE, INITIALIZED SUCCESSFUL    ******/
/*******************************************************/
     //test_read_control();
     test_write();
     //test_read_control();
     /* finished - unload library and exit */
     FreeLibrary(hLib);
     //system("pause");
     return 0;
}

//   TEST:  Write constant to Control register)
void test_write(void) {
     short x;
     int i;
     Out32(0x37A,0xCA);     // Set Output-only again
}
//   TEST:  READ data from control
void test_read_control(void) {
     short x;
     int i;
     i=0x37A;
     x = 12;
     x = Inp32(i);
     printf("Port read (%04X)= %04X\n",i,x);
}

Autor: Frank Lehmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha.
Und warum so kompliziert?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Ansatz über LoadLibrary/GetProcAddress ist bei einem Programm, das 
sonst nichts weiteres macht, natürlich etwas aufwendig, aber bei einem 
Programm, das auch zu anderen Aufgaben genutzt werden kann, äußerst 
praktisch.

Wird die zur DLL gehörende Importlibrary verwendet (was der "einfachere" 
Weg ist), dann muss die DLL zwingend vorhanden sein, wenn das Programm 
aufgerufen wird, sonst verweigert Windows das Starten des Programmes.

Nun stelle man sich eine IDE mit integrierter ISP-Funktion vor - die 
könnte man beim Importlibrary-Ansatz nur dann nutzen, wenn die DLL auch 
da ist, selbst wenn man die ISP-Funktion gar nicht nutzen will.

Mit dem LoadLibrary/GetProcAddress-Ansatz aber kann die IDE eine 
differenzierte Fehlermeldung ausgeben und sonst aber weiter 
funktionieren.

Somit ist das ein löbliches Codebeispiel. Chapeau!

Autor: Frank Lehmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha. Wieder was gelernt. Danke!

Autor: Aribert Börner (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
.. bei mir läuft unter Win2K original Test-Programm über DEV-C ohne 
Einschränkungen. Habe nunmehr das (!! entscheidende !!) Problem, daß an 
der Druckerschnitstelle (0x378 -> Datenregister) keine entsprechenden 
Spannungen meßbar sind. Im BIOS waren Modi beim Testen der 
Druckerschnitstelle  <NORMAL> und <bidirektional>.
Kann mir da Jemand weiterhelfen ?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.