FAQ


 
Oft gestellte Fragen - hier die Antworten
FAQ steht für "frequently asked questions"

  Zurück zur Übersicht



Programmierung, Sourcen, Port-Access...

Wie kann ich unter Windows ohne die ESCD-Tabelle die I/O-Adresse der PCI-Karte ermitteln?

Benutzen (installieren) Sie PCITree.EXE und schauen Sie zur entsprechenden Karte im Config-Space-Register unter <BASE Adress 0> nach und ziehen 1 bei der I/O-Adresse ab, damit Sie einen runden Wert erhalten. Beispiel: 6501h = 6500h. Die Ziffernangabe erfolgt wie bei Speicheradressen üblich, in hexadezimaler Schreibweise. Die aktuelle Version erhalten Sie bei: http://www.pcitree.de

Mein PCI-Bus ist mit 33 MHz angegeben. Können Daten mit 33 MHz wirklich übertragen werden?

Unsere PCI-1616 TTL-I/O-Karte kann beispielsweise Daten mit 33 MHz direkt übertragen. Das Rechner-BIOS und die South-Bridge benötigen jedoch für den I/O-Zugriff etwa 0,3...2µs, bis neue Werte zum/vom PCI-Slot geschrieben oder gelesen werden können. Aus diesem Grund kann auch keine seriöse Transferzeit garantiert werden, da sich jedes BIOS und jedes Mainboard im Timing bzw. Zugriff unterschiedlich verhält.

Wir beabsichtigen die PCI-xyz in unsere Messsysteme einzustetzen. Unsere Systeme verwenden Win 2k. Sind DLL-Funktionen bei dem Produkt vorhanden, damit man darauf zugreifen kann?

Ja und Nein. Eine DLL steht nur insoweit zur Verfügung, dass man mit Source-Beispielen eine direkte Registerprogrammierung der PCI-Karte vornehmen kann. Fertige (gekapselte) DLL-Funktionen stehen somit nicht zur Verfügung. Im Delphi-5-Quelltext ist die Programmierung komplett offengelegt. Die Delphi-Programmierung kann mittels DLL- und SYS-Treiber auch unter Windows 2000/200x/XP/Vista/7/8... erfolgen.

Gibt es einen Quellcode, wie man unter Windows den Config-Space einer I/O-Karte auslesen kann?

Ja. Der KlibDrv-Treiber ist unter allen 32-bit Windows-Versionen einsetzbar. Hierzu exsistiert auf unserer CD ein Quellcode in Delphi-5, wie man den Treiber öffnet und auf die Ports zugreifen kann. Ein weiterer Quellcode zeigt, wie man die Karten-Ressourcen über den KlibDrv-Treiber auslesen kann.

Ein Beispielprogramm funktioniert nicht auf einem P4 IBM ThinkCentre Rechner, wohl aber auf einem ASUS-Board. Was ist falsch?

Die neuen Rechner-Chipsätze von Markenprodukten haben zum Teil höhere PCI-Bus-Nummern, die die Beispiel-Software nicht unterstützt, da bei deren Programmierung nur Bus0-Rechner exsistierten. Sie müssen also den Quellcode dahingehend abändern (bsp. bis Bus31 abpollen) und anschließend neu compilieren, damit die entsprechenden Kartenressourcen gefunden und vergeben werden können.

Sind die zu kaufenden Sourcen in Visual-BASIC 6 richtig dokumentiert?

Nein. Lediglich die wichtigsten Code-Zeilen sind kurz als Einzeiler beschrieben. Eine ausführliche Dokumentation gibt es zu keinem Source bzw. Anwendungsprogramm. Es wird davon ausgegangen, dass entsprechende Kenntnisse in der VB6- und Windows-API-Programmierung, sowie in Mess-Hardware- und PCI/PnP-Mechanissmen, vorhanden sind.

Wie bestimme / vergebe ich unter DOS 6.22 den IO-Adressbereich für die PCI-Karte?

