Visual Basic en de Printerpoort

Gepost door Jeroen Boere op woensdag 8 september 2004 20:15

Inleiding

Dit artikel is ingestuurd & geschreven door Professor-botje

Waarom?

Waarom heb ik het in mijn hoofd gehaald om dit te schrijven?
Nou dat is zeer snel te leren als je ziet hoeveel vragen, en steeds weer, de zelfde vragen komen over de printerpoort.
Wat hier staat is alleen wat ik weet en wat ik heb kunnen vinden op internet. aanvullingen aanpassingen mogen ten
alle tijden naar mij geE-mailt worden op Prof.Botje @ Home.nl (spaties weghalen rond de '@')

Wat is de Printerpoort?

De printerpoort is dus een paralelle poort. Wat wil zeggen dat deze een reeks bitjes tegelijk/paralel kan zenden. Deze
komt nog van de goede oude x86 tijd waarin Intel en AMD even als IBM zo goed als samen werkte :) We praten dan
over eind jaren 80 ( 1988/89 ) Even als de Com poort die ook nog uit die tijd stamt maar daar over komt ook nog wel
ooit een verhaaltje.

De aansluitingen

Als we het over de aansluitingen hebben, hebben we het altijd over de aansluiting op de computer dus niet over de kabel.
Hier onder zie je 2 plaatjes die dit duidelijk moeten maken. Het eerste plaatje Fig.1 stelt de aansluiting voor die je achter 
op de computer kast kan vinden. Plaatje Fig.2 stelt de aansluiting voor die aan de kabel zit die vervolgens weer naar bv
de printer gaat;

Fig.1 Fig.2

Het volgende plaatje is gebaseerd op Fig.1 en stelt de pin out voor:

De tabel die je hier onder ziet is een weergave van wat welke pin voor functie heeft en evt. de extra functies.

Pin
Signaal lijn
Richting
Uitgangs-bit
Invert
1
Strobe
Out
Control-0
Ja
2
Data0
In/Out
Data-0
Nee
3
Data1
In/Out
Data-1
Nee
4
Data2
In/Out
Data-2
Nee
5
Data3
In/Out
Data-3
Nee
6
Data4
In/Out
Data-4
Nee
7
Data5
In/Out
Data-5
Nee
8
Data6
In/Out
Data-6
Nee
9
Data7
In/Out
Data-7
Nee
10
Ack
In
Status-6
Nee
11
Busy
In
Status-7
Ja
12
Paper-Out
In
Status-5
Nee
13
Select
In
Status-4
Nee
14
LineFeed
Out
Control-1
Ja
15
Error
In
Status-3
Nee
16
Init/Reset
Out
Control-2
Nee
17
Select
Out
Control-3
Ja
18-25
Ground
-
-
-

Zoals je uit de tabel kan opmaken is te zien dat het ontwerp van deze poort geheel gericht is op het doel om een printer aan te sturen.
Maar wat wel het mooie van deze poort is is dat we eigelijk geen 8bits poort hebben maar wel een 12 bits poort. Waarmee we als
we ons alleen richten op het schakelen van bv lampjes tot maximaal 4096 in/uitgangen kunnen creëren zonder enige problemen.
Met deze wetenschap is er natuurlijk een ondenkbaar veel mogelijkheden met deze poort te realiseren vandaar ook waarschijnlijk
dat deze poort het al zolang "volhoud" op de computer. Vooral in de industrie zie je vaak PLC's dan wel oude industriepc's. Met deze
of een soort gelijke poort.

Wat je ook mooi kan doen met deze poort is het rechtstreeks in lezen van data met Status-3 tot 7 En direct uitsturen met Control-0 tot 3.
En zo hou je dan nog 8 data lijnen over waar je zowel mee kan in als uitlezen.


LET OP! de printerpoort is NIET kort-sluit-vast Ook kan deze max ± 10mA voeren, gebruik dus altijd een optocoupler of het schema wat hier onder staat. Zowel voor in als uitgangen is dit aan te raden. wel kan je er 1 ledje per uitgang van 10mA op aansluiten ( +470W ) voor software-test opstellingen.
 

