PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LPT mit C++ ?



FJK
23.05.2004, 18:03
Hallo

Ich würde gerne mal genau wissen wie ich unter c++ den lpt ansteuern kann, bzw als eingang nutzen könnte
Am besten wäre ein beispiel quelltext mit erklärung
Ausserdem würde ich gerne wissen, wie viele separate stromkreise ich an einer 25 poligen schnittstelle anschliessen kann.

Danke im voraus

Flo

Frank
23.05.2004, 18:07
Schau mal im Download unter Tutoriale. Da findest du einiges zur Druckerschnittstelle. Und such mal den Thread der letzten tage wo es um "Fahrstuhl bzw. Aufzug" ging. Da war auch ein interessanter Link drin wo es eine DLL gab, die speziell für LPT Steuerungen gedacht ist.

FJK
23.05.2004, 20:33
Dank für deine schnelle Antwort

was aber ist ein Threa
und die tutoriale helfen mir auch nicht wirklich weiter vieleicht habe ich auch nicht die richtigen gefunden (habe nichts für c++ gefunden)

wäre dankbar für jede weitere hilfe

Ford
04.06.2004, 19:24
http://www.hut.fi/Misc/Electronics/circuits/parallel_output.html

Das wird dir helfen :)

mfg Ford

qwexx
06.09.2004, 15:46
hallo ,
ich benutze den boarland cpp builder in der sechsten version,auf win2k .
doch komme ich leider nicht mit dem beschriebenen befehlen zurecht.
"outp" & "outportb" fuhrt zu -> Aufruf der undefinierten Funktion 'outp'
kann mir jemand bei meinem Problem helfen ?
oder wie bekomme ich unter win2k den lpt angesprochen ?

danke

qwexx

Blackbird
07.09.2004, 07:19
outp() und inp() (oder auch outport() und inport()) sind NICHT unter WinNT, W2K, WinXP erlaubt (weil 32-Bit-Systeme). Nur unter DOS, W95 und W98 (und WinME) --> 16-Bit-Systeme.

Für die einfache (16-Bit)-Ansteuerung gibt's hier genug: http://www.beyondlogic.org/spp/parallel.htm und
http://www.beyondlogic.org/ecp/ecp.htm

Für 32-Bit-Systeme:
C++ kennt wie auch C keine Ports. Die Ansteuerung der Hardware wird über OS-spezifische Libs erledigt. Unter Windows ist die WinApi Standard (Alternativ MFC, .net). Die Funktionen zur Ansteuerung sind
CreateFile (), WriteFile () ReadFile () und CloseHandle (). Es gibt noch ein paar mehr, aber die findet man in der Hilfe zu jedem C/C++ -Compiler.


Findige Leute haben genau diese Funktionen schon zu einer Lib, einer DLL oder einem Treiber zusammengefaßt. So z.B. auch hier: http://www.b-kainka.de/portnt.htm

Blackbird

NumberFive
07.09.2004, 10:37
Es gibt noch eine andere möglich kein unter 32 Bit systemen wenn ein bisschen geschickt ist kann man mit ein general treiber(source ist im MS ddk) einen eingen treiber schreiben der einem dann wieder die möglichkeit gibt auch unter 32bi direckt wieder ports an zu sprechen.

Ist ein bischen knifflig aber meine erfahrung damit sehr gut den dann kann man windows ein bisschen aus heblen uns ist fast genauso schnell wie unter dos.

Gruß

09.09.2004, 12:44
okay , danke

qwexx

Ford_
17.09.2004, 14:58
jo ok mitlerweile funktioniert schon alles aber trotzdem vielen dank!!!!

08.11.2004, 11:14
wieso bekommt ihr das hin und ich nicht

gibs du mir dein fkt quelltext

guten leitwert flo

