Implementarea interfeţei paralele

Portul paralel a fost proiectat în vederea conectării la calculator a imprimantelor, dar poate fi folosit şi ca un port de intrare/ieşire de uz general, pentru cuplarea la calculator a oricărui dispozitiv extern (care se potriveşte caracteristicilor de intrare/ieşire ale portului).

Figura 1

Din punct de vedere logic, interfaţa paralelă standard este formată din două registre şi un buffer de intrare, ocupând trei adrese consecutive din spaţiul adreselor de porturi al procesorului. Portul paralel standard conţine un registru de date pe 8 biţi unidirecţional (la portul paralel standard bidirecţional acest registru este bidirecţional), un registru de control bidirecţional pe 6 biţi dintre care doar 4 linii sunt legate la connector-ul interfeţei paralele şi un buffer de intrare pe 8 biţi din care sunt folosiţi doar 5 pentru liniile de stare de la periferic. Interfaţa paralelă permite citirea în paralel a până la 9 biţi (17 la portul paralel bidirecţional) şi scrierea a până la 12 biţi, la orice moment de timp.

Ieşirile interfeţei paralele folosesc nivelele logice TTL, curentul însă diferă de la o interfaţă la alta. Majoritatea porturilor paralele, însă pot duce până la 12 mA. Pentru a evita însă, supraîncărcarea portului paralel ar fi bine ca la intrările dispozitivului periferic să se pună tampoane. La calculatoarele mai vechi interfaţa paralelă era implementată cu circuite logice TTL/LS, în schimb la calculatoarele actuale porturile sunt implementate într-un circuit specializat (ASIC – Application-Specific Integrated Circuit), care însă, este compatibil cu porturile mai vechi.

1. Implementarea interfeţei paralele standard folosind circuite logice

Registrul de date

Se află plasat la adresa IOBaseAddress+0 şi poate fi accesat în citire şi scriere (prin instrucţiuni de intrare/ieşire). Prin scrierea unui octet în acest registru, acesta va fi prezent pe liniile 2-9 din cupla interfeţei paralele. Valoarea rămâne nemodificată şi stabilă până la o nouă scriere în acest registru.

Figura 2

În cazul portului paralel standard intrarea OE a registrului de date este conectată la masă, astfel că orice citire de la acest port conduce la citirea conţinutului registrului 74LS374. Deci, în acest caz, liniile de date ale interfeţei paralele sunt unidirecţionale şi liniile de date ale cuplei paralele nu se pot citi, ci doar conţinutul registrului de date.

La portul SPP bidirecţional, însă, intrarea OE a circuitului 374 este comandată de bitul 5 din registrul de control. Dacă scriem un “1” pe poziţia 5 a registrului de control, printr-un IN de la portul de date se pot citi liniile de date de pe cupla paralelă.

Registrul de stare

Se află la adresa IOBaseAddress+1 şi poate fi accesat doar în citire, scrierile fiind ignorate.

Figura 3

Figura 4

Registrul de control

Se află la adresa IOBaseAddress+2 şi poate fi accesat atât în scriere cât şi în citire.

Figura 5

Liniile corespunzătoare registrului de control sunt bidirecţionale. Ieşirile registrului de control sunt legate la cuplă prin intermediul unor inversoare Open-Colector, pentru a asigura procesorului şi posibilitatea de a citi aceste linii. Când portul de control este folosit ca intrare, trebuie ca registrul de control să conţină valoare 0100, deci trebuie ca ieşirile inversoarelor OC să fie pe “1”.

Biţii 4 şi 5 sunt pentru controlul intern al interfeţei paralele. Bitul 4 este destinat validării întreruperilor iar prin bitul 5 se validează intrarea pentru registrul de date (la modul PS/2).

Figura 6

2. Adresarea interfeţei paralele

O intefaţă paralelă este identificată prin adresa ei de bază şi printr-un identificator atribuit de BIOS: LPT1, LPT2, LPT3, ...

Interfaţa paralelă are alocate trei adrese de bază:

Adresa

Descriere

3BCh – 3BFh

Folosite de interfeţele paralele incorporate în plăcile video. (Ex. PS/2)

378h – 37Fh

Adresa uzuală pentru LPT1

278h – 27Fh

Adresa uzuală pentru LPT2

Tabelul 1

La pornirea calculatorului, BIOS-ul (Basic Input/Output System) va determina numărul porturilor din sistem şi la va atribui denumirile LPT1, LPT2 şi LPT3. BIOS-ul verifică, prima dată, dacă există un port la adresa 3BCh, dacă există îi atribuie numele LPT1; apoi verifică adresa de port 378h, dacă găseşte un port aici îi atribuie următoarea denumire liberă; şi în final verifică adresa 278h şi dacă există un port la această adresă îi atribuie şi acestuia următoarea denumire nefolosită. Pentru a determina ulterior care sunt adresele alocate pentru LPT1, LPT2 şi LPT3 se pot consulta următoarele adrese din zona de date BIOS, unde există tabelul portrilor LPT:

Adresa de start

Funcţia

0000:0408

Adresa de bază pentru LPT1

0000:040A

Adresa de bază pentru LPT2

0000:040C

Adresa de bază pentru LPT3

0000:040E

Adresa de bază pentru LPT4 (BIOS-urile mai noi)

Tabelul 2

Acest tabel conţine trei cuvinte pe 16 biţi (patru la unele BIOS-uri) fiecare intrare conţinând adresa I/O de bază a portului paralel, dacă acesta există, sau 0 dacă acesta nu există.

3. Cupla paralelă

Pini (DB25)

Pini (Centronics)

Semnal SPP

Direcţie

Registru

Inversat

1

1

nStrobe

In/Out

Control

Da

2

2

Data 0

Out

Data

 

3

3

Data 1

Out

Data

 

4

4

Data 2

Out

Data

 

5

5

Data 3

Out

Data

 

6

6

Data 4

Out

Data

 

7

7

Data 5

Out

Data

 

8

8

Data 6

Out

Data

 

9

9

Data 7

Out

Data

 

10

10

nAck

In

Status

 

11

11

Busy

In

Status

Da

12

12

PaperOut

In

Status

 

13

13

Select

In

Status

 

14

14

nAuto

In/Out

Control

Da

15

32

nError

In

Status

 

16

31

nInit

In/Out

Control

 

17

36

nSelect

In/Out

Control

Da

18-25

19-30

Masa

Gnd

   

Tabelul 3

4. Programarea interfeţei paralele standard

Legarea unei imprimante la portul paralel

Scopul principal al interfeţei paralele şi cel mai răspândit este conectarea la calculator a unei imprimante.

Modul de lucru cu acest port, cunoscut şi sub denumirea de mod Centronix, este cel mai cunoscut şi răspândit, poate transmite date doar într-o singură direcţie (de la calculator spre periferic) la o viteză tipică de 50 Ko/s dar poate ajunge şi până la 150 Ko/s.

Pentru trimiterea unui caracter la periferic se poate folosi un program care implementează următorii paşi:

  1. Scrie codul caracterului în registrul de date.
  2. Verifică dacă perifericul nu este ocupat, testând linia Busy din registrul de stare. Dacă perifericul este ocupat, aşteaptă.
  3. Modifică pe 0 bitul de Strobe din registrul de control, specificându-i perifericului că are date disponibile pe liniile de date;
  4. Modifică pe 1 bitul de Strobe din registrul de control, după aproximativ 5ms.

Figura 3