A Porta Paralela é uma interface de comunicação entre o computador e um periférico onde é possível o envio e recebimento de sinais digitais utilizando a transmissão em paralelo. Nesta forma de transmissão os grupos de bits são transferidos simultaneamente, ou seja, cada bit possui uma linha condutora de sinal ligando o circuito transmissor ao circuito receptor. Desta forma, como vários bits são transmitidos simultaneamente a cada ciclo, a taxa de transferência de dados é alta. - Modelos de porta paralela
A porta possui modelos aos quais possuem diferentes taxas de transmissão de dados além de uma configuração diferente para a pinagem. Estes modelos são :
-Modelo SPP (Standard Parallel Port) : nesse modelo a porta paralela pode chegar a uma taxa de transmissão de dados a 150KB/s. Comunica-se com a CPU utilizando um BUS de dados de 8 bits.
-Modelo EPP ( Enhanced Parallel Port ) :pode chegar a atingir uma taxa de transferência de 2 MB/s. Para atingir essa velocidade, será necessário um cabo especial. Comunica-se com a CPU utilizando um BUS de dados de 32 bits. Para a transmissão de dados entre periféricos são usado 8 bits por vez.
-Modelo ECP (Enhanced Capabilities Port) tem as mesmas características que a EPP, porém, utiliza DMA (acesso direto à memória), sem a necessidade do uso do processador, para a transferência de dados. Utiliza também um buffer FIFO de 16 bytes.
Nos computadores geralmente o modo default é o SPP. Entretanto é possível ativar o modo EPP indo no setup do computador e ativando-o na opção “Onboard Parallel Mode” . Este modo EPP difere do SPP pelo seguinte fato: no modo SPP utilizamos o registrador de Dados (que controla os pinos D0 à D7 ) apenas para a escrita, no modo EPP, entretanto, podemos utilizar este registrador tanto para escrita quanto para leitura. A seguir irei descrever a pinagem da porta como se estivesse em modo SPP .
A porta possui 25 pinos cada qual responsável por uma função específica. Estas funções são mostradas na figura abaixo:
O nível lógico dos pinos é determinado da seguinte forma: Se a a voltagem no pino estiver em um intervalo compreendido entre 0v e 0,4v este pino está no nível lógico zero, caso a voltagem do pino esteja entre 3,1v e 5v o pino possui o nível lógico um.
Para realizarmos as operações de I/O na porta precisaremos saber os endereços dos registradores da portas. Os registradores possuem 8 bits (que em alguns casos possuem bits não usados) e são utilizados para controlar pinos específicos da porta. A porta possui 3 registradores: Registrador de Dados (Saída)*, Registrador de Status (Entrada) e Registrador de Controle (Saída).
-Registrador de DADOS: (pinos 2 à 9 )
O endereço para o acesso desse registrador em hexadecimal é 378h ( o que seria equivalente à 888 em decimal). Através desse registrador estamos controlando todos os pinos de D0 à D7. Imagino que você deva estar se perguntando, sim e se eu quiser apenas alterar o estado de um pino isoladamente (por exemplo o D2) comofas?
A resposta está no próprio número do pino \o/. Imagine que esses pinos D0 à D7 formem um número binário, e imagine ainda também que a númeração de cada pino equivale ao peso do dígito, ou seja, D0 = 2⁰ / D1 = 2¹ / D2 = 2² / ... / D7 = 2⁷. Ta sacando onde eu quero chegar? Não? Não mesmo? Então tá, continuando a explicação ... Se eu quero, por exemplo, enviar 1 para o D2 e 0 para os demais tudo que eu tenho de fazer é enviar um número binário de 8 bits para a porta e no algarismo de peso 2 (já que é o D2) colocar o número um e nos demais 0, ou seja , 00000100 (o que equivale a 4 em decimal). Sacou a idéia? Ainda não? Então olha aí a figura de baixo e veja se ficou mais claro...
Deu pra entender né? =)
Como falei logo no inicio do post, no modo EPP podemos usar estes pinos para a leitura de dados. Ora, como este modelo é bidirecional precisamos saber quando estamos realizando operações de escrita ou leitura, isto é determinado pelo estado lógico contido no bit 5 do registrador de controle: quando o nível lógico é 1 estamos usando o registrador de dados para escrita, quando o nível lógico é 0 estamos usando para escrita. Para o caso de quisermos apenas utilizar estes dados para entrada podemos usar o endereço 37Ch e assim não termos que nos preocupar com o bit 5 do registrador e controle ;).
-Registrador de STATUS: ( Pinos 10, 11, 12, 13 e 15 )
O endereço para o acesso desse registrador em hexadecimal é 379h( o que seria equivalente à 889 em decimal). Este registrador controla os seguintes pinos: pino 10 = S6 / pino 11 = S7 / pino 12 = S5 / pino 13 = S4 / pino 15 = S3 . Para a leitura do estado dos pinos utilizaremos a mesma lógica explicada anteriormente: Enviaremos um número binário a porta considerando o peso do pino. Entretanto para este caso o número binário possui 8 bits mas os algarismo de peso 0 , 1 e 2 não fazem nada, ou seja, só importa os valores contidos nos algarismos de peso 3 `a 7. Na figura a baixo é possível ver os pesos dos pinos :
Gostaria ainda de ressaltar o seguinte fato:
O pino 11 (S7) trabalha em lógica invertida, ou seja, se o pino estiver em estado lógico zero isto significa que o circuito está enviando na verdade estado lógico um para o pino, da mesma forma, se o pino estiver em nível lógico um isto significa que o circuito que está ligado ao pino em questão está em nível lógico zero. Deu pra entender? Não? Então agora eu vou escrever em caps lock pra todo mundo ler:
ESTE PINO INVERTE O ESTADO LÓGICO QUE É ENVIADO A ELE.
-Registrador de CONTROLE: ( Pinos 1, 14, 16 e 17 )
O endereço para o acesso desse registrador em hexadecimal é 37Ah( o que seria equivalente à 890 em decimal). Este registrador controla os seguintes pinos: pino 1 = C0 / pino 14 = C1 / pino 16 = C2 / pino 17 = C3 . Para este caso nós utilizamos números binários de 4 bits. A figura abaixo mostra o número dos pinos e seus pesos:

E gostaria ainda de ressaltar o seguinte fato:
Quase todos os pinos (exceto o pino 16 [ C2 ] ) trabalham em lógica invertida, e assim deve-se sempre lembrar que caso você queria deixar o pino em estado lógico 1 deve se enviar o valor zero, e se você quer que ele fique em estado lógico zero deve-se enviar o valor 1.
Considerações finais: Na continuação deste post iremos implementar um programa simples que será capaz de enviar e receber dados à porta. Este programa possuirá uma classe PortaParalela a qual poderar operar com o modelo EPP ou SPP.
www.rogercom.com
http://www.jobtecltda.com.br/paralela/paralela.htm
--------------------------------------------------------------------------------------------------
* Lembrando que no modelo EPP esse registrador é bidirecional, ou seja, pode-se realizar operações tanto de entrada quanto de saída.