3.2k Aufrufe
Gefragt in Peripherie von
Hallo Community,
ich studiere derzeit Informatik und heute hatten wir sogenanntes "hardwareprektikum"
an einen Pc mit Win98 war eine Platine angschlossen, an der sich Leuchtdioden&Spannungsquellen sowie Spannungseingänge befanden.
In einem C-Programm konnte man durch die Befehle "outportb(768,zahl)" [zahl] an die Platine senden und dort inportb(770) einer Variable einen Wert zuweisen.
Hat [zahl] den wert 1, leuchtete eine diode, bei 2, eine andere, bei 3 alle beide usw(binärdarstellung der Zahlen) ebenso wurden Werte eingelesen.
Nun hat mich das alles sehr stark angetan und ich komm einfach nicht drauf klar was das für einen Spaß gemacht hat.
Mein Dozent sagte mir, man könne solche Platinen käuflich erwerben oder auch aus alten Druckern(z.B.) selber bauen. Das einzige Problem ist, dass man ein altes Betriebssystem benötigt(XP etc blockieren die Ansteuerung) und eine Serielle Schnittstelle am Pc vorhanden sein muss(hab ich noch irgendwo was rumstehen).
Nun bin ich auf der Suche nach einer solchen Platine(eingänge benötige ich keine, lediglich Ausgänge) um damit verschiedene elektrische Geräte zu steuern.
(Wie geil wäre das denn auf nen Knopf zu drücken und das Licht geht an? :) )

Hat jemand eine Anleitung dafür, wie ich sowas aus einem Drucker "bauen" kann oder evtl einen Link wo ich fertige Platinen käuflich erwerben kann?

Danke schonmal für Antworten
Fabian

13 Antworten

0 Punkte
Beantwortet von kjg17 Profi (34.4k Punkte)
Hallo Fbian,

bei dem Hinweis des Dozenten auf die alten Drucker kann ich mir eigentlich nur vorstellen, dass er eine rein manuelle Schaltung der Dioden mit dem in alten Druckern für bestimmte Grundeinstellungen verwendeten DIP-Schalter gemeint hat. Ich wüsste sonst nichts was an einer alten Druckerplatine in diesem Zusammenhang sonst noch brauchbar wäre.

Bei einem 8-fach-DIP-Schalter gibt es genau 256 möglichen Kombinationen für die Schalterstellungen, du kannst damit also alle möglichen 256 Werte eines Byts binär 'leuchten' lassen (bei 0 leuchtet natürlich nichts). Jeder einzelne Schalter repräsentiert mit Aus = dunkel = 0 und An = leuchtet = 1 jeweils 1 Bit.

Gruß
Kalle
0 Punkte
Beantwortet von Experte (3.2k Punkte)
Ich hab mal meine Favoriten durchsucht und tatsächlich zwei Links gefunden:
Die Parallele Schnittstelle
Messen, Steuern und Regel
Da sind n paar theoretische Hintergrundinfos und Beispiele zu finden.
Dafür reicht im einfachsten Fall ein Kabel, eine 25polige D-Sub Buchse (oder stecker, je nach kabel), ne Hand voll LEDs und Widerstände und ein paar drähtchen um alles zu verbinden.
Nichmal nen alten Drucker, den lass ma im Schrank ;)

Wie du selber sagst, braucht man für den Originalkram n altes Betriebssystem alá W98 oder so.
Wenn man jedoch statt outportb und inportb die inpout32.dll benutzt, kannste jedes Windows benutzen. Ist nicht viel komplizierter. Man muss nur die DLL laden und die funktionen benutzen. Samples sind verfügbar:
Inpout32.dll

viel Spaß beim "Spielen"

Ele
0 Punkte
Beantwortet von
Jut, danke das war schonma eine große Hilfe, jedoch möcht ich alles so machen wie beim Studium, damit ichs dann auch praktisch umsetzen kann. Aber trotzdem danke für die dll
Ich hab mal ein paar Fragen zu dem link "Die parallele Schnittstelle".
Gehen wir mal davon aus, ich nehm nen Spannungsmessgerät, häng den Minus-Pol an Ground/Masse und den Pluspol an Pin02(Datenbit 0).
Nun seh ich in dem Screenshot bei EA-Bereich 0378 stehen.
schreib ich nun in mein C-Programm(den formalen kram mal weggelassen) ouportb(378, 1) schreiben und es ausführen, würde mein Spannungsmessgerät dann was anzeigen?(sozusagen die binäre 1).
Danke schonmal.
Lg FAbian
0 Punkte
Beantwortet von
Hallo

würde mein Spannungsmessgerät dann was anzeigen?

Jawohl, es würde dann 5Volt Spannung anzeigen (TTL)

LG
0 Punkte
Beantwortet von Experte (3.2k Punkte)
nuja 1 = 0x01 = 0b0000.0001 = bit 0 high
stimmt so. dann ist das datenbit 0 (dass das jetzt pin 2 is glaub ihc dir einfach ma ;) high, also 5V. Du kannst ca. 5V gegen Masse/Ground messen.
Schreibste ne 3 = 0x03 = 0b0000.0011 rein, haste Datenbit 0 und 1 high, dürften pin 2 und 3 sein. Kannste hier 5V messen.