gnome
10.11.2004, 21:18
ich benutze den bloodshed dev-c++ 4.0 compiler (http://ftp1.sourceforge.net/dev-cpp/devcpp4.zip) und musste die ausgabebefehle selber scripten.... und zwar mit assembler (at&t syntax)....


void outp(char wert, int adresse){
__asm("MOVW %1, %%dx \n\t"
"MOVB %0, %%al \n\t"
"OUT %%al, %%dx"
:
: "g" (wert), "g" (adresse) );
}

char inp(int adresse){
char wert;
__asm("MOVW %1, %%dx \n\t"
"IN %%dx, %%al \n\t"
"MOVB %%al, %0"
: "=g" (wert)
: "g" (adresse) );
return(wert);
}

sollte eigentlich selbsterklärend sein.... ansonsten nur fragen....

FJK
06.12.2004, 19:36
hallo

danke ich werde es demnachst ausprobieren
hoffendlich klappt es

ich verstehe allerdings nicht genau was da steht
kannst du mir das erklären

motorschaden
12.12.2004, 23:44
hallo

danke ich werde es demnachst ausprobieren
hoffendlich klappt es

ich verstehe allerdings nicht genau was da steht
kannst du mir das erklären

guten leitwert flo

ja eine erklärung wäre super!

Magge2k
29.12.2004, 19:11
Hi Leute,

ich programmiere unter BCB 5 und um den Druckerport unter Win2k anzusteuern benutze ich die inpout32.dll Damit ist das arbeiten sehr einfach man definiert einfach seine Druckerport addresse 0x378 und kann dann sehr schnell auf dieser ausgeben und einlesen.

http://www.logix4u.net/inpout32.htm


gruß Marc

FJK
03.01.2005, 19:28
hallo

danke aber ich programmiere unter win98
da sind lpt´s frei

kannst du sonst weiterhelfen
https://www.roboternetz.de/phpBB2/viewtopic.php?p=50698#50698

Magge2k
04.01.2005, 02:51
Hi Flo,

also, soweit ich weiß ist doch da was falsch?!?!

ache auf das <== weil ich weiß daß der LPT immer aus den drei addressen 0x378 + 0x379 + 0x37A besteht. Du schreibst da aber 0x378 + 0x2 rechnet der das dann schon richtig?

#define LPT1 0x378
.
.
.
int Steuerregister;
Steuerregister = inp(LPT1+0x2); <== Müsste das nich 0x02 heißen?
//Lesen des Steuerregisters
Steuerregister = (Steuerregister|0x01);
//STROBE auf High setzen ( Daten den LPT1 ausgeben lassen )
outp(LPT1+0x2,Steuerregister);
//Schreiben des Modifizierten Steuerregisters
also kann mir jemand den lösungsvorschlag nochmal erklären


ich weiß ja nicht ob ich jetzt kompletten unsin rede!?

gruß Marc

FJK
04.01.2005, 15:45
hallo Marc

0x378 ist doch die adresse vom lpt1
und die 0x2 beneutet doch er soll den 2. pin ansteuern
mit 0x3 soll er den 1. und 2. pin ansteuern oder???


und wo kommt das hin???
bzw muss ich teile meines alten quelltextes ändern/löschen

int Steuerregister;
Steuerregister = inp(LPT1+0x2); <== Müsste das nich 0x02 heißen?
//Lesen des Steuerregisters
Steuerregister = (Steuerregister|0x01);
//STROBE auf High setzen ( Daten den LPT1 ausgeben lassen )
outp(LPT1+0x2,Steuerregister);
//Schreiben des Modifizierten Steuerregisters

Magge2k
06.01.2005, 00:48
hä?

So ich glaube wir haben ein problem!
Darum erst einmal ein kleiner Basiskurs zum Druckerport.

Die parallele Schnittstelle belegt insgesammt drei mal 8-bit-Adressen.
Zuerst die Basisadresse in unserem Fall -> 0x378 dann folgen die 0x379 und 0x37A.

Wobei die Adressen zu folgenden Registern führen:

Data-Register: 0x378
Status-Register: 0x379
Controll-Register: 0x37A

So schon alleine mit diesen Hintergrund informationen kann man doch schon an deinem Quellcode erkennen daß................

int Steuerregister;
Steuerregister = inp(LPT1+0x2);
//Lesen des Steuerregisters

<== Hier wird die adresse 0x378 um 0x2 erhöht und somit erhalten wird die adresse 0x37A. Nun befinden wir uns im Steuerregister (Controllregister) und fragen den aktuellen Status ab. Befehl OK!

Steuerregister = (Steuerregister|0x01);
//STROBE auf High setzen ( Daten den LPT1 ausgeben lassen )
<== Hier wird irgendwas mit dem Ausgelesenen Wert des STeuerregisters gemacht keine ahnung was!

outp(LPT1+0x2,Steuerregister);
//Schreiben des Modifizierten Steuerregisters
<== Hier wird versucht auf das Steuerregister zu schreiben. Ich weiß jetzt auch nicht so genau ob das Status Register Bidirektional Arbeitet oder nicht! D.H. es kann sein es können daten nur gelesen werden.

Da ich aber noch nie etwas mit den "normalen" outp bzw. inp funktionen zu tun hatte, weiß ich aber auch nicht so genau wie diese arbeiten. Nachschauen ist gerade schwer, weil ich erst meinen PC platt gemacht habe.

Bei der von mir verwendeten inpout32.dll von dem oben genannten link musste ich im aber um Daten am Dataregister auszugeben folgenden befehl verwenden.

outp32(0x378, 0xFF)

^ ^ ^
| | |
| | Hier wird das Data-Register (D0-D7) auf 1 gesetzt!
| Angabe der Druckerport Adresse des Daten-Registers
outp32 befehl

Ich weiß ja nicht aber vielleicht ist der aufbau des "normalen" outp befehls ja genau so wie beim outp32.

Naja ich weiß ja nicht ob das gerade weitergeholfen hat.
gruß Marc

FJK
06.01.2005, 16:13
doch danke.

aber das program läuft es ist nur dummer weise eine konsolen anwendung

wenn ich jetzt aber mit edit, button und co arbeiten möchte (nicht in einer konsolen anwendung), was muss ich dann machen

kannst du mir da weiter helfen

ist das outp32(0x378, "Bytezahl") auch für eine konsolen anwendung???

Magge2k
07.01.2005, 00:37
Jup, gut daß ich dir Helfen konnte! ;-)

