-
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?
-
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.
-
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
-
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.
-
hallo
zeig dein quelltext mal und sag uns bitte mal was du plans
-
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 :-).
-
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
Code:
#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
-
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/refera...rallelport.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"
-
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?
-
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-[
Code:
//-----------------------------------------------------------------------------------
#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?
-
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!!
Code:
#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/pa...ml#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!
-
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:
Code:
//==============================================
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.
-
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.
-
hallo
der asm befehl (asembler) ist der "treiber" damit der kompiler weiß was der outp befehl soll
bekommst du eine fehler meldung?
Code:
#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
-
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!
-
kann ja jedem mal passiere, ich habe immer eine konsolenanwendug geschrieben und sie in einer form ausgegeben 8-[
-
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
-
Hab auch gerade gemerkt das ich das gleiche Problem bei D0 bis D7 habe!!
-
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
-
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.
-
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.
-
ok habs mittlerweile geschafft, allerdings mit einem anderen programm (google: lpt vc++)
danke trotzdem
-
vieleicht könntest du deine lösung nochmal posten, dann haben wir alles mit c++ und lpt auf einem platz
-
der link ist auf der seite in der sig zu finden ... oder eben wie beschrieben der erste google treffer mit den suchworten