Schema:

Buffer voor datalijn printerpoort
Buffer voor datalijn printerpoort

Op welk adres bevind zich de printer poort, Zie ook weer de tabel hier onder :)
Meestal zal je dit maar 1x gebruiken in je programma. En vervolgens zal dit niet meer van toepassing zijn gezien dan de computer
weet waar hij jou geschreven data/software naar toe moet sturen.

Adressering
LPT1
LPT2
Data bereik (adres LPT + 0)
&378
&278
Status bereik (adres LPT + 1)
&379
&279
Control bereik (adres LPT + 2)
&37A
&27A

 

Basis werking + test software en code

Omdat ik zelf op dit moment ( Aug. 2004 ) in de zomer vakantie een House Controle System "HCS" aan het maken ben.
Heb ik dus ook zelf software nodig gehad. Een hele hoop is zo te vinden maar werkt dan niet goed of nauwelijks te vinden.
Dan wel gewoon weg niet gratis. Wat ik hier voor software ter download heb gesteld is niet super geavanceerd zoals bv het
wel bekende Microsoft paint ;) Maar je kan er wel je printerpoort mee testen en het werkt altijd. En mocht het niet werken kijk
dan eens op pagina 6/7 Windows9x / NT voor meer informatie.

Alles wat ik hier beschrijf heeft alles te maken met het aansturen van belastingen. Waar onder dus vallen. motoren, lampen enz.
Een LCD schermpje aansturen zal mij misschien wel lukken. Maar gelukkig heeft dat al iemand anders voor mij uitgezocht en ga
ik daar dus niet nog eens tijd aan besteden. Mocht iemand zin hebben hier een leuke tekst van te maken dan wil ik hem er graag
tussen plakken.

Om iets met software te laten zien of iets werkt is leuk. Maar met een stukje hardware is het nog VEEL leuker natuurlijk.
Als je serieus aan de gang wil met de LPT poort maak dan eerst dit schema Dit is eigenlijk gewoon een vereiste om te hebben.
Hier mee kan je niet alleen je software testen maar ook of je poort sowieso nog wel in orde is.

Ik heb hem ook gemaakt, niet geheel netjes maar ik kreeg het idee om het HCS te maken en wilde zosnel mogelijk aan het testen gaan ;)



Zoals je ziet, netjes een molex plug aan een 2ling snoertje gemaakt voor in de kast, een Printerplug voor op de LPT poort. en een 
kastje waar 8 leds in zitten met een 470W weerstand in serie. Deze hardware is gewoon puur voor het gemak.

Dit stukje hardware is er natuurlijk ook te verkrijgen in software, namelijk Parmon.exe Parmon heeft echter
een gebruiksvriendelijk voordeel namelijk; Je kan meteen de HEX, BIN en decimaal getal aflezen wat er ontstaat op de 8bits uitgang.
Dit kan je natuurlijk wel met een 40xx IC ook op je kasje maken maar dan is het weer geen handige simpele oplossing.

Iedereen kan het na deze uitleg. Maar hier kan je een leuke handige tool downloaden wat geen spam, reclame of andere ongein kent.
Ik heb het speciaal gemaakt ( met de hulp van SNUGGEL, www.snuggel.nl ) om te laten zien wat je allemaal kan doen met deze
computer poort. Het programma stuurt zowel direct de LPT poort aan als wel dat er een kleine indicatie balk aanwezig is die de
poort status ook nog een keer software matig weer geeft. Zodat als je op zondag middag bezig bent niet het gezeur kan krijgen
dat de elektro shop dicht is :)

Wat je ook wil aansturen het kan met deze poort. Of het nu gepulseerd moet of met gewoon weg een aan/uit functie alles is mogelijk.
Hier onder staat een stukje uitleg over hoe je makkelijk in Visual basic6 een simpele licht besturing kan maken. Zowel de software
als de hardware zal ik uitleggen.

De Visual Basic6 code

In dit gedeelte van de uitleg over de sturing met een LPT poort wordt een klein stukje software gemaakt
wat hopelijk duidelijk moet kunnen maken, hoe en wat je allemaal op een eenvoudige manier kan doen met
de combinatie Vb6 en de LPT poort.