Ja klar kann man den inp32/outp32 befehl auch in einer konsolen anwendung verwenden. So wird es auch in dem beispiel programm erklärt.

Ich habe mir dann daraus ein kleines Tool erstellt mit dem ich die 8 Datenleitungen über eine grafische oberfläche ansteuern kann erstellt. Dazu kommen ein paar Lauflichteffekte in verschiedenen unter modis!
Bild im anhang!

Da aber die Konsolenprogrammierung ein wenig von der der grafischen Oberfläche abweicht kann man das Programm nicht einfach übernehmen.

Aber hier als beispiel:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Project1.h"

#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <math.h>

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

#define port 0x378
int y;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Timer1->Enabled = true;
Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1(TObject *Sender)
{
if (y == 0) { y = y + 0x01; goto end;}
if (y == 1) { y = y + 0x02; goto end;}
if (y == 3) { y = y + 0x04; goto end;}
if (y == 7) { y = y + 0x08; goto end;}
if (y == 15) { y = y + 0x10; goto end;}
if (y == 31) { y = y + 0x20; goto end;}
if (y == 63) { y = y + 0x40; goto end;}
if (y == 127) { y = y + 0x80; goto end;}
if (y == 255) { y = y - 0x01; goto end;}
if (y == 254) { y = y - 0x02; goto end;}
if (y == 252) { y = y - 0x04; goto end;}
if (y == 248) { y = y - 0x08; goto end;}
if (y == 240) { y = y - 0x10; goto end;}
if (y == 224) { y = y - 0x20; goto end;}
if (y == 192) { y = y - 0x40; goto end;}
if (y == 128) { y = y - 0x80; goto end;}
end:
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer2(TObject *Sender)
{
(oup32)(port, y);
Label1->Caption = "0x" + IntToHex( y, 2);
Label2->Caption = y;
}
//---------------------------------------------------------------------------

Für dieses Beispiel benötigst du einen Button, zwei Timer und zwei Labels. Der Quelltext ist eine vereinfachte form von dem was ich in dem LED Programm verwendet habe.

14.01.2005, 15:48
ich weiß zwar nich ganz was dein Beispiel bewirken soll aber mein Compiler mukkt bei (oup32)(port, y);

Kannst du mir da weiterhelfen?
Und muss
Timer1->Enabled = true;
Timer1->Enabled = true;

nicht
Timer1->Enabled = true;
Timer2->Enabled = true; heißen?

Magge2k
14.01.2005, 18:00
ich weiß zwar nich ganz was dein Beispiel bewirken soll aber mein Compiler mukkt bei (oup32)(port, y);

Kannst du mir da weiterhelfen?
Und muss
Timer1->Enabled = true;
Timer1->Enabled = true;

nicht
Timer1->Enabled = true;
Timer2->Enabled = true; heißen?

JA es muss Timer2->Enabled = true; heißen.
Daß ist ja klar daß der da Mukkt, weil du müsstest diesen Befehl mit deinem outp(port, y) Befehl ersetzen.....

Naja daß programm schaltet nacheinander alle Datenleitungen an.
Wenn alle an sind schaltet er diese wieder aus.

Zwar sinnlos, aber was solls, wenn man LEDs an den LPT anschließt, hat man somit ein "Lauflicht".

greez

20.01.2005, 22:24
dieses oup32 macht probleme kannst du mir sagen was ich noch beachten muss um das ding zu kompilieren?

21.01.2005, 21:52
ok ich habs geschaft
für alle dies interessiert hab ich mal n demo programm mit code für den Borland C++ Builder gezippt und auf meinem Webspace abgelegt

http://home.arcor.de/d.pascal/Programme/inpout32.zip

Magge2k
16.02.2005, 00:04
ich hab mir mal dein Programm heruntergeladen habe nur das problem daß wenn ich des mit dem BCB5 aufmache alle Packege Importe suchen und einzeln auswählen muss, nur habe ich nicht alle?!?!?

Was muss ich da machen?

FJK
16.02.2005, 16:42
hallo

also das liegt glaube ich an einer älteren version
du must die projekt datei mit dem editor öffnen und in einem zweiten fenster eine von deinen projektdateien (irgendeine, ein altes program von dir)
dann musst du die zeilen der packages aus deiner datei kopieren und sie in die neue datei ersetzen.

dann sollte es laufen

klingt etwas komisch, wenn du fragen hast frag

Tasm-Devil
02.04.2005, 17:37
*grins*

ist mein beispiel gut?

FJK
03.04.2005, 17:36
hallo

welches beispiel ???

Siggi83
03.04.2005, 18:07
Hallo FJK,

kann es sein das du dies nicht gefunden hast:

https://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=191

Wäre halt für RS232...

gruss Siggi

FJK
07.05.2005, 20:04
toll witzig ein bischen spät ](*,)

