Logo del sito i2viu

SCHEDA  SPERIMENTALE  I/O  CON  LPT
by Vittorio Crapella - i2viu

Si rammenta che non consigliato lavorare direttamente pin to pin fra LPT e circuiti esterni ma conviene interporre una separazione con delle porte logiche ..meglio sarebbe usare dei fotoaccoppiatori cos da avere una separazione galvanica.... questo per evitare che errori esterni di collegamenti o tensioni possano finire sulla LPT e danneggiare il circuito interno della scheda madre del PC, soprattutto sui pi moderni dove la LPT integrata sulla scheda madre e non separata come sui vecchi 286/486.... si potrebbe se fosse possibile lavorare con una scheda di queste cosi, male che vada la LPT su scheda si pu cambiare con spese minime.
Attenzione anche alle scariche elettrostatiche.       LEGGI DISCALIMER

db25lpt.zip File.zip (19 Kb) con schemi ORCAD e testo

Vai a: IL PC SIMULA UN PLC in questa pagina.

PORTA PARALLELA DEL PC

Attraverso il connettore DB25 della parallela LPT del Computer (286/486 e ...)
é possibile gestire livelli di tensione 0-5V sia come INPUT che come OUTPUT.

     CONNETTORE DB25 A 25 POLI PER PORTA PARALLELA
     ----------------------------------------------
     Per convenzione viene montato sul p.c. un connettore femmina.
     Visto dall'esterno del p.c. ha la seguente numerazione:
           ___________________________________
          /14 15 16 17 18 19 20 21 22 23 24 25\
         / o  o  o  o  o  o  o  o  o  o  o  o  \
        /                                       \
       /  o  o  o  o  o  o  o  o  o  o  o  o  o  \
      /  1  2  3  4  5  6  7  8  9  10  11 12 13  \
      ---------------------------------------------
nmi.gif-25Kb
Disposizione dei bit dei segnali per una parallela di 
indirizzo PORTA (vedi fondo pagina):

PORTA+0   la porta DATI ed é solo output.
             
                 BIT               PIN CENTRONICS

                0 - D0                  2
                1 - D1                  3
                2 - D2                  4
                3 - D3                  5
                4 - D4                  6
                5 - D5                  7
                6 - D6                  8
                7 - D7                  9

PORTA+1   la porta STATUS ed é in input

                3 - ERROR               15
                4 - SLCT OUT          13
                5 - PO                    12
                6 - ACK                  10
                7 - BUSY (negato)    11

PORTA+2  e' la porta CONTROL ed é  in output ma si possono anche leggere come input.

                0 - STROBE (negato)     1
                1 - AUTOFD (negato)    14
                2 - RESET                   16
                3 - SLCTIN (negato)     17

lo stato di questa porta all'accensione :

1 1 1 0 1 1 0 0        (ottenuta leggendo la porta)

Attenzione essendo il bit 4 un IRQ_EN conviene non scriverci 1 i pin da 18 a 25 della CENTRONICS sono GND (massa)

CI SONO PARALLELE CHE HANNO GLI INPUT PULL-UP CON DELLE RESISTENZE INTERNE
ALMENO PER LA PORTA+1, MENTRE ALTRE SONO APERTI E PERTANTO SE TESTATI NON
CONNESSI A PERIFERICHE SONO FLUTTUANTI E NON GARANTISCONO LIVELLO NE 0 NE 1

Per gestire la PARALLELA in BASIC si può usare le istruzioni:

INP (ADR)       dove adr  l'indirizzo e vale 889 per LPT1 e testa  
                    i bit dai pin 15-13-12-10-11 (tot. 5 bit)
INP (ADR)       dove adr  l'indirizzo e vale 890 per LPT1 e testa
                    i bit dai pin 1-14-16-17  (tot. 4 bit)

Per testare un BYTE (8bit) si può fare:

A=INP(889)
B=INP(890)
VALINPUT=(B-128)-(A-232)

Per l'uscita si usa :

OUT ADR,NR      dove adr  indirizzo e vale 888  per LPT1 e gestisce i bit d'uscita sui 
                      pin 2-3-4-5-6-7-8-9 (NR  il valore numerico da buttar fuori)

Pare che certi BASIC possono accettare anche POKE ADR,VALORE NUMERICO
NR  dato dalla somma del valore che ogni bit possiede se  messo a livello 1 (uno):

ESEMPIO
             PIN               9 - 8 - 7 - 6 - 5 - 4 - 3 - 2
         2 ELEVATO ALLA  7   6    5   4   3    2   1   0
         BIT  A  " 1 "        0   1    0   1   0    0   0   1
             NR  =                64      +16               +2  = 81

 se faccio    OUT 888,81       setto i pin 8-6-2 a livello 1 e gli altri a 0

 IN ASSEMBLER SIA PER INPUT CHE PER OUT DEVO PRIMA CARICARE NEL REGISTRO
 dx IL VALORE ADR secondo la LPT usata e poi:

 con   IN al,dx        carico nel registro Al il valore di input corrispondente all'indirizzo contenuto in dx
 esempio :
              mov dx,889
              in al, dx