We starten Vb6 en maken een gewoon exe bestand:

Vervolgens start Vb en krijg je een standaard "form1". Hierin maak je uiteindelijk je programma.
Maar wie het nog niet weet. Windows2000 en XP zijn gebaseerd op NT technologie. Dat wil niks anders zeggen
dan dat hier in elke module, driver, proces en services buiten de harde kern (Kernel) draaien. Of wel als een
programma een fout maakt, niet meteen je gehele Windows onderuit gaat en een blauw scherm geeft. Dit heeft wel
als groot nadeel dat de hardware en dus de poorten niet meer zomaar te benaderen zijn. Wat in de Win9x en dos
familie wel mogelijk was. Dit is makkelijk op te lossen door zelf en  module en driver te schrijven die Windows op
zijn beurt als kernel driver ziet. deze module is op internet gewoon te vinden als open source dus iedereen kan deze
gebruiken. Hier is de module te downloaden die ik gebruik in de uitleg. Deze moet je alleen nog wel in je software
zien te krijgen. Gelukkig is Vb een Microsoft product en wat iedereen ook zegt. Iedereen draait toch op Windows?
Waarom omdat het lekker makkelijk is :) 

Het invoegen van de module gebeurt dan ook als volgt:

Inderdaad, In het zip bestand wat je gedownload hebt zit ook een io.dll, Dit is de werkelijke driver alleen omdat Vb
een verwijzing hier naar toe moet hebben. Hebben we een module met de nodige informatie moeten adden.
Deze dll moet alleen nog wel in je Windows system32 map geplaatst worden. Meestal C:\Windows\system32 dan wel
C:\WinNT\system32

Nu kan eigelijk het programmeren de vrije loop nemen. Hier laat ik een simpel programma zien hoe je een lamp
aan en uit kan doen met 2 knopjes:

Dubbel klik nu op de eerste knop. Deze knop is gedefinieerd als Command1, De 2de als Command2
Als je er op dubbel klikt krijg je een text venster wat er zo uit komt te zien:

_____________________________________

Private Sub
Command1_Click()

End Sub
_____________________________________

Private Sub
Command2_Click()

End Sub
_____________________________________

Tussen de 2 blauwe regels komt de code die de knop moet uit voeren als hij wordt ingedrukt.
Als we er de code:

_____________________________________


Private Sub
Command1_Click()
     Call LPT_DataReg_PinHigh(BIT0)
End Sub
_____________________________________

Private Sub
Command2_Click()
     Call LPT_DataReg_PinLow(BIT0)
End Sub
_____________________________________

Tussen zetten en drukken op de knop dan zal datalijn0 op de printerpoort hoor worden.
Drukken we op de 2de knop zal deze de data lijn weer laag maken.

Dit kan ook met 1 knop wat in sommige gevallen handiger kan zijn. dan moet het met de volgende code.
_____________________________________

Private Sub
Command1_Click()
     Call LPT_DataReg_PinHigh(BIT0)
Call sleep (100)
     Call LPT_DataReg_PinLow(BIT0)
End Sub
_____________________________________

Private Sub
Command2_Click()
     Call LPT_DataReg_PinHigh(BIT1)
Call sleep (100)
     Call LPT_DataReg_PinLow(BIT1)
End Sub
_____________________________________

Nu kan je met knop1 datalijn0 hoog en laag maken met van een pulsje van 100ms. Met een Flipflopje is dit 
ideaal voor allerlei verschillende doeleinden. En met de 2de knop kan je nu datalijn1 hoog en laag maken. 
Hier is de beschreven software te downloaden. Met Parmon is ideaal te zien wat er gebeurt. Ook als je
zoals eerder beschreven, niet over de hardware oplossing beschikt.

De hardware

Zoals eerder vermeld is de printerpoort niet kort-sluit-vast en kan hij niet overweg met 
stroompjes groter dan ±10mA.