ich habe es nach einen halben jahr nervösen rumprobieren rausbekommen die lösung und mein peinlicher fehler müsten weiter oben stehen
ansonsten schreib ich es gern nochmal

trotzdem danke

mkRE
05.07.2005, 20:01
Hallo kleine Frage und zwar möchte ich ganz einfach über einen Button in C++ mit dem Builder 5 einen Port ausgang ansprechen was muss ich eigentlich bei der Deklaration beachten ich habs satt anfänger zu sein und die oberen aussagen haben mir nur zum Teil geholfen.

mkRE
06.07.2005, 12:59
Hallo habe diesen Treiber von http://www.b-kainka.de/portnt.htm "Inpout32.dll" wie beschrieben (Just copy the Inpout32.dll to "system32" directory and run the program.") in meinen System32 Ordner Kopiert Leider erkennt mein C++ programm es nicht bekomme diese Fehlermeldung
----E2209 include Datei "inpout32.cpp" kann nicht geöffnet werden------

#include <vcl.h>
#pragma hdrstop
#include "inpout32.cpp"
#include "Ulpt.h
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

Habe das im Kopf geschrieben.Benutze den c++ Borland Builder 5

kann mir einer weiterhelfen??

FJK
15.07.2005, 00:18
hallo

wichtig ist das du weißt das man unter win xp nicht mehr so einfach die schnittstellen ansprechen kann, dafür brauchst du einen treiber der dir die schnittstellen öffnet.
unter win 98ist das kein problem

zu den button das ist eigendlich nicht sehr schwer



//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <conio.h>
#define Par_Sst 0x378
#define LPT1 0x378
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//==============================================
void outp (unsigned int portadr, unsigned char value)
{
_asm mov edx,portadr
_asm mov al, value
_asm out dx,al
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
outp(Par_Sst,7);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
outp(Par_Sst,0);
}
//---------------------------------------------------------------------------


So mit dem button1 kannst du die ersten 4 pins auf 1 setzen und mit den button2 kannst du sie wieder auf 0 setzen

outp(Par_Sst,0); bed: alle 0
outp(Par_Sst,1); bed: 1. pin 1
outp(Par_Sst,2); bed: 2. pin 1
outp(Par_Sst,3); bed: 1. und 2. pin 1
outp(Par_Sst,4); bed: 3. pin 1
.
.
.

ich hoffe ich konnte dir weiterhelfen
ich übernehmme aber keine gewehr über den quelltext da ich ihn von meinen anderen pc (ohne lan :( ) abgetippt habe, sollte er nicht funktionieren oder wenn du noch fragen hast kannst du bescheid sagen

mkRE
16.07.2005, 05:51
hi viellen dank für den wirklich hilfreichen Text mir fehlt nur ein geeigneter Treiber den ich so benutzen kann oder ist das der den ich habe?

Gruss und danke :-)

FJK
16.07.2005, 11:09
hallo
schön das ich dir helfen konnte
was für ein betriebssystem benutzt du den
(benutze eigendlich keine treiber, weil ich einen alten rechner zum testen benutze. du kannst nähmlich in schlimsten fall deine hardware kurzschließen)

mkRE
17.07.2005, 12:37
hi ich benutze Windows XP da muss ich einen Treiber benutzen um die Hardware ansprechen zu können hab ich gelesen da alles geblockt wird ohne dieses.

FJK
17.07.2005, 21:19
ja leider

http://www.b-kainka.de/portnt.htm
freeport solltest du runterladen, es ist ein kleines programm was du im hintergrund laufen läst.
hier der direkte link zum download http://www.b-kainka.de/freeport.zip
ich selber habe aber wenig erfahrung mit den problemmen von xp
habe es aber mal selber benutzt

mkRE
18.07.2005, 23:27
hi also ich bin überglücklich!!Es hat alles funktioniert.eine ganz kleine Frage hab ich gibt es eine möglichkeit die pins als eingände einzeln zu benutzen also andere pins vom LPT nicht die ausgangs pins?

mkRE
18.07.2005, 23:47
ich hab zwar auf dieser seite nützliches gefunden,http://www.epanorama.net/circuits/parallel_output.html#windowsprogramming
und denke ich müsste mit inp(Par_Sst,0); arbeiten aber was müsste auf die Position von 0 stehen z.B?

wollte dir auf diesem wege noch einmal für deine mühe danken.

Ich will nehmlich fürs techniker Projekt in einem Halben jahr etwas vernümftiges bauen bzw. erfinden mit meinen Kumpels aber es muss aus ""aus eigener Hand kommen"" und mit deiner Hilfe kann ich dadrauf aufbauen.:-)

FJK
19.07.2005, 11:22
kein problem
wenn du geheime fragen stellen willst (fragen die du nicht ins forum packen willst) kannst ja mailen

