Nästa Föregående Innehållsförteckning

6. Några användbara portar

Här följer programmeringsinformation om några portar som direkt kan användas för TTL (eller CMOS) digitala kretsar.

Om du vill använda dessa eller andra gängse portar för det ändamål de är ägnade (t.ex. för att styra en printer eller modem), skall du troligen använda en befintlig drivrutin (vanligtvis inkluderad i kärnan) i stället för att programmera dessa portar direkt som beskrivs i detta HOWTO. Denna sektion är avsedd för dem som vill ansluta LCD-displayer, stegmotorer, eller annan speciell elektronik till en PC's standardport.

Ska du styra en massproducerad produkt som t.ex. scanner (som har funnits på marknaden ett tag), sök efter en befintlig drivrutin. Hardware-HOWTO är ett bra ställe att börja.

http://www.hut.fi/Misc/Electronics/ är en annan bra källa till information om hur man ansluter utrustning till datorer, och om elektronik i allmänhet.

6.1 Parallellporten

Parallellportens basadress (kallad ''BASE'' nedan) är 0x3bc för /dev/lp0, 0x378 för /dev/lp1, och 0x278 för /dev/lp2. Ska du styra något som beter sig som en normal printer, se Printing-HOWTO.

Förutom den vanliga output-only moden som beskrivs nedan, finns det en 'extended' bidirektionell mod i flertalet parallellportar. Information om detta och om de nyare ECP/EPP moderna (och om IEEE 1284 standarden allmänt), se http://www.fapo.com/ och http://www.senet.com.au/~cpeacock/parallel.htm. Kom ihåg att eftersom du inte kan använda IRQs eller DMA i ett user-mode program, så kommer du nog att behöva skriva en 'kernel-driver' för att använda ECP/EPP. Jag tror att någon håller på att skriva en sådan driver men jag känner inte till några detaljer.

Porten BASE+0 (Data port) styr data signalerna (D0 till D7 för bitarna 0 to 7, respektive; tillstånden: 0 = låg (0 V), 1 = hög (5 V)). Skrivning på denna port ställer ut data till donet. En läsning returnerar senast skrivna data i standard- eller extended-moden, eller data på stiften från en ansluten apparat i 'extended read mode'.

Portarna BASE+1 ('Status port') är 'read-only', och returnerar tillståndet på följande insignaler:

(Vet inte vilka spänningar som motsvarar hög respektive låg.)

Porten BASE+2 ('Control port') är 'write-only' (läsning returnerar senast inskrivna data), och styr följande status signaler:

(Återigen, är inte säker på vad som är hög och låg.)

Pinout (ett 25-pin D-don , hona ) (i=input, o=output):

1io -STROBE, 2io D0, 3io D1, 4io D2, 5io D3, 6io D4, 7io D5, 8io D6,
9io D7, 10i ACK, 11i -BUSY, 12i PE, 13i SLCT, 14o AUTO_FD_XT,
15i ERROR, 16o -INIT, 17o SLCT_IN, 18-25 Ground

IBM specifikationen säger att stiften 1, 14, 16, och 17 ('control- outputs') har 'open-collektor' utgångar dragna till 5 V genom ett 4.7 K motstånd (sänker 20 mA, ger 0.55 mA, högnivå utgång 5.0 V minus eventuellt spänningsfall). Övriga stift sänker 24 mA och ger 15 mA, och deras hög­nivå spänning är minst 2.4 V. Lågnivå spänningen är i båda fallen minst 0.5 V. Icke-IBM parallell portar avviker troligen från denna standard. För ytterligare information om detta se http://www.hut.fi/Misc/Electronics/circuits/lptpower.html.

Slutligen en varning: Var noga med jordningen. Jag har förstört flera parallellportar genom att ansluta dem med datorn igång. Det kan vara ett bra alternativ att använda parallellportar som inte sitter på moderkortet för sådana här saker. (Du kan antagligen få en andra parallellport med ett billigt standard 'multi-I/O' kort; Stäng bara av de portar du inte behöver, och sätt parallellkortets I/O-adress till en ledig adress. Du behöver inte bekymra dig om parallellportens IRQ, eftersom den vanligtvis inte används.)

6.2 Spelporten (joystick)

Spelporten finns på adresserna 0x200-0x207. För att styra normala joystickar finns en kernel-level joystick driver, se ftp://sunsite.unc.edu/pub/Linux/kernel/patches/, filename joystick-*.

Pinout (ett 25-pin D-don , hona ) (i=input, o=output):

+5 V stiften verkar ofta vara direkt anslutna till moderkortets kraftmatning, så de bör klara ganska mycket ström, beroende på moderkort, kraftaggregat och spelport.

De digitala ingångarna används till de två joystickarna (joystick A och joystick B, med två knappar vardera) som du kan ansluta till porten. De torde vara normala TTL ingångar, och du kan läsa deras status direkt på statusporten (se nedan). En joystick ger låg (0 V) status när knappen är nedtryckt och eljest hög (5 V från matningen via ett 1K motstånd).

De så kallade analoga ingångarna mäter egentligen resistans. Spelportarna har en fyrfaldig one-shot multivibrator (ett 558 chip) anslutet till de fyra ingångarna. På varje ingångsshylsa i kontaktdonet finns ett 2.2K motstånd mellan ingångshylsan och multivibratorns 'open-collector' utgång, och en 0,01 uF 'timing' kondensator mellan multivibratorns utgång och jord. En joystick har en potentiometer för varje axel (X och Y), dragen mellan +5 V och respektive ingångshylsa ( AX och AY för joystick A, eller BX och BY för joystick B).

När multivibratorn aktiveras sätts dess utgång hög (5 V) och den inväntar att timing kondensatorn når 3.3 V innan den sänker respektive utgång. På så sätt blir multivibratorns pulslängd proportionell mot potentiometerns resistans (dvs. joystickens position för respektive axel) enligt följande:

R = (t - 24.2) / 0.011,
där R är potentiometerns resistans och t pulsens längd i mikrosekunder.

Således, för att läsa dessa analoga ingångar, skall man först aktivera multivibratorn (med en skrivning på porten; se nedan), sedan polla (göra upprepade läsningar) tillståndet för de fyra axlarna tills de går från hög till låg, och på så sätt mäta pulstiden. Denna pollning tar mycket CPU tid och i ett icke­realtids multiprocess system som Linux blir inte resultatet så tillförlitligt eftersom man inte kan polla kontinuerligt, såvida du inte gör en 'kernel-driver' och stänger avbrottsingångar när du pollar (vilket tar ännu mer CPU tid). Om du vet att signalen kommer dröja tiotals millisekunder så kan du anropa usleep() innan du börjar polla för att ge CPU tid till andra processer.

Den enda I/O-port som du behöver nå är port 0x201 (de andra portarna beter sig precis likadant eller är inaktiva). En skrivning till porten (spelar ingen roll vad) aktiverar multivibratorn. Läsning från porten returnerar signalernas status:

6.3 Serieporten

Om den apparat som du vill kommunicera med stöder något som liknar RS-232 bör du kunna använda en serieport för att tala med den. Linux drivrutin för serieportar bör räcka för nästan alla tänkbara tillämpningar ( du ska inte behöva programmera serieportarna direkt, och skulle så vara måste du skriva en 'kernel driver'); den är mycket flexibel, så att använda icke­standardiserade bit­hastigheter torde inte vara något problem.

Se termios(3) manualen, eller seriedriverns källkod, (linux/drivers/char/serial.c), och http://www.easysw.com/~mike/serial/index.html för mer info om hur man programmerar serieportar på Unix system.


Nästa Föregående Innehållsförteckning