Der IO-Adressbereich kann beispielsweise mit PCIINFO.EXE ermittelt werden. Anschliessend muss die gefundene BASE-Adresse in Ihr Programm statisch eingetragen werden. Somit können auch noch alte Compiler wie GWBASIC, MS_C und Turbo-Pascal mit der Hardware unter DOS kommunizieren. Eine andere Möglichkeit besteht darin, die Karte mit einer Adresse zu überladen. Dies ist jedoch sehr gefährlich, da eventuell andere Hardware einen Datenkonflikt verursachen kann oder beispielsweise die Festplatteninstallation bei I/O-Überlappung zerstört werden kann. Es gilt vorher zu prüfen, ob der Adressbereich von FFh bytes auch wirklich unbenutzt ist, bevor die PCI-Register im Config-Space überladen werden. Alle KOLTER ELECTRONIC PCI-Karten benötigen einen durchgängigen Adressraum von 256 bytes. Dieser sollte im Bereich 1000h-FFFFh liegen. Zum Überladen der Adresse können Sie das DOS-Programm PCISETIO.EXE verwenden, dass ebenfalls auf unserer Treiber-CD vorhanden ist.

Kann ich mit dem KlibDrv-Treiber auch eine ISA-I/O-Karte mit 8255 Port betreiben ?

Natürlich. Doch ISA-Karten werden nicht dynamisch zugewiesen (wie bei PCI) und normalerweise auch nicht vom BIOS bzw. Bestriebssystemen erkannt. Daher werden sie auch nicht im Windows-Gerätemanager eingetragen. Dennoch kann der KlibDrv-Treiber sehr wohl mit den Port-Ein/Ausgängen kommunizieren, da die ISA-Karte physikalisch auf dem Bus vorhanden ist und auch über die absoluten I/O-Adressen direkt ansprechbar bleibt. Damit man keinen 'Absturz' riskiert, sollte man genau wissen, auf welchen I/O-Adressen sich die Hardware ansprechen lässt. ISA-Karten wie OPTO-1 oder RELAIS-1 werden beispielsweise über den legendären 8255 Port-Baustein programmiert. Ein.- bzw. Ausgänge sind auf der Karte fest verdrahtet und den E/A-Aufgaben entsprechend zugeteilt: Ausgabe auf Port PA und Eingabe auf Port PB + PC. Die Adressierung des 8255 ist durch den Chip-Hersteller bereits vordefiniert: Die Basisadresse der Karte (hier 0x0DE0 hex) wird bereits dem Port PA zugeteilt, weitere Adressen sind jeweils um '1' steigend angeordnet. So ist die Adresse 0x0DE1 dem Port PB und 0xDE2 dem Port PC zugeteilt. Dem letzten 8255-Register kommt eine besondere Bedeutung zu: Hier wird das Kommandowort programmiert. Das Kommandowort teilt dem Portbaustein mit, welche Betriebsart im Zusammenhang mit der Hardware verwendet werden soll. Es legt damit fest, dass PA ein Ausgabe-Register und PB + PC als Eingabe-Register arbeiten. Bevor man auf die Port-Register PA, PB und PC Zugriff erhält, ist eine vorausgehende Initialisierung auf dem Kommandowort-Register notwendig, ansonsten verhält sich der Portbaustein quasi transparent bzw. im Input-mode. Da wir beispielsweise bei der OPTO-1 ISA-Karte die 'Einfache Ein.- und Ausgabe der Betriebsart 0' verwenden, wird hierzu das Kommandowort auf der Adresse 0x0DE3 mit 139 dez. (= 8B hex) eingeschrieben.

Wie wird die Visual-BASIC Beispielsoftware 'PortTest.EXE' mit einer ISA-Karte angewendet?