cosí facendo carico in al 8 bit di cui però soltanto i 5 bit più 
significativi sono quelli riferiti ai pin 11-10-12-13-15

            byte al
            peso bit    7 - 6 - 5 - 4 - 3 - 2 - 1 - 0
            pin cor.   11  10  12  13  15   x   x   x

            mov dx, 890
            in al,dx

così facendo carico in al 8 bit di cui però solo i 4 meno significativi
sono riferiti ai pin 17-16-14-1

            byte al
            peso bit    7 - 6 - 5 - 4 - 3 - 2 - 1 - 0  
            pin cor.     x   x    x    x   17 16  14   1

Ricordarsi che i bit facenti capo ai pin 1-14-17-11 sono negati rispetto
agli altri dei pin 11-10-12-13-15
per prendere un byte dall'input facente capo ai pin 11-10-12-13-15-16-14-1
in cui pin11=bit7 e pin 1=bit0 si farà:

            mov dx,889           preparo dx per input
            in    al,dx             carico al con 8 bit di cui solo 5 utili
            and al,0f8h           elimino i bit che non servono
            mov variabile,al     (variabile dove tenere momentaneamente al)
            mov dx,890           punto ad altro input
            in    al,dx             prendo 8 bit di cui 4 utili-solo tre servono
            and al,07             elimino i bit che non servono
            or   al,variabile      unisco i 5bit di prima con i tre ultimi e in al ho 8 bit che fanno capo ai pin
                                      11-10-12-13-15-16-14-1
PER L'OUT sarà: 
                mov dx,888        (888=LPT1 )
                out dx,al

così facendo prendo gli 8 bit del registro Al e li "butto" sui pin 

 9-8-7-6-5-4-3-2    pin 9 = bit7  pin 2 = bit0

Gli indirizzi PORTA sono:

          ESADECIMALE            DECIMALE

          OUT     IN1    IN2     OUT    IN1    IN2
LPT1    378h   379h   37Ah    888    889    890
LPT2    278h   279h   27Ah    632    633    634 
LPT3    3BCh   3BDh   4BEh    956    957    958
Lo schema elettronico della scheda I/O (32Kb)

Vista componenti con piste in trasparenza (47Kb)       Foto interfaccia

Schema dell'interfaccia usata per comandare 8 relè temporizzati gestiti dal programma TIMER (tutto il progetto 60KB)

IL PC SIMULA UN PLC

Si e` pensato di fare uso della parallela come INPUT/OUTPUT per tentare di simulare un PLC. All'interno il programma crea un loop multiplexato in cui testa gli otto ingressi della LPT mentre esegue le routines atte a gestire le otto uscite. Le otto uscite possono essere testate come input dal 9 al 16, pertanto gli ingressi in totale sono 16. Per il momento sono state previste 19 procedure in grado di settare le uscite a livello 0 o a livello +5V, eseguendo delle routines tipo MONOSTABILE, ASTABILE, FLIP/FLOP TIPO D, FLIP/FLOP TIPO S-R, SUONERIA piu` tutte le porte OR, NOR, AND, NAND con max. 11 ing. + XOR e XNOR I tempi di ritardo (astabili/monostabili) possono essere impostanti da 1 a 65535 mS, tali tempi sono sufficientemente precisi anche se sono influenzati dal numero delle procedure in atto (non dipendono dal clock del computer avendo una routine che si auto adegua in funzione di questo).
TESTATO FINO AI PENTIUM 133
CON I PC DELL'ULTIMA GENRAZIONE TROPPO VELOCI NON FUNZIONA
Al lancio del programma I2VIU.EXE si può digitare dopo il nome, spazio 1 o 2 o 3 per configurare la LPT1 o LPT2 o LPT3, se non specifico un numero si configura con la prima LPT che trova partendo dalla LPT1.
Il programma é stato sviluppato in assembler per ambiente DOS e si presenta con un menù di scelta per le varie funzioni con comandi di facile interpretazione, si usa ESC per tornare all'operazione precedente. Chi vuole cimentarsi con il file .ASM lo può scaricare (18 Kb plc.zip).
L'AUTORE NON SI ASSUME NESSUNA RESPONSABILITA' ESPLICITA O IMPLICITA RIGUARDANTE INCIDENTI O CONSEGUENTI POSSIBILI DANNI DERIVANTI DALL'USO DEL PROGRAMMA.
Torna a inizio pagina

LINK PER SAPERNE DI PIÙ:
Da Wikipedia
Tutorial di Vincenzo Villa
 

[ return ]