Generalitati
Interfata paralela SPP a fost dezvoltata pentru imprimante si reprezinta standardul pentru cele mai reduse perfomante.
Nivelul semnalelor este standard TTL. Conductorii se ecraneaza prin torsadarea unui fir de masa pe firele de semnal.
Transferul datelor dintre calculator si imprimanta se desfasoara dupa un protocol "handshaking", deci pe lânga liniile de date exista si semnale de control.
Transferul datelor se face pe 8 biti, ca în figura urmatoare:
STROBE/ si SEL IN/ sunt semnale de comanda de iesire, de la calculator la periferic.
ACK/ si BUSY sunt semnale de comanda de intrare, de la periferic spre calculator.
Prezenta datei stabile la iesire se semnaleaza la imprimanta prin semnalul STROBE.
Dupa preluarea datelor, receptorul raspunde cu activarea semnalului ACK/ (data receptionata).
BUSY semnaleaza starea de ocupat a imprimantei.
Semnalul SEL IN/ este emis numai în cazul porturilor bi 16516w2215q directionale si stabileste sensul transferului.
În conectorul portului paralel, semnalele sunt amplasate conform tabelului urmator:
Conector DIP 25 |
Semnal SPP |
In/Out |
SOBE |
In-Out |
|
DATA 0-7 |
IOut |
|
ACK/ |
In |
|
BUSY |
In |
|
|
In |
|
SELECT/ |
In |
|
AUTO FEED |
In-Out |
|
ERROR/ |
In |
|
INIT/ |
In-Out |
|
SELECT INPUT/ |
In-Out |
|
GND |
GND |
Porturile EPP si ECP folosesc un hardware suplimentar pentru handshaking. Ele sunt complet compatibile si cu modul SPP.
Pentru a transmite un octet la imprimanta, folosind modul SPP, programul executa urmatoarea secventa:
Scrie octetul în portul de date
Testeaza linia BUSY. Daca aceasta este '1', imprimanta nu accepta date si asteapta dezactivarea lui BUSY. Orice data se pierde.
Activeaza ('0' logic) linia STROBE si face o temporizare de cca 5 microsecunde.
Dezactieaza linia STROBE ('1').
Pentru cresterea vitezei de transfer, de obicei se ignora linia ACK.
2. Registrele interfetei:
Portul paralel SPP foloseste trei adrese. Adresa 3BCh a fost initial introdusa pentru porturile paralele pe unele adaptoare video mai vechi. Aceasta adresa a disparut un timp, deoarece porturile paralele au fost înlaturate de pe adaptoarele video. Adresa a fost apoi folosita din nou, ca o optiune pentru portul paralel integrat pe placa de baza, astfel încât configurarea lui se poate face prin BIOS.
LPT1 are de obicei adresa de baza 378h, iar LPT2 278h.
Adresa |
Observatii |
3BCh-3BFh |
Port paralel pe placa de baza |
378h-37Fh |
Uzual LPT1 |
278h-27Fh |
Uzual LPT2 |
La pornire, BIOS determina numarul porturilor pe care le are si le atribuie la dispozitivele logice LPT1, LPT2, LPT3 etc. Prima adresa testata este 3BC. Daca la aceasta adresa BIOS gaseste un port paralel, îl atribuie lui LPT1, apoi cauta adresa 378h si 278h. Astfel, este posibil ca în cazuri particulare adresele sa difere de cele din tabelul de mai sus.
Adresele alocate de BIOS pentru porturile paralele sunt memorate la locatii de memorie specifice, astfel încât ele pot fi regasite.
Adresa |
Functia |
Adresa LPT1 |
|
0000:040A |
Adresa LPT2 |
0000:040C |
Adresa LPT3 |
Fiecare adresa ocupa 2 octeti.
Programul urmator este un exemplu pentru obtinerea adreselor porturilor paralele, prin citirea locatiilor de memorie corespunzatoare.
#include <stdio.h>
#include <conio.h>
void main(void)
a. Folosind un astfel de program, determinati adresa portului paralel pentru calculatorul din laborator.
Adresele porturilor sunt:
Base +0 Adresa de baza, uzual numita Registru de date, este folosit pentru înscrierea datei de iesire. De obicei, acest port este numai pentru scriere. Daca portul e bidirectional, portl contine data receptionata.
Base+1
Base+1 |
Bit 7 |
Busy (negat) |
Bit 6 |
Ack |
|
Bit 5 |
Paper Out |
|
Bit 4 |
Select In |
|
Bit 3 |
Error |
|
Bit 2 |
IRQ (negat) |
|
Bit 1 |
Rezervat |
|
Bit 0 |
Rezervat |
Base+2 Control port. Portul de comanda este folosit pentru iesire, dar poate fi si citit. Daca la acest port se conecteaza o imprimanta, sunt folosite 4 semnale de comanda.
Base+2 |
Bit 7 |
Nefolosit |
Bit 6 |
Nefolosit |
|
Bit 5 |
Validare port bidirectional |
|
Bit 4 |
Valideaza IRQ prin intrarea Ack |
|
Bit 3 |
Selectare imprimanta |
|
Bit 2 |
Initializare imprimanta (Reset) |
|
Bit 1 |
Auto Linefeed |
|
Bit 0 |
Strobe |
Întreruperile portului paralel sunt de obicei IRQ5 sau IRQ7. Întreruperile pot fi validate sau invalidate prin bitul 4 al Registrului de comanda. Întreruperile, odata validate, vor apare pe tranzitia din '0' în '1' a liniei Ack. (la unele modele poate fi si invers).
În programul urmator se da un exemplu de folosire a întreruperii portului paralel.
** Program PRNT_INT.C **
Folosese o rutina de tratare a inreruperii pentru a semnala o intrerupere de la imprimanta.
Intreruperea e determinata de tranzitia '1'->'0' a semnalului /ACK.
Notam ca am consideratportul de imprimanta la adresele 0x0378 -0x037a
si am asociat IRQ 7.
Nume Adresa in tabel **
IRQ2 0x0a
IRQ4 0x0c
IRQ5 0x0d
IRQ7 0x0f ** */
#include <stdio.h>
#include <bios.h>
#include <dos.h>
#define DATA 0x0378
#define STATUS DATA+1
#define CONTROL DATA+2
void close_intserv(void);
void int_processed(void);
void open_intserv(void);
void interrupt far intserv(void);
int intlev=0x0f; /* interuperea asociata cu IRQ7 */
void interrupt far (*oldfunc)();
int int_occurred = 0;
/* Definitii globale */
int main(void)
close_intserv();
return(0);
void interrupt far intserv(void)
/* Este rutina de tratare a intreruperii */
void open_intserv(void)
/* valideaza IRQ7. In caz de intrerupere (low in /ACK) salt la intserv.
** toate intreruperile se invalideaza pe durata acestei functii
Validarea se face la iesire. */
void close_intserv(void)
/* invalideaza IRQ7 */
void int_processed(void)
/* EOI */
b. Scrieti un program care trimite la imprimanta un sir de caractere citit de la tastatura.
Conectarea unor comutatoare si LED-uri la portul paralel.
O aplicatie simpla este comanda unor LED-uri si citirea starii unor comutatoare. Consideam ca se citeste pe intrarea BUSY starea unui comutator si se comanda un LED conectat la Bitul 0. Notam ca o iesire '0' logic detrmina aprinderea LED-ului.
În programul urmator, daca comutatorul e deschis, LED-ul este comandat sa lumineze.
/* Program LED
Iustreaza o aplicatie simpla a portului paralel.
Cand comutatorul e deschis, LED-ul lumineaza. */
#include <stdio.h>
#include <dos.h>
#define DATA 0x03bc
#define STATUS DATA+1
#define CONTROL DATA+2
void main(void)
else
} }
c. Faceti schema electrica pentru conectarea la portul paralel a 8 LED-uri în cazul în care pe intrarea Ack se conecteaza un buton cu apasare si revenire.
Scrieti un program care, folosind întreruperile, numara apasarile pe buton si aprinde LED-corespunzator, pentru a indica în binar numarul de apasari.
|