Lucrarea 1. Programarea Portului Paralel - IBM-PC. 1. Introducere. Lucrea are ca scop familiarizarea cu portul paralel al PC-ului, descriindu-se structura portului parelel, configuraţia acestuia, regimurile de funcţionare şi modalitaţi de programare, precum şi exemple de utilizare. Pentru programarea portului paralel se va utiliza un limbaj de programare avansat ( C++) rulând în modul MS_DOS. Compania IBM, începâd cu IBM-PC, a introdus portul paralel de imprimare standard SPP (Standard Parallel Port), în prezent mai putin utilizat ca atare. Acest port utilizează un conector standard DB-25S mamă (female) ataşat PC-ului, care prin intermediul unui "IBM printer cable" (ce realizează o conexiune între un conector tata (male) DB-25P şi un conector tata cu 36 pini tip CENTRONICS), se conectează la o imprimantă Centronics standard. În prezent Portul Parelel este standardizat prin standardul IEEE 1284, standard ce defineşte următoarele moduri de funcţionare: 1. Compatibility Mode(SPP) 2. Nibble Mode 3. Byte Mode (Bi-directional) 4. EPP Mode (Enhanced Parallel Port) 5. ECP Mode (Enhanced Capabilites Port) Idea de bază a acestui standard a fost de a utiliza noi dispozitive şi drivere, compatibile unul cu celălalt si de asemenea compatibile cu SPP (Standard Parallel Port). Modurile Compatibility, Nibble & Byte pot fi implementate utilizând suportulul hardware disponbil pe placile aferente SPP. În schimb, modurile EPP şi ECP necesită un suport hardware adiţional care să asigure viteze mai mari de funcţionare şi care să asigure şi compatibiltatea cu SPP. Modul Compatibilty (sau Centronics) permite transmiterea datelor într-o sigură direcţie, de la PC catre exterior, la o viteză standard de 50KByte/sec. Pentru a realiza recepţia datelor din exterior modul de funcţionare trebuie schimbat fie în modul Nibble fie în modul Byte. În modul Nibble portul poate receptiona/transmite un "nibble" (4 biţi) de la/la un dispozitiv extern. Pentru a realiza acest lucru, modul Nibble va utiliza 4 din cele 5 pini de stare ai portului pentru recepţie şi 4 pini ai portului control pentru transmisie. Modul Byte utilizează caracteristica de bidirecţionalitate a portului paralel, realizând transmisia/receptia datelor la nivel de octet (8 biti). Observaţie: Activarea(selectarea) modului de funcţionare al portului paralel se realizează prin configurarea corespunzătoare a BIOS-ului(Setup). 2. Descrierea Portului Paralel 2.1. Caracteristici Hardware Tabelul 1 prezintă desrierea pinilor unui conector D-SUB25 (25 pini) şi a unui conector cu 34 pini tip Centronics. 0
Tabelul 1. Pin No (D-Type25) Pin No (Centronics) Semnale SPP Directie In/out Registru Inversare Hardware 1 1 nstrobe In/Out Control Yes 2 2 Data0 Out Data 3 3 Data1 Out Data 4 4 Data2 Out Data 5 5 Data3 Out Data 6 6 Data4 Out Data 7 7 Data5 Out Data 8 8 Data6 Out Data 9 9 Data7 Out Data 10 10 nack (Confirmare) In Stare 11 11 Busy (Ocupat) In Stare Yes 12 12 Paper Out In Stare 13 13 Select (Selecţie) In Stare 14 14 nautofeed (Salt la rind nou- automat) In/Out Control Yes 15 32 nerror In Stare 16 31 ninitialize (Iniţializare printer) In/Out Control 17 36 nselect-in In/Out Control Yes 18-25 36 Ground GND Observaţii: 1. Litera "n" din faţa numelui semnalelor semnifică faptul că semnalul respectiv este activ LOW (în "0L"). 2. Prin "Inversare Hardware" se înţelege că semnalul respectiv este inversat intern de catre portul paralel. (Ex.: Linia Busy. Dacă se aplică 5V (1L) pe acest pin şi apoi este citit Registrul de Stare, bitul 7 al acestuia, ce corespunde semnalului Busy va fi 0.) 3. Ieşirile portului parelel se încadrează în standardul TTL (0V-0.8V=Low; 2.4V- 5V=High). Curentul absorbit sau debitat (Sink & Source Current) variază de la un port la altul. Cel mai adesea un port paralel poate debita/absorbi in jur de 15mA(I OH /I OL ). 2.2. Adresele porturilor Fiecare port paralel este definit prin: - Adresa de bază I/O ( I/O Base Adress); - Numar specific LPTx; Portul paralel are trei adrese de bază uzual folosite. Acestea sunt prezentate în Tabelul2. Adresa 3BCh a fost prima introdusă, fiind utilizată de porturile paralele ale vechilor placi video. În prezent ea a aparut ca o opţiune pt. porturile paralele integrate pe plăcile de bază şi controlate de BIOS. LPT1 este în mod normal asignat la adresa 378h, iar LPT2 la 278h. (Pot exista situaţii care se abat de la aceasta regulă - caz explicat în paragrafele următoare) 1
Tabelul 2: Adresă 3BCh - 3BFh 378h - 37Fh 278h - 27Fh Comentarii: Utilizată de porturile paralele incorporate în vechile placile video. În prezent reprez. o opţiune pentru porturile controlate de BIOS. Adresa uzuală pt. LPT1 Adresa uzuală pt. LPT2 Când un calculator este pornit (la reset), BIOS-ul (Basic Input/Output System) va determina numărul de porturi paralele existente şi le va asigna un număr specific (etichetă) LPT1, LPT2 & LPT3. La inceput, BIOS-ul se va "uita" la adresa 3BCh. Dacă la această adresă este găsit un port paralel el este asignat ca LPT1; apoi BIOS-ul analizează adresa 378h. Daca un port paralel a fost gasit la aceasta adresa, el îi va asigna urmatoarea etichetă care poate fi LPT1 dacă la adresa 3BCh nu exista un port paralel sau LPT2 daca la adresa 3BCh se găseşte un port. Ultima adresa verificată este 278h, urmându-se aceeaşi procedură ca în cazul celorlalte 2 porturi. BIOS-ul IBM defineste o zonă de memorie în RAM-ul intern, începînd cu adresa 0000:0408, folosită pentru memorarea adreselor de bază a maxim patru porturi paralele. Fiecare adresă de bază a porturilor este memorată folosind 2 octeţi. Locaţiile de memorie aferente porturilor neutilizate vor fi completate cu 0. Tabelul 3 prezintă adresa în zona de date BIOS unde poat fi gasite adresele de bază ale porturilor paralele. Tabelul3: Adresă de start Descriere 0000:0408 Adresa de bază LPT1 0000:040A Adresa de bază LPT2 0000:040C Adresa de bază LPT3 0000:040E Adresa de bază LPT4 Notă: Aplicaţia 1 prezintă modul de scanare a zonei de date BIOS şi identificarea porturilor paralele prezente. 2.3. Registrele aferente portului paralel (modelul programator) Fiecare port de imprimare este alcătuit din trei adrese de port, numite generic: de date, de stare şi de control. Aceste porturi se afla la adrese de memorie consecutive. Structura registrelor aferente portului precum şi distribuţia semnalelor este prezentată în figura următoare: Registrul de date Adresa de bază, denumită uzual Port de Date sau Registru de Date, este utilizată în general pentru transmiterea datelor pe liniile de date ale portului paralel (Pinii 2-9). În mod normal acest port este un port de iesire(scriere). În urma citirii acestui port se va obţine ultimul octet înscris. Observaţie: Portul de date poate fi configurat ca fiind şi bi-direcţional (Bit5 - Registrul de Control), mod prin care se pot recepţiona date din exterior. 2
Tabelul 4. Registrul de date Offset Nume Read/Write Bit No. Proprietăţi Bit 7 Data 7(Pin 9) BASE+0 Data Port Write (*) Bit 6 Data 6 (Pin 8) Bit 5 Data 5 (Pin 7) Bit 4 Data 4 (Pin 6) Bit 3 Data 3 (Pin 5) Bit 2 Data 2 (Pin 4) Bit 1 Data 1 (Pin 3) Bit 0 Data 0 (Pin 2) (*) Dacă portul este bi-direcţional atunci sunt permise şi operaţii de citire. Registrul de stare Portul de Stare (Adresă Bază +1) este un port de intrare( citire). Orice data scrisă în acest port va fi ignorată. Portul de stare este compus din 5 biţi corespunzători pinilor 10,11,12,13 &15, un bit IRQ pentru intreruperi (fără corespondenţă pe pinii portului) şi 2 biţi rezervaţi. Dacă bitul IRQ este 1 atunci nu s-a semnalat nici o întrerupere. Tabel 5. Registrul de stare Offset Nume Read/Write Bit No. Proprietăţi Bit 7 Busy BASE+1 State Port Read Bit 6 Ack Bit 5 Paper Out Bit 4 Select In Bit 3 Error Bit 2 IRQ (Not) Bit 1 Reserved Bit 0 Reserved Registrul de control Portul de control (Adresă de bază+2) a fost planificat să fie un port de scriere. Cînd o imprimantă este ataşată unui PC, sunt necesare 4 semnale pentru a o controla (comanda). Acestea sunt: Strobe, Auto Linefeed, Initialize şi Select Printer (exceptând Initialize toate sunt "Inversate hardware"). În mod normal imprimanta nu ar trebui să trimită semnale pentru a controla un PC. Totuşi aceste 4 ieşiri pot fi utilizate şi ca intrări. Acest lucru este posibil datorită faptului că aceste linii au ieşirile tip "open colector" (colector în gol). In mod normal o placă de I/O are rezistenţele de "pull-up" conectate intern. 3
Configurarea pinilor ca intrari se realizează prin scrierea registrului cu xxxx0100, rezultând un nivel de 1 (+5V) la ieşirile acestora, astfel încât un dispozitiv extern să-l poată "coborî" (pull down) în 0. Biţii 4&5 sunt biţi de control intern. Bitul 4 va activa IRQ; bitul 5 va activa caracteristica de bidirecţionalitate a portului de date. Biţii 6&7 sunt rezervaţi. Orice scriere a acestora va fi ignorată. Tabelul6. Registrul de control Offset Nume Read/Write Bit No. Proprietăţi Bit 7 Rezervat BASE + 2 Control Port Read/Write Bit 6 Rezervat Bit 5 Enable bi-directional Port Bit 4 Enable IRQ Via Ack Line Bit 3 Select Printer Bit 2 Initialize Printer (Reset) Bit 1 Auto Linefeed Bit 0 Strobe 3. Aplicaţii ale portului parallel. Aplicaţia 1: Identificarea porturilor paralele prezente într-un PC. Următorul program scris în C, prezintă modul în care pot fi citite aceste locaţii de memorie ale BIOS-ului pentru a obţine adresele porturilor paralele. //IDENTIFICARE PORTURI PARALELE #include <stdio.h> #include <dos.h> void main(void) unsigned int far *ptraddr; /*Pointer locatia Adresei Porturilor*/ unsigned int address; /* Adresa porturilor */ int a; ptraddr=(unsigned int far *)0x00000408; for (a = 0; a < 3; a++) address = *ptraddr; /* se testează existenta portului */ if (address == 0) printf(" Nici un port asignat pt. LPT%d \n",a+1); else printf("adresa asignata pt. LPT%d este %Xh\n",a+1,address); ptraddr++; Aplicaţia 2: Testarea portului parelel de imprimare. Figura următoare prezintă un circuit de test foarte simplu care are rolul de a pune în evidenţă o parte din caracteristicile portului paralel (nivelul de activare al semnalelor, inversiunile hardware). Programul TEST_PTR.C realizează o comutare secvenţială On/Off a celor 12 LED-uri, iar apoi într-o buclă afişează starea celor 5 comutatoare de intrare. 4
/* TEST_LPT.C ** ** Program pentru testarea a 12 iesiri si 5 intrari. ** ** Programul comuta secvential LED-urile Off utilizind bitii 7,6,5,..0 ** ai Portului de Date si apoi Bitii 3,2,1 and 0 ai Portului de Control ** Fiecare LED este mentinut stins aprox. 1sec. De notat că un LED este ** stins cu 1L. ** ** Programul apoi intra intr-o bucla unde scaneaza cei mai semnificativi ** 5 biti ai portului de stare afisiand continutul acestuia in HEX. */ #include <stdio.h> #include <conio.h> #include <dos.h> /* necesar pt. functia de intirziere */ #define DATA 0x03bc /* poata sa difere de la PC la PC */ #define STATUS DATA+1 #define CONTROL DATA+2 void main(void) int in, n; clrscr(); outportb(data,0x00); /* Aprinde LED-urile Portului de Date */ outportb(control, 0x00^0x0b);/*Aprinde LED-urile Portului de CTRL */ 5
/* stinge LED-urile Portului de Date prin setarea fiecarui Bit în 1L */ for (n=7; n>=0; n--) outportb(data, 0x01 << n); printf( \n Data port:%02x,inportb(data)); outportb(data, 0x00); /* Se comuta Off LED-urile Portului de Control ** Se executa exclusive-or pentru a compensa inversiunile hardware */ outportb(control, 0x08^0x0b); /* bit 3 */ printf( \n Control port:%02x,0x08^0x0b); outportb(control, 0x04^0x0b); /* bit 2 */ printf( \n Control port:%02x,0x04^0x0b); outportb(control, 0x02^0x0b); /* bit 1 */ printf( \n Control port:%02x,0x02^0x0b); outportb(control, 0x01^0x0b); /* bit 0 */ printf( \n Control port:%02x,0x01^0x0b); outportb(control, 0x00); /* Se scaneaza comutatoarele si se afiseaza starea acestora */ clrscr(); printf( STATUS PORT: ); while(1) in = (inportb(status)^0x80)&0xf8; /* BUSY (MSB) este inversat hardware.sunt afisati cei mai semnificativi 5 biti ai portului de stare. */ gotoxy(15,1); printf("%02x\n", in); if (in==0xf8) // daca toate comutatoarele ON sfîrşit printf( \npress ANY KEY TO EXIT!!! ); break; MODUL DE LUCRU. 1. Se vor identifica adresele porturilor paralele instalate şi modurile de configurare ale acestora folosind BIOS-ul fiecărui PC. 2. Se va testa Aplicaţia 1 şi se vor compara rezultatele cu cele obţinute la punctul 1. 3. Folosind sistemul de test, a cărui schemă a fost prezentată în figura anterioară, să se ruleze / modifice Aplicaţia 2, sintetizându-se caracteristicile portului paralel. 6