Hallo,

Het is mij en een kennis vandaag gelukt de Paralelle Interface van deze site te maken. Ik heb mij ook verdiept in het programeren van deze poort. Mijn kennis doet dan onder DOS met QBASIC, dat gaat perfect.

Maar wij willen natuurlijk niet altijd in DOS zitten en gebruiken ook Windows XP. En het probleem is dus dat hij onder WinXP met QBASIC niet rechtstreeks de poorten kan benaderen en ik kan het zelfde niet met C++ (dat gebruik ik dus) omdat XP dat niet hebben wil.

Ik heb al wel een driver gezien, ik weet zo niet meer welke, maar die had een aantal C++ functie's. Nou is dat voor mij op zich prima. Maar voor mijn kennis dus niet. Is er een driver die ik voor zowel QBASIC als C++ kan gebruiken onder Windows XP? Zo nee, wat is dan het beste alternatief en welke driver kan ik het beste gebruiken als ik Windows XP(C++) en/of Windows XP (QBASIC) gebruik.

Bedankt alvast,

Marcel.

Is dat de driver? Of bedoel je het programma portport? Daar kan ik wel mee testen maar die doet verder lang niet wat ik met mijn poort wil doen. En ik wil zelf een programma schrijven in C++ en die kennis is QBASIC.

met parport kun je je paralellepoort vrijgeven voor lees/schrijven onder WINDHOOS XP/ed.
WINDHOOS XP zet nl de poorten dicht voor niet windows toepassingen als beveiliging daardoor kun je met q-basic ed niet direct lezen en schrijven naar die poort

even voor de duidelijkheid parport is hier op de site te downen

Onder QBASIC werkt alles perfect. Maar met C++ wil het maar niet lukken. Ik heb wel een functie gezien op het net maar die is voor Visual C++ en ik werk met Borland C++ Builder. Is hier misschien iemand die het wel gelukt is om met C++ de LPT poort aan te sturen? Ik denk dat het is assembly moet maar daar heb ik geen kaas van gegeten.

Om onder XP de printerpoort te kunnen benaderen gebruik ik porttalk, werkt prima. Nu de C++ code nog dus.

De code in ms vc++ = toch het zelfde als de code in Borland builder c++ namelijk allebei volgens de ansi standaard, of niet soms?

zelf heb ik userport, werkt (ook) perfect! 1 keer instellen en voor altijd toegang tot de poorten die jij opgeeft.

mvg,

Martijn

Op 23 november 2002 18:20:47 schreef testuser0001:
...Ik denk dat het is assembly moet maar daar heb ik geen kaas van gegeten.
...

In assembler kun je de poort zo aansturen. (ik weet wel niet als dit lukt onder XP. Heb ik zelf nog niet geprobeerd)
Deze assembler code kan je zo in C++ invoegen:

void stuurNaarPoort(BYTE stuurUit)
{
_asm
{
mov al,[BYTE stuuruit]
mov dx,0378h
out dx,al
}
}

dit is een methode die een byte uitstuurt op poort 0x378 (printerpoort)
De uit te sturen byte geef je mee met de methode(in hex code)

Nee VC++ is niet compatible met BC++. ANSI/ISO C++ is universeel maar veel funcites en headers zijn OS/Compiler specifiek.

Uiteindelijk moest de ASM code zo:

void stuurNaarPoort(BYTE stuurUit)
{
_asm
{
mov al,stuurUit;
mov dx,0378h;
out dx,al;
}
}
Dus ; geplaatst en nog wat kleine dingetjes, maar het werkt prima! Invoer is trouwens decimaal.

Enorm bedankt voor de code, ik was er de hele week al naar op zoek.

Ik zal ook eens kijken naar userport trouwens, eveneens bedankt.

Gr.

Marcel.

En wat is dan de ASM code voor input op de LPT? Ik zit me rot te zoeken en kan het met google niet vinden. Ik gebruik vast de verkeerde zoekwoorden :-(

Maar misschien dat iemand het hier wil posten.

Groeten,

Marcel.

Om te lezen van de parallelle poort (asm):


mov dx,0379h     ;0378h+1=037[b]9[/b]h(StatusPort S3-S7 
                 ;5LS TTL inputs)
                 ;baseadress+1
in al,dx         ;

edit:vet

Bedankt! Nu krijg ik een waarde terug, 120, als ik ACK verbind krijg ik 88 terug of 56, dat weet ik niet meer. Is dat trouwens HEX of DEC? Want ik kan de getallen niet plaatsen. Bij output snap ik het wel, maar bij input is het nog onduidelijk.

Hoe gebruik je deze code?
in C++ of in een *.asm file.

in assembler krijg je een hex waarde terug. Zet dit om in binair om te zien welke pin actief is.

in c++ krijg je een decimale waarde terug, maar pas dan de code aan: ipv al zet dan BYTE inTake of zoiets.


BYTE inTake;
mov dx,0379h;
in inTake,dx;

Let wel op: er zijn geïnverteerde ingangen pin naar massa, maar de bit staat dan hoog in het statusregister.

Dit heb ik gebruikt, idd, C++:

int leesPoort(){
mov dx,0379h
in al,dx
}

----

int x;
x = leesPoort();

en een: "cout << x" levert 120 op.
Kan ik het ook op deze manier doen? En dit Dec. getal dan omzetten naar binair.

Dan krijg ik vast een byte terug en kan ik zien bijv: 11011000, zomaar een voorbeeld. Dus de eerste 5 v/d 8 zijn de input poorten?

idd de 5hoogste bits zijn de inputs:


_________________
|7|6|5|4|3|2|1|0|
 | | | | | not used
 | | | | |
 | | | | +-> 1=I/O error (inv C3+; Error pin low
 | | | +---> 1=selected  (C4+    ; SelectIn pin high 
 | | +-----> 1=paper out (C5+    ;            "  "
 | +-------> 1=ack       (inv C6+; ack pin low
 +---------> 1=not busy  (C7-    ; Busy pin low

bovenste 5bits van belang.

Maar moet daar geen return opdracht staan in je routine leespoort()????

Ja, klopt, en de ASM code moet tussen asm{...} staan.

Dus standaard zou de LPT poort moeten staan op
bin 10010000 / dec 144.

Bij de PC waar ik nu even achter zit, zit geen apparaat op de LPT aangesloten maar toch lees ik 127(dec) / 1111111 (bin) uit, dat vind ik wel gek.

Mensen ik ben ook bezig met deze paralelle poort interface!Maar dan om discolampen te sturen.(aan/uit)! Maar bestaan er ook transistors die 220 V wisselstroom aankunnen!
O ja en hoe moet ik de transistors aansluiten op de SUB-D connector male 25-polig? Ik bedoel op welk pinnentje moet ik ze solderen??

Help me ff want ik wil verder!!

Mc W

Op 5 december 2002 01:14:07 schreef testuser0001:
Ja, klopt, en de ASM code moet tussen asm{...} staan.

Dus standaard zou de LPT poort moeten staan op
bin 10010000 / dec 144.

Bij de PC waar ik nu even achter zit, zit geen apparaat op de LPT aangesloten maar toch lees ik 127(dec) / 1111111 (bin) uit, dat vind ik wel gek.

Dit is wel normaal, hoor.
Standaard staat de parallelle poort geconfigureerd als ingang.
Daarbovenop komt nog dat de parallelle poort TTL-compatibel is.
En een TTL-input die open hangt, is ALTIJD 1.

Meet eens met een multimeter op pen 2 (= D0) en 18 (= GND):
hier zal je dan wel 5V meten (hoog signaal).