Auf unserer CD befindet sich ein Projekt in Visual-BASIC6 inkl. Quellcode, mit dem Sie ISA-Karten direkt programmieren können. Die Sourcen finden Sie im Verzeichnis: '...\Sourcen\visual-basic\Universal_Port_IO'. Damit die hier verwendete KlibDrv.DLL mit der KlibDrv.SYS auch richtig zusammenarbeitet, ist es erforderlich, dass die stets aktuelle KlibDrv.DLL in das entsprechende Anwendungsverzeichnis kopiert wird. Nach Installierung des KlibDrv-Treibers mit Setup.INF (passend zu Ihrem Betriebssystem aus dem ...\Driver Verzeichnis der CD) starten Sie den Rechner neu, um den Dienst des Treibers zu ermöglichen. Durch starten der Anwendung 'PortTest.EXE' aktivieren Sie den nun den Treiber mit der 'Open Driver' -Taste. Wenn alles richtig verläuft, werden anschliessend vier Häkchen in jedem der zwei Felder (Write und Read) aktiviert sein. Klicken Sie zunächst die unteren drei Häkchen im linken Fenster weg, damit nur ein Häkchen im 'Write to the ports' -Feld aktiviert bleibt. In das obere Adressfeld 'Addr(hex)'  wird die Adresse 0DE3 und im rechten Value-Feld das 8255-Kommandowort 8B hex eingetragen. Danach wird die 'Write all ports' -Taste 1x betätigt, um den Wert auf die Kommandowort-Adresse des 8255 einzuschreiben. Im rechten Read-Feld bleiben zunächst alle Häkchen aktiviert. Falls die default-Werte der Read-Adressen noch auf 0DE0..3 voreingstellt sein sollten, kann durch Betätigung der 'Read all ports' das jeweilige Input-Byte der Optokoppler (8255 Port-PB und -PC) eingelesen werden. Zum Lesezeitpunkt müssen die Spannungen statisch anliegen, da diese nicht zwischengespeichert werden. Sind keine Spannungen angelegt, sollten die Read-Value-Werte für die Adressen 0DE1 und 0DE2 jetzt auf 'FF hex' stehen, werden Eingänge mit einer dafür vorgesehenen Spannung beaufschlagt, kippt das entsprechende Bit auf Null. Durch wiederholtes Betätigen der 'Read all ports' -Taste wird der aktuelle Wert in dem Value-Feld überschrieben.

Wie kann ich unter Windows-NT4/2000... Server2008/XP/Vista/7... auf die I/O-Ports zugreifen ?

Zur Programmierung unter NT-Systemen benötigen Sie einen echten Kernel-Device-Driver, wie beispielsweise NTP oder klibdrv. Wenn Sie nur eine Anwendung schreiben wollen, mit der Sie unter Win9x und NT-Systemen gleichermaßen arbeiten möchten, sollten Sie nur den neuen klibdrv-Treiber verwenden. Wir bieten hierzu einen universellen Visual-BASIC-6 Source an (auf der CD enthalten), der die Abfrage des PCI-Config ermöglicht und die I/O-Ports über 8/16-bit-Befehle per read/write ansteuert (ähnlich HWT.EXE). Alle I/O- und PCI-Config-Befehle werden über eine mitgelieferte DLL gesteuert (KlibDrv.DLL), die je nach Betriebssystem auf einen SYS-Treiber oder VXD-Treiber zugreift. Dieses Treibermodell ist nur mit unserer Hardware anwendbar. Die DLL muss im Anwenderverzeichnis liegen.

Wie kann ich unter Linux direkt auf IO-Ports zugreifen ?

Um Ports über PCI, ISA oder LPT Interface-Karten direkt anzusteuern, muss zuvor ein Schutzmechanissmus umgangen werden, der dafür zuständig ist, dass keine ungewollten Hardware-Zugriffe stattfinden. Die direkte I/O-Addressierung durch Programme im User-Space eignet sich für einfache und zeitunkritische Mess-, Steuer- und Regelaufgaben, z.B. zur Programmierung von Optokoppler und Relaissteckkarten, A/D- und D/A-Wandlerkarten oder Counter/Timer-Karten. PC-Steckkarten mit dem legendären 8255-I/O-Baustein oder Centronics-Interface sind immer noch sehr weit verbreitet und preiswert im Handel erhältlich. Nachfolgend ein kleines C-Beispielprogramm (GNU-C) zur Illustration der direkten I/O-Programmierung:

1  #include <asm/io.h>
2  main(int argc, char* argv[]) {
3    int base=atoi(argv[1]);
4    int value=atoi(argv[2]);
5    ioperm(base,3,1);
6    outb(value,base);
7    outb(0,base+2);
8    printf("%i\n",inb(base+1));
9    ioperm(base,3,0);
10 };
 

Gibt es eine einfachere Methode, um auf I/O-Ports unter NT zuzugreifen ?

Ja. Beim "alten" NTP-Treibermodell können Sie unter Windows NT/2000 und XP auch einfacher auf die I/O-Ports zugreifen. Es stehen jedoch nur wenige Programmierbeispiele in MS-Visual_CPP auf unserer CD zur Verfügung, da dieses Treibermodell nicht mehr für zukünftige Entwicklungen erweitert wird. Damit Sie I/Os direkt ansprechen können, muessen Sie zuvor den NTP-Treiber mittels Setup installieren und die Klassentreiber ".CPP" und ".H" in Ihr eigenes Visual_C-Projekt manuell einbinden. In erster Linie dient der NTP-Treiber der Unterstützung von ISA-Karten. PCI-Config-Register werden hierbei nicht unterstützt.

Wie kann ich aus Delphi auf I/O-Ports zugreifen ?

Unsere KlibDrv.DLL kann unter ganz verschiedenen Programmiersystemen verwendet werden. Ein Delphi-5 Projekt (inkl. Quellcode) steht seit kurzem auch auf unserer CD zur Verfügung und ist ebenfalls kostenlos, wenn Sie von uns eine PCI-I/O-Karte erwerben. Entsprechende DLL-Funktionen werden von einem zusätzlichen Modul integriert und im Delphi-Quellcode aufgerufen.

Ich habe darmals zur 48TTL-I/O ein CPP-Projekt unter Windows 98 programmiert.
Wie funktioniert es jetzt unter NT/2000/XP ?

Windows-NT Systeme sperren Portzugriffe von Haus aus, die aber über entsprechende device-Treiber wieder zugängig gemacht werden können. Dafür haben wir ein kostenloses Tool mit dem Namen NTP-Treiber entwickelt, was aber auch im Lieferumfang der 48TTL-I/O-Karte enthalten ist. Ihren CPP-Quellcode müssen Sie jedoch entsprechend dem Befehlssatz des NTP-Treibers neu anpassen und compilieren. Auch hier gilt: Damit Sie I/Os ansprechen können, muessen Sie zuvor den NTP-Treiber mittels Setup installieren und die Klassentreiber "CPP" und "H" in Ihr Projekt manuell einbinden.

Ich habe ein altes C-Programm auf einem neuen Rechner installiert. Nun funktioniert die A/D-Karte nicht mehr ordnungsgemäß und die gemessenen Werte werden zum Teil falsch ausgegeben. Bei einem PASCAL-Programm funktioniert die Messkarte aber einwandfrei. Woran kann das liegen?

Die C-Programme wurden darmals mit einem 486 bzw. Pentium-1 Rechner unter DOS programmiert, wobei die Delay-Schleifen oftmals mit einer abzuzählenden Zahl vorgenommen bzw. von einer Konstanten herruntergezählt wurden. Diese Form der Verzögerung ist jedoch von der Rechnergeschwindigkeit abhängig. Daher ist es möglich, dass die Mindest-Wandlungszeit des ADC bzw. die Multiplexer-Zeit auf neuen, schnellen Rechnern jetzt nicht mehr ausreicht. Bei den Pascal-Programmen wurde ein "richtiges" Delay eingesetzt, dass Rechnerunabhängig funktioniert.

 


KOLTER ELECTRONIC ist nicht für die Inhalte fremder Seiten verantwortlich.
Es gelten ausschließlich die AGB der Firma KOLTER ELECTRONIC.
Für die Richtigkeit der Angaben wird keine Gewähr übernommen.
Alle Preisangaben sind gewerblich. Das Zahlungsmittel ist EURO.
Alle Rechte vorbehalten.(c) copyright H.Kolter

[ Zur KOLTER ELECTRONIC® Hauptseite ]