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 te allen tijden naar mij gemailed worden op Prof.Botje @ Home.nl (spaties weghalen rond de '@')

Wat is de printerpoort?

De printerpoort is dus een parallelle poort. Wat wil zeggen dat deze een reeks bitjes tegelijk/parallel 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 ). Evenals 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. Hieronder 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: Sub-D 25 pins femaleFig.1: Sub-D 25 pins female

Fig.2: Sub-D 25 pins maleFig.2: Sub-D 25 pins male

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

Pinout van de parallelle poortPinout van de parallelle poort

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 8 bits 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 houd je dan nog 8 data lijnen over waar je zowel mee kan in als uitlezen.

LET OP! de printerpoort is NIET kortsluitvast! Ook kan deze maximaal ± 10 mA voeren, gebruik dus altijd een optocoupler of het schema wat hieronder staat. Zowel voor in- als uitgangen is dit aan te raden. Wel kan je er 1 ledje per uitgang van 10mA op aansluiten (+ 470 Ω weerstand) voor software-test opstellingen.

Schema:

Buffer voor datalijn printerpoortBuffer 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 zomervakantie 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 welbekende 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 Windows 9x/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. Hiermee 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 ;)

Parallelle poort interfaceParallelle poort interface

Zoals je ziet, netjes een molex plug aan een tweeling snoertje gemaakt voor in de kast, een printerplug voor op de LPT poort. En een kastje waar 8 leds in zitten met een 470 Ω 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 8 bits 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 Basic 6 een simpele licht besturing kan maken. Zowel de software als de hardware zal ik uitleggen.

De Visual Basic 6 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 Visual Basic 6 en maken een gewoon EXE bestand:

Het maken van een nieuw projectHet maken van een nieuw project

Vervolgens start VB en krijg je een standaard "Form1". Hierin maak je uiteindelijk je programma. Maar wie het nog niet weet. Windows 2000 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 Windows 9x 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 Visual Basic 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:

Het toevoegen van een moduleHet toevoegen van een module

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:

Het formulierHet formulier

Dubbelklik 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 datalijn 0 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 knop 1 datalijn 0 hoog en laag maken met van een pulsje van 100 ms. Met een flipflopje is dit ideaal voor allerlei verschillende doeleinden. En met de tweede knop kan je nu datalijn 1 hoog en laag maken. 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 kortsluitvast en kan hij niet overweg met stroompjes groter dan ± 10 mA.

Het handigste is om een optocoupler te gebruiken in combinatie met een 470 Ω 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 tweede manier is is om het met het in "hoofdstuk 2" 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.

Aansturen van een LEDAansturen van een LED

Optocoupler CNY74-2Optocoupler CNY74-2

Aansturen van een relaisAansturen van een relais

De optocoupler is van het type CNY74-2. Hier zitten er meteen 2 in 1 IC en kost maar € 0,50 en das niet duur. Het derde schema wat SNUGGEL heeft gemaakt 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.

Flipflop met een 4013Flipflop met een 4013

Flipflop met een 4027Flipflop met een 4027

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 ervan is de AD5228.

Digitale potmeter AD5228Digitale potmeter AD5228

Windows 9x/NT

Oftewel, Windows 3.x, 95, 98, ME of Windows NT 4.0, Windows2000 of Windows XP.

Wie loopt er nou niet tegenaan. 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 diegene 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 tegengehouden, 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 door 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 allerlaagste 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, in ieder geval nog niet alles van de printerpoort. Wel ben ik er achter gekomen dat je 12 bits 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 paperfeeder, 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. Bijvoorbeeld hoe je data kan inlezen met de poort zou je mij daar een groot plezier mee doen. En kan ik dit ook hier er nog bij zetten.