Praktische Anwendung is relativ dehnbar.
Du kannst jetzt an jeden Datenpin eine LED hängen (natürlich mit Vorwiderstand, Strom sicherheitshalber auf max 10mA begrenzen; der LPT soll relativ leicht kaputt gehen, ich selber habs jedoch noch nich geschafft).
Du kannst je nach ausgegebenem Binärcode die LEDs individuell steuern und so verschiedene LEDs (auch gleichzeitig) anschalten.
Damit hättest du das, was ihr in eurem Info-Kurs hattet, so wie ichs aus deinem Text rauslese.

Dann könntest du kleine Transistoren und Relais einbaun(NPN, Basis über Widerstand an Datenpin, Emitter an Ground, Kollektor an ein Relaisspule-, Relais+ an + von nem externen Netzteil, Massen verbinden).
Damit haste bis zu 8 Schalter, je nach verwendeten Relais An-, Aus- oder Umschalter. Damit kannste eigentlich schalten was du willst. Beachte aber, was auf den Relais draufsteht und beachte Sicherheitsrichtlinien. Noch besser: spar dir 230V~-Experimente für später =)

Ele
0 Punkte
Beantwortet von
Hey ich hab jetzt mal in ein "Masseloch" nen kleinen Nagel reingesteckt, da minuspol vom Messgerät rangehangen und nen anderen nagel bei den einzelnen datenausgängen. Jeder liefert ne Spannung von 3,5V. Ich hab mir das programm DirectIO runtergeladen, da können Ports freigegeben werden unter NT.
Also hab ich mal eben port 378 freigegeben und Mit QBasic probiert eine ausgabe zu erzeugen(out &h378, &h1). Keine Änderung.
Wassn da los? -.-
lg
0 Punkte
Beantwortet von
Sauber, ich hab grad ein Testprogramm gefunden, welches die inpout32.dll mitverwendet und über dieses Programm bekomm ich den Port tatsächlich angesteuert.
Nun meine erste Frage:
ich bins nur gewohnt unter Linux zu programmieren(zum Compilieren einfach gcc file.c eingeben und fertig).
Also hab ich mir gcc für WIndows runtergeladen aber das spuckt nur fehlermeldungen aus:
gcc.exe: environment variable DJGPP not defined
kennt jemand nen guten c-Compiler für win?
-wie kann ich die inpout32.dll einfach in mein C-Programm einbinden um dann mit nem einfachen ouportb befehl nen Ausschlag am Messgerät zu erzeugen?
lg
0 Punkte
Beantwortet von
moin
(Wie geil wäre das denn auf nen Knopf zu drücken und das Licht geht an? :) )
Sowas kenn' ich seid meiner frühesten Jugend; wir hatten schon immer Strom und elektrisches Licht mit Schaltern.
-wie kann ich die inpout32.dll einfach in mein C-Programm einbinden um dann mit nem einfachen ouportb befehl nen Ausschlag am Messgerät zu erzeugen?
Das wär doch eine Frage an Deinen offensichtlich inkompetenten Dozenten.
www.google.de/#hl=de&source=hp&q=DJGPP+gcc.exe&aq=f&aqi=&aql=&oq=&fp=183f63fd0af42adf
LG
0 Punkte
Beantwortet von
Puh Danke, den Compiler hab ich jetzt zum Laufen gebracht.
jetzt hab ich mirhier eine Anleitung gesucht, um mein Vorhaben auch praktisch in die Tat umzusetzen( inpout32.dll einbinden und Ports ansteuern) aber irgendwie werde ich aus der Anleitung nicht schlau.
Vielleicht gibts ja hier jemanden dem gerade langweilig ist und der mir nen Beispielcode schreiben würde, um die inpout32.dll einzubinden und am port 768 eine 1 auszugeben?
ich hoff das ist nicht zu viel verlangt.
Danke an alle!
0 Punkte
Beantwortet von Experte (3.2k Punkte)
Also auf der Inpout32.dll-Seite sind doch n paar links mit beispielen.
Dieser hier ist in C geschrieben. Is zwar für den Borland-C++-Compiler, aber die relevanten Zeilen sollten auf jedem Compiler funktionieren.

erst werden mit typedef die Typen der beiden Funktionen definiert.
es werden funktionszeiger angelegt.
dann wird die dll mit loadlibrary geladen.
Per GetProcAddress werden die Einsprungadressen der beiden Funktionen in die zeiger geladen.
Nun kannste die funktionen über die funktionszeiger benutzen.
Am Ende des Programms muss mit FreeLibrary die DLL noch wieder entladen werden.

Ele

ich versuch mal, n kleines beispiel zu schreiben. s dauert mir aber zu lange, das auch noch zu testen...
#include <windows.h> //Für GPA, LL und FL

typedef short (_stdcall *infunc_t)(short addr); //die beiden typedefs
typedef void (_stdcall *outfunc_t)(short addr, short value);

infunc_t input32;
outfunc_t output32;

int main (int argc, char* argv[])
{
HMODULE hIOlib=LoadLibrary("inpout32.dll"); //DLL laden
if(hIOlib==NULL) return -1; //erfolgreich?
input32=GetProcAddress(hIOlib,"Inp32"); //laden
if(input32==NULL) //fehler
{
FreeLibrary(hIOlib);
return -1;
}
output32=GetProcAddress(hIOlib,"Out32");//s.o
if(input32==NULL)
{
FreeLibrary(hIOlib);
return -1;
}

(output32)(0x768,0x01);//1 ausgeben
(output32)(0x768,0xFF);//255 ausgeben, alles an

FreeLibrary(hIOlib); //und library freigeben
}

müsste ungefähr so aussehen
...