zur frage:
dir stehen bei der lpt schnittstelle von 25 pins nur 8pins zu verfügung die du nutzen kannst, die anderen sind zb für den drucker um zu melden "papier lehr" ect.
dh dir stehen die pins
D0 = pin2
D1 = pin3
.
.
.
D7 =pin9
frag jetzt bitte nicht warum sie so heißen

die cods für die ansteuerung werden im dualzahl system übergeben
dh
1 2 4 8 16 32 usw
um jetzt pin 0 (D2) anzusteuern muss du die adresse 1 übergeben
out(Par_Sst,1);

um jetzt pin 1 (D3) anzusteuern muss du die adresse 2 übergeben
out(Par_Sst,2);

um jetzt pin 2 (D4) anzusteuern muss du die adresse 4 übergeben
out(Par_Sst,4);

um jetzt pin 3 (D5) anzusteuern muss du die adresse 8 übergeben
out(Par_Sst,8);

usw

willst du aber pin 0 (D2) und pin 1 (D3) ansteuern dann musst du die adresse 3 übergeben, weil die 3 aus 1 und 2 zusammengestzt wird
out(Par_Sst,3)

ich hoffe das hilft dir
wenn ich falsch liege dann korigiert mich bitte

mkRE
19.07.2005, 15:27
spitze viellen dank auf das mit dem Dualen system wehre ich jetzt nicht gekommen aber ist ja logisch einbißchen nachdenken werde ich jetzt wohl selber müssen bei der erstellung meines programms ich will versuchen wenigstens das selber machen zu können :-).

Ich habe vielleicht meine vorherige frage schlecht gestellt wollte eigentlich wissen wie ich signale z.B Schalter stellungen einlesen kann ob inp funktinieren würde?wenn Drucker signale eingelesen werden können wie dein beispiel mit dem leeren Papier müsste sowas doch auch gehen?

mkRE
26.07.2005, 06:59
Hi es klappt alles super leider komm ich nicht weiter mit Signalen lesen ich weiss nicht genau was ich da für den Status Register(die dazugehörigen Pins) definiren muss ion der Kopfzeile. define LPT1 0x379 wehre richtig oder?dann weiss ich aber nicht was noch alles dazu geschrieben werden muss.
Ich will halt nur Schalter Stellungen lesen können.

FJK
26.07.2005, 11:25
hallo

0x379 müsste bei dir richtig sein, wenn das ausgeben funktioniert hat.

mit den einlesen muss ich mal sehen mein rechner ist abgeschmiert und ich komme nicht mehr ins windows

mkRE
26.07.2005, 23:32
Hi ich hab das heute ausprobiert mit dem Beispiel was du mir vorher mit den Ausgängen ansteuern geschrieben hast.hab das etwas umgeändert leider hatte ich nur ein haufen fehlermeldungen.
Ich hoffe dein rechner läuft bald wieder :-).

Soweit habe ich meine Motoren wie gewünscht zum laufen gebracht dank deiner Hilfe.

FJK
27.07.2005, 19:05
hallo

zeig dein quelltext mal und sag uns bitte mal was du plans

mkRE
28.07.2005, 08:53
Hi das ist mein Probe Quelltext:"Über einen Schalter wollte ich den Pegel mit 5 V auf High setzen".

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <conio.h>
#define Par_Sst 0x378
#define Par_Sst 0x379
#define LPT1 0x378
#define LPT1 0x379
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

TForm1 *Form1;

bool StatusWert=inp(Par_Sst,1);
//==============================================
void outp (unsigned int portadr, unsigned char value)
{
_asm mov edx,portadr
_asm mov al, value
_asm out dx,al
}
void inp (unsigned int portadr,unsigned char value)
{
_asm mov edx,portadr
_asm mov al,value
_asm in dx,al
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{

}

//Falls Eingang in Status Register gesetzt -> Button Farbe "rot"

void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(StatusWert==true)
{
Button1->Color=clRed;
}
}

Im Großen und ganzen möchte ich Später die Position meines Motors feststellen können um evtl. eine referezfahrt bzw. Nullstellung meines Motors über einen Button Klick zu steuern.
Elektronik dafür habe ich schon im Kopf :-).

FJK
28.07.2005, 15:01
hallo

also, auf den erten blick sind da einige fehler drin

also du musst erstmal alles einmal definieren
und die inp zeilen müssten so aussehen:

usigned char inp (unsigned int portadr)
{
_asm mov edx,portadr
_asm in al,dx
_asm mov value, al
return (value);
}

so

wenn du jetzt das den "status wert" abfragen willst
muss du die gesammte reihe abfragen: //ich hatte auch erst den gedanken den du hattest , wenn es dich tröstet (bool StatusWert=inp(Par_Sst,1);)


int status;
status=inp(0x378);

so nun haben wir alle pins eingelesen (D0 bis D8)
und nun fragen wir ob d0 = "true" ist