Het handigste is om een optocoupler te gebruiken in combinatie met een 470W weerstand.
Dan kan je vanuit daar allerlei meuk gaan aansturen zonder dat je nog rekening hoeft te houden
met je printerpoort want als die dood gaat op je mooie moederbord kan het veel geld gaan kosten.
( Niet omdat dan alleen je LPT defect is maar ook je PS/2 toetsenbord/muis aansluiting )

De 2de manier is is om het met het in "hoofdstuk2" behandelde schema met de transistor te doen.
Het grootste voordeel van de transistor is dat deze een wat grotere stroom kan sturen dan een
optocoupler.

  
De optocoupler is van het typen CNY74-2. Hier zitten er meteen 2 in 1 IC en kost maar € 0,50 en das niet duur.
Het 3de schema wat SNUGGEL heeft gemaakt. Het is een aanpassing op het eerste schema maar is waarschijnlijk
voor de meeste mensen van toepassing:

Of je zet er een digitale dimmer op dan kan je met 2 knopjes up/down je licht dimmen, Of met een flipflop je tiptoets
realiseren.

    
Het voordeel van de 4027 tegenover de 4013 er zitten er 2 in één IC.
Voor de digitale potmeter zijn er verschillende IC's een er van is de AD5228.

windows9x / NT

Of wel, Windows 3.x, 95, 98, ME of WindowsNT 4.0 Windows2000, ( NT 5.0 ), of Windows XP

Wie loopt er nou niet tegen aan. Wil je weer een keer wat nostalgie te voorschijn halen, bv een oud computer spelletje.
Iets wat op de oude PC van je pappie en mammie perfect werkte en op je nieuwe pc met WindowsXP totaal niet wil draaien.

De meeste weten ondertussen wat het probleem is. Een stuk terug in het artikel heb ik het al voor een stuk uit gelegd, maar
voor de gene die dat hebben over geslagen zal ik het nog een keer in het kort uitleggen.

Windows NT, ofwel boven genoemde versies, hebben een soort beveiliging waardoor als een programma een fout veroorzaakt
niet je gehele Windows omzeep gaat met het resultaat in een reboot / blauw scherm. Hier heeft Microsoft iets op bedacht maar
dit bracht de eenvoud van programmeren geen goede resultaten met zich me. Zo wordt door Windows alle toegang tot het aanspreken
van apparaten tegen gehouden, dit tot gevolg dat we niet meer zomaar de poort kunnen aan spreken. Voor de software die ik hier
besproken heb is het heel eenvoudig om het weer werkend te krijgen onder Windows NT. Namelijk je zet dit bestandje in je system32
map te plaatsen. Meestal te vinden onder: C:\Windows\system32 dan wel C:\WinNT\system32. Dit kan helaas niet je oude dos spelletjes weer
aan de gang helpen. Maar het geeft je wel toegang tot het aanspreken van de Printerpoort. En dat is waar we het hier over hebben.

Als je met een LCD schermpje aan de gang wil gaan heb je meestal een andere dll nodig namelijk deze. Deze bezit een aantal kernel drivers
wat dan ook wil zeggen dat je hier voor de Pc opnieuw voor moet opstarten na het installeren. Dit komt omdat ze op het aller laagste niveau
mee draaien in het hard van je besturingssysteem. En als hier iets in gewijzigd wordt moet dat opnieuw geladen worden.

Tot slot

Ook ik weet niet alles iig nog niet alles van de printer poort. Wel ben ik er achter gekomen dat je
12Bits uit en in kan sturen wat neer komt op een 4096 verschillende mogelijkheden. Dit komt omdat
we nu alleen van de 8 data lijnen zijn uit gegaan. Maar ook de paperfeder strobe enz. zijn vrij te
programmeren. Een ander voordeel van de poort is omdat het paralelle data is is het zeer eenvoudig
uit te breiden zonder eventuele hardware geheel opnieuw te hoeven ontwerpen / te verbouwen.

Ik heb hier met veel plezier aan gewerkt en hoop dat menig andere er veel aan zullen hebben.
Mocht iemand aanvullingen hebben. Bv Hoe kan je data inlezen met de poort zou hij mij daar
een groot plezier mee doen. En kan ik dit ook hier er nog bij zetten.