C++ und Parallele -> Probs

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/c_und_parallele_gt_probs_76742/page_1 - zur Vollversion wechseln!


chaze schrieb am 28.04.2003 um 20:47

Also ich habe ein Prob. mit meinem Programm in C++, und zwar wenn ich ein Signal an die Datenleitung anlege, dann wird dieses nicht im Register erkannt und wird daher auch nicht mittels inp(); ausgelesen, ich habe dazu ein 5V Netzteil verwendet und die Masse natürlich auf einen der vielen Massepins gelegt und die 5V Potenzial auf eine Datenleitung, wenn ich jetzt data=inp(0x378) abfrage bekomme ich nur data = 0 heraus. Wenn ich jedoch mit outp(); eine Datenleitung setze, und dann mittels inp(); die Leitungen abfrage dann ist das wird data = 1; , das heist ich kann kein signal von aussen einlesen nur eines das mittels outp(); an die schnittstelle gelegt wird, aber nicht mit einem netzteil!

Mache ich da irgendwas falsch, oder was ist da los, müsste doch gehen, oder?
:confused: :bash: :confused:


atrox schrieb am 29.04.2003 um 03:05

vermutlich ist dein par.port im SPP mode (das einizige das überrall sicher funktioniert) -> dh. datenleitungen default nur output. eingelesen werden kann nur über die handshake-signale die als INPUT spezifiziert sind (also zb nAck, Busy, Select, usw...)

es kann sogar gefährlich sein, wenn du versuchst ein externes signal an einen datenpin anzulegen, weil deine 5v quelle dann evt. gegen den ausgangstreiber arbeitet, und dieser ist nur begrenzt belastbar und kann dadurch zerstört werden.

_manche_ SPP ports sind auch bidirektional, aber bevor man ein externes signal anlegt, muß man den ausgangstreiber deaktivieren. das geht, in dem man bit5 im control-register (baseport+2) setzt.

siehe http://www.beyondlogic.org/spp/parallel.htm#5 (aus der tutorial-sammlung im forum)


chaze schrieb am 29.04.2003 um 16:34

das heißt ich muss outp(0x37A,32); machen bevor ich über die Statusleitungen einlesen kann, oder ??


mein programm sieht so aus:

#include <dos.h>
#include <conio.h>
#include <stdio.h>
#include <iostream.h>

char GetLPTInput (int intPort)
{
// Hiermit können die 5 Bits der LPT Schnittstelle (PIN 11, 10, 12, 13, 15) gelesen werden:
// Wobeo PIN 10 für das Auslösen eines Interrupts zuständig ist!!
char ReturnValue;
intPort++;
ReturnValue = inp(intPort);
return (ReturnValue);
}

void SetLPTOutput (int intPort, char bytValue)
{
// Hiermit können maximal 8 Ausgänge (PIN 2-9) gesetzt werden:
outp(intPort, bytValue);
}




void main ()
{
clrscr();
int x;
// EInstellungen des LPT Ports:
int LPTPort = 0x378; // PORT Adresse des gewünschten LPT Ports (hier LPT1)
int LPTInt = 7; // Die Interruptnummer die dieser auslöst (hier LPT1 Standard IRQ)

// Variablen für die Zähler:
int Counter1;
int Counter2;

// Das Programm soll endlos laufen:
while (1==1)
{

// Warten bis PIN11 (Busy) gesetzt ist:
printf ("Programm wartet auf PIN11...\n");
while (GetLPTInput(LPTPort) & 128 == 0)
{
// hier kann nochmals eine Abbruchbedingung gemacht werden
}

printf ("Programm startet:\n");
Counter1=0;
Counter2=0;


// Schleife bis einer der beiden Counter 10 erreicht hat:
while ((Counter1<10)||(Counter2<10))
{
// Aktuelle Zähler ausgeben:
printf ("Counter1=%i\n",Counter1);
printf ("Counter2=%i\n",Counter2);

// Warten bis PIN 12 (Paper Empty) oder PIN 13 (Select) gesetzt
// ist und dann den entsprechenden Zähler hochzählen:
while (GetLPTInput(LPTPort)&48==0)
{
// solange diese Schleife läuft, liegt kein
// Signal an PIN12 oder PIN13 an.
}

// Hier angekommen ist PIN 12 oder 13 gesetzt:
if (GetLPTInput(LPTPort)&32==32)
{
// Signal an PIN12 liegt an:
Counter1++;
}

if (GetLPTInput(LPTPort)&16==16)
{
// Signal an PIN13 liegt an:
Counter2++;
}

// Nun warten bis das Signal wieder abfällt da sonst die
// Zähler ständig erhöht werden solange das Signal anliegt
while (GetLPTInput(LPTPort)&48>0)
{
// solange diese Schleife läuft, liegt ein
// Signal an PIN12 oder PIN13 an.
}

}

// Warten bis PIN11 (Busy) NICHT mehr gesetzt ist:
printf ("Programm wartet darauf dass PIN11 zurückgesetzt wird...\n");
while (GetLPTInput(LPTPort) & 128 == 128)
{
// hier kann nochmals eine Abbruchbedingung gemacht werden
}

// Nun das Programm von vorne beginnen lassen:

}

}

Könnte dasmal jemand durchsehen, oba alles stimmt ?

Irgendwie versteh ich das mit dem Interrup nicht, was hat es damit aufsich!

Also diesen ganzen teil verstehe ich nicht:

char GetLPTInput (int intPort)
{
// Hiermit können die 5 Bits der LPT Schnittstelle (PIN 11, 10, 12, 13, 15) gelesen werden:
// Wobeo PIN 10 für das Auslösen eines Interrupts zuständig ist!!
char ReturnValue;
intPort++;
ReturnValue = inp(intPort);
return (ReturnValue);
}

inp(intPort) hat da ja gar keinen wert, müsste ich da nicht davor noch intPort = 0x379; machen ??

Hoffe mir kann jemand helfen müsste das Programm dringend zum laufen bringen!

Danke im Voraus!


MfG


chaze schrieb am 29.04.2003 um 16:54

aja , an den Statusleitungen
also allen 4

Busy
Select
Acknow
Paper out

Liegt immer ein Signal wenn ich mit win 98 arbeite also sie sind alle gesetzt, das ist doch auch nicht normal, ich muss da doch ein Signal anlegen können jedoch liegen da schon an allen leitungen signale an, also kann ich nichts anlegen, im BIOS arbeiteich mit dem SPP Mode , das stimmt!

Was muss ich machen?


atrox schrieb am 29.04.2003 um 21:42

bit5 @ ctrl-register ist für die 8 datenleitungen zuständig. (auf meinem dos-test-pc (486) funktioniert es aber nicht)
die statusleitungen sollten eigentlich immer input sein. bei mir ist auf busy, paperout und select aber offenbar ein schwacher pullup (79-100µA) auf seiten des PCs.


atrox schrieb am 05.05.2003 um 13:12

.. und wie hast du es gelöst ?




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2024