if (status == 1)
{
edt_status->Text="online"; //editfeld
}
else
{
edt_status->Text="offline"; //editfeld
}

ich habe dir ein program geschrieben was dir entweder online oder offline in ein edit feld schreibt, bezug auf den ersten pin



#include <vcl.h>
#pragma hdstop
#include <conio.h>
#define LPT 0x378
#include "Unit1.h"
//------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

unsigned char inp(unsigned int portadr)
{
unsigned char value;
_asm mov edx, portadr
_asm in al,dx
_asm mov value al
return (value);
}

//-------------------------------------------------------
__fascall TForm1::TForm(TComponent* Owner)
: TForm(Owner)
{
}
//-------------------------------------------------------
void__fascall TForm1::btn_StatusfrageClick(TObject *Sender)
{
int status;
status = inp(0x378);

if(status == 1)
{
edt_status->Text="online";
}
else
{
edt_status->Text="offline";
}
}
//----------------------------------------------------------



so ich habe in wieder abgetippt und hoffe das es funktioniert, bitte um bestätigung.
ich über nehmme keinerlei gewehr :()

nochwas das mit dem papier hast du glaube ich nicht ganz verstanden:
die papier "anzeige" ist nich programmierbar (aufjedenfall meine ich das)
dir stehen nur die D0-D8 zur verfügung die anderen pins sind feste nicht "verstellbare" pins. ich hoffe du hast mein kauderwälsch verstanden

mein rechner läuft wieder habe ihn einfach mal ohne festplatten gestartet und dann wieder mit, seitdem läuft er und der komische update fehler ist verschwunden, keine ahnung woran das lag

mkRE
28.07.2005, 19:05
Hi werde gleich versuchen zu Programmieren :-).

du hast im text geschrieben 0x378 das ist doch für die Ausgänge nicht wahr?
kann ich das ganze auch im bezug auf die eingang pins 0x379 oder 0x37A?
und kann ich auch einzelne Pins von 0x379 oder 0x37A einlesen?
Wenn ich z.B einen Taster betätige.

oder meintest du sogar 0x379 im Quelltext?

ich hab hier so einen Link da hab ich diese bezeichnungen vom Stecker her
http://www.feilner.de/dateien/referate/parallel/parallelport.pdf


mein rechner macht manchmal auch was der will aber oft mals reicht es aus vor das gehäuse zu treten ;-) "ohne gewährleistung das es bei jedem so funktioniert"

mkRE
29.07.2005, 01:21
hi habe das Programm abgetippt und bekam eine mir nicht bekannte fehlermeldung.als erstes hat sich ein zweites fenster geöffnet mit dem namen Unit1.asm in diesem fenster ist das Programm stehen geblieben beim Compilieren.
Fehlermeldung:[TasmFehler]Unit1.asm(51):Too few operands to instruction

der Fehler wahr auch dem der Hilfe unbekannt ?:-(.

Zu der Frage oben:und zwar steht in dem Link das das Data Register entweder als Ausgang oder Eingang verarbeitet werden kann beides zusammen geht nicht.
Gibt es keine möglichkeit den Status oder Control Register als Eingang Register zu benutzen um Schalterstellungen einzulesen?

[-o<

Ich habe das zwar mit achtung verstanden was du meintest mit dem Papier Beispiel aber im Link steht das es sich bei den registern um Eingänge bzw. Ausgänge Handel.Oder hat das nur mit dem Drucker zu tun?

FJK
15.08.2005, 21:37
hallo

habe jezt mal geschaft bites zu empfangen, aber ich verstehe die "pin belegung" nicht

also

ich habe mir ein programm geschrieben mit 3 edit feldern
und mit inp(0x378); inp (0x379); inp(0x37a);
die durch ein timer alle paar msec eingelesen werden, mit einen button setze ich mit out(0x378,0); out(0x379,0); out(0x37a,0); alle pins auf 0.
mein plan war der das ich mit einen draht an den pins rumbore und dann sehe ob was geschied O:) so am anfang habe ich noch ein netzteil mit 5v und einen vorwiederstand von 500ohm benutst, aber dann habe ich gesehen das man nur pins verbinden muss so ergibt zum beispiel von inp(0x37a); 1 bite wenn man pin 1 und einen der masse pins verbindet
man erhält 2 bite wenn man pin 14 und einen der masse pins verbindet
wenn man pin 1 und 14 mit masse verbindet bekommt man 3 bite
8 bite gibt es auch aber keinen "4 bite pin" :-s

mit inp(0x379); merkwürdiger weise kann man den ausgansgswert nicht mit outp(0x379,0); auf 0 setzen, also ist das ausgangsignal immer 120, wenn man dann einige pins mit masse verbindet geht der wert entweder runter oder hoch

inp(0x378); sagt nix aber das sind ja auch die daten leitungen die anscheinend nur als eingang nutsbar sind 8-[




//-----------------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <conio.h>
#define LPT 0x378
#include "Unit1.h"
//-----------------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1*Form1;

//==============================================
void outp (unsigned int portadr, unsigned char value)
{
_asm mov edx,portadr
_asm mov al, value
_asm out dx,al
}
//==============================================
unsigned char inp(unsigned int portadr)
{
unsigned char value;
_asm mov edx,portadr
_asm in al,dx
_asm mov value,al
return(value);
}
//-----------------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
::TForm(Owner)
{
}
//-----------------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObjekt *Sender)
{
outp(0x378,0);
outp(0x379,0);
outp(0x37a,0);
}
//-----------------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
int status, status1, status2;

status=inp(0x37a);
Edit1->Text=IntToStr(Status);

status1=inp(0x378);
Edit2->Text=IntToStr(Status1);

status2=inp(0x379);
Edit3->Text=IntToStr(Status2);
}
//-----------------------------------------------------------------------------------


ich übernehme keine haftung für den quelltext, wenn hardware oder sonstigen schäden entstehen

kann mir jemand erklären wieso es sokomische "pin brücken" gibt und wo der "4 bite pin" von der controll-register steckt?

wenn du nicht ca 15 taster einbauen willst, können wir damit was anfangen

Edit:
so sorry habe die beiträge und den link noch nicht gelesen, also der "4 bit pin" (ich sollte mir diesen begriff patentieren lassen) ist anscheinend der nicht invertierte
und die 120 in der status anzeige von dem status register könnte auch von dem invertierten pin kommen, aber es müssten doch dann eigendlich 128 stehen oder?
ahm zu den fehler, der wird woll an den asm befehlen liegen, hast du conio.h include, auch wenn er nichts mit den asm befehlen zu tun hat?

crowdy
25.10.2005, 20:10
Hi dschungs!
Also ich wollte um mich an diese LPT Schnittstellenproblematik erstmal ran zu tasten einfach nur alle Datenpins auf "high" setzten und nach ein paar Sekunden wieder auf "low". Aber an der Schnittstelle kann ich an den jeweiligen Pins nichts nennenswertes messen. Laufen tut mein Programm auf einem alten Notebook das mit Win95 läuft und kompiliert wurde es mit Bloodshed. Wäre Klasse wenn ihr euch den Quelltext mal anschaut!!

#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#include <dos.h>

int main(int i)
{
for(i=1;i<=10;i++)
{
_outp(0x3BC,0xFF);
printf("D0..D7=1\n");

wait(10);

_outp(0x3BC,0xFF);
printf("D0...D7=0\n");

wait(10);
}
}

wait(int sekunden)
{
clock_t start;
sekunden *= CLOCKS_PER_SEC;
start = clock();
while(clock()<start+sekunden);
}

Na? Wie schaut's aus? Kann man die Ports so ansprechen, denn bei diesem Link (http://www.epanorama.net/circuits/parallel_output.html#doscontrol)
hab ich die Sache mit dem direkt ansprechen nicht so ganz verstanden. Muss ich auch unter Win95 noch irgendwelche DLL's, von denen ich leider gar keine Ahnung habe includen?

Ich würde mich sehr sehr doll über eine Antwort freuen.

Bis denn!

FJK
26.10.2005, 12:25
hallo

habe leider grade keine zeit um es mir genau anzusehen, hier sind aber bestimmt welche die dir besser helfen können...

kann sein das dein compiler mit der funktion _outp() nichts anfangen kann, schreibe über main:



//==============================================
void _outp (unsigned int portadr, unsigned char value)
{
_asm mov edx,portadr
_asm mov al, value
_asm out dx,al
}
//==============================================


das ist ein asm befehl, der den ouzput befehl schreibt (schreibt ist das falsche wort 8-[ )

außerdem solltest du festlegen was eine lpt schnittstelle ist und welche, einfach unter den include: #define LPT 0x378 schreiben


ist das, das gesamte programm? du musst glaube ich void main (void) schreiben, du ja nix an main übergibs und keinen integer als rückgabewert hast, aber ich kenne mich mit konsolenanwendungen nicht so aus.

crowdy
28.10.2005, 11:48
jo vielen dank für die Antwort flo!
Aber irgendwie hilft mir das nicht weiter, was bedeutet dieser asm Befehl?
Die _outp Funktion kennt mein Compiler aber dafür den _asm Befehl nicht.
Und eigentlich ist es doch auch egal ob man die Addresse direkt in die Funktion schreibt oder ob man das vorher definiert.

FJK
28.10.2005, 12:14
hallo

der asm befehl (asembler) ist der "treiber" damit der kompiler weiß was der outp befehl soll

bekommst du eine fehler meldung?



#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#include <dos.h>
#define LPT 0x378

//==============================================
void outp (unsigned int portadr, unsigned char value)
{
_asm mov edx,portadr
_asm mov al, value
_asm out dx,al
}
//==============================================


int main(int i)
{
for(i=1;i<=10;i++)
{
outp(0x378,256);
printf("D0..D7=1\n");

wait(10);

outp(0x378,256);
printf("D0...D7=0\n");

wait(10);
}
}

wait(int sekunden)
{
clock_t start;
sekunden *= CLOCKS_PER_SEC;
start = clock();
while(clock()<start+sekunden);
}


du must ihn oben definieren mit #define LPT 0x378
den die lptschnittstele hat 3 register das statusregister, das steuerregister und die datenleitung. mit #define LPT 0x378 sagst du in das er die schnittstelle 0x378 benutzen soll, wenn du noch andere hast gibst noch andere andressen.
im outp befehl sagst du ihn dann welches register er benutzen soll
outp(0x378,0);
outp(0x379,0);
outp(0x37a,0);
hier werden alle 3 auf null gesetzt

pass aber auf dein motherbord auf, wenn du da was anschließt

crowdy
28.10.2005, 16:09
Vielen Dank für die schnelle Antwort!
Es funktioniert jetzt, aber das lag nicht am Programm sondern daran das ich im Internet die Pinbelegung nachgeschaut habe und diese ist bei meinem Stecker irgendwie anders, deshalb habe ich immer an den falschen Pins gemessen!

FJK
29.10.2005, 09:20
kann ja jedem mal passiere, ich habe immer eine konsolenanwendug geschrieben und sie in einer form ausgegeben 8-[

crowdy
12.11.2005, 17:49
Hiho
da bin ich mal wieder!
Hab' ein Problem mit den Eingängen Error, Select und PapperOut und zwar wollte ich diese Eingänge zweckentfremden, damit ich D0 bis D7 nicht immer auf input() umschalten muss. Ich habe parallel zu diesen Eingängen LED's geschaltet, um das besser zu kontrollieren und verstehen zu können. Nun ist es aber so das bei den Eingängen im gewöhnlichen Zustand nicht GND anliegt sondern dass da noch ein bisschen Spannung drauf ist (Wieviel weiss ich nicht, kann nur sehen das die LED's recht hell leuchten).
Nur wenn ich den Eingang direkt an GND schliesse erlischt das LED (is ja auch logisch).
Nun hab ich mit dem NE555 ein Rechtecksignal von 1Hz an die LPT Schnittstelle geschlossen und der PC kann keinen Takt erkennen weil der Eingang immer auf high ist.
Was muss ich tun damit die Eingänge die Signale richtig erkennen?
Muss ich eventuell auf invertierte Eingänge zurückgreifen oder vielleicht irgendwir den Port über einen Widerstand mit GND verbinden?
](*,) hoffentlich könnt ihr mir helfen

crowdy
12.11.2005, 18:15
Hab auch gerade gemerkt das ich das gleiche Problem bei D0 bis D7 habe!!

FJK
13.11.2005, 11:11
ahm

ich weiß nicht ob ich dich richtig verstanden habe, aber

wenn du ein 1Hz signal einlesen willst dann, musst du mindestens 1 mal pro sekunde den pin einlesesn, eigendlich klar ne

so ich weiß jetzt nicht wie du die signale einliest, wenn du es zb mit einem button machst, wird das status register nur einmal eingelesen und zwar beim drücken, deswegen solltest du einen timer benutzen, der mindestens eine frequenz von 1 hz hat

v29a
07.01.2006, 17:33
also da das alle ja jetzt bei euch allen scheinbar funktioniert frag ich hier einfach mal rein (bin über zig links in diesem thread gelandet, scheint ja vom kenntnissstand am weitesten zu sein hier)

ich versuche mit vc++ unter winxp über die Inpout32.dll meinen parallel port anzusteuern leider ohne erfolg. das code beispiel am ende dieser seite (http://www.logix4u.net/parallelport1.htm) lässt sich ohne fehler kompilieren verursacht aber einen laufzeitfehler (bei dem ich den verdacht hab das es genau der hier (http://www.logix4u.net/inpout32.htm -> ganz oben) ist.

so, jetzt ihr ;)

danke schonmal für alle antworten.

FJK
08.01.2006, 11:41
hallo

ich weiß zwar nicht was ein zig ling ist, aber herzlich wilkommen hier

ähm mit vc++ kenne ich mich leider nicht so aus, aber du brauchst unter xp (eigendlich schon ab me) eine "genemigung" um auf die ports zuzugreifen, win xp gestattet es dir nicht ohne weiteres. weiter oben findest du einige links mit treibern die dir die ports öffnensollten. aber du solltest auch vorsichtig sein denn eine kleine falsche verdrattung und du zerschiest dir dein mainboard.

v29a
08.01.2006, 12:04
ok habs mittlerweile geschafft, allerdings mit einem anderen programm (google: lpt vc++)

danke trotzdem

FJK
09.01.2006, 19:10
vieleicht könntest du deine lösung nochmal posten, dann haben wir alles mit c++ und lpt auf einem platz

v29a
13.01.2006, 21:34
der link ist auf der seite in der sig zu finden ... oder eben wie beschrieben der erste google treffer mit den suchworten