Porta
Paralela
Programando
a Porta paralela em Pascal
Programando
a porta paralela em Visual Basic
Programando
a porta paralela em QBasic
Programando
a porta paralela de outros jeitos
INTRODUÇÃO
A
porta paralela é uma interface de comunicação entre o
computador e um periférico. Quando a IBM criou seu
primeiro PC (Personal Computer) ou Computador Pessoal, a
idéia era conectar a essa Porta uma impressora, mas
atualmente, são vários os periféricos que utilizam-se
desta Porta para enviar e receber dados para o computador
(exemplos: Scanners, Câmeras de vídeo, Unidade de disco
removível e outros).
Se você
conhece um pouco de eletrônica e domina uma linguagem de
programação como: C/C++/C++Builder, Pascal/Delph ou
mesmo o Visual Basic, poderá desenvolver um programa que
controle um aparelho conectado à Porta paralela, ou um
programa de transferência de arquivos entre dois
computadores, utilizando um cabo paralelo como meio de
transmissão. O seu conhecimento de eletrônica servirá
para você desenvolver sua própria placa eletônica, que
será conectada ao DB25 da porta
paralela.
Está página
lhe fornecerá conhecimentos sobre a porta paralela, que
o fará compreender e utilizá-la, de uma maneira não
convencional, isto é, não somente para ser utilizada
com uma impressora, mas também como qualquer outro
aparelho, que o usuário tenha conhecimento sobre seu
funcionamento, desejando controlá-lo através de seu
Personal Computer, como diz a IBM.
Atenção!
A
Porta Paralela está ligada diretamente à placa mãe de
seu computador. Muito cuidado ao conectar circuitos eletrônicos
a essa porta, pois, uma descarga elétrica ou um
componente com a polaridade invertida, poderá causar
danos irreparáveis ao seu computador, seja coerente.
Não me
responsabilizo por nenhum dano causado.
ENDEREÇOS
O computador geralmente possui 3 portas: LPT1, LPT2 e
LPT3 (alguns possuem LPT4). Cada porta dessas possui 3
endereços: data, status e control. Esses endereços estão
numa ordem sequencial. Isso quer dizer que se a porta
data tem o endereço 0x038, então o endereço
correspondente de status é 0x0379 e o control é 0x037a.
Hoje em dia, os computadores estão basicamente
configurados da seguinte maneira:
Printer Data Port Status Control
LPT1 0x0378 0x0379 0x037a
LPT2 0x0278 0x0279 0x027a
LPT3 0x03bc 0x03bd 0x03be
Mas em alguns
computadores (principalmente os da IBM) esses valores
podem mudar. Para saber com certeza quais os endereços
que a sua máquina está configurada, use o programa
debug do DOS para visualizar os locais da memória 0040:0008.
Por exemplo:
>debug <ENTER>
-d 0040:0008 L8 <ENTER>
0040:0008 78 03 78 02 00 00 00 00
OBS: Observe que o byte mais significativo vem depois
do byte menos significativo, isso quer dizer que quando
vemos 78 03, quer dizer na verdade: 03 78.
No exemplo podemos ver que LPT1 é 0x00378, LPT2 é 0x0278
e LPT3 e LPT4 não possuem endereços definidos.
Então, para essa máquina hipotética:
Printer Data Port Status Control
LPT1 0x0378 0x0379 0x037a
LPT2 0x0278 0x0279 0x027a
LPT3 NENHUM
LPT4 NENHUM
Uma outra alternativa é utilizar o setup da BIOS para
verificar e/ou configurar os endereços do jeito que você
achar melhor.
O CONECTOR DB25
O
DB25 é um conector que fica na parte de trás do
gabinete do computador, e é através deste, que o cabo
paralelo se conecta ao computador para poder enviar e
receber dados.
A figura abaixo
mostra o conector padrão DB25, com 25 pinos, onde cada
pino tem um nome que o identifica:
Significado de cada pino do DB25

Esboço de funcionamento do DB25

Todas as saídas da
porta paralela são lógicas. Isto é, escrevendo o lógico
"1" em um bit da porta corresponde que esse
pino terá saída +5v. Entretanto os pinos SELECT_IN,
AUTOFEED e STROBE possuem uma lógica invertida. Isto é,
colocando o nível lógico 1 nesses pinos corresponde a
uma saída de 0v. Isso aconteçe porque quando não há
nenhuma ligação com a porta significa que o computador
"vê" esses pinos como nível lógico 1,
fazendo uma grande confusão já que ele pensaria que
tivesse uma impressora conectada. Para acabar com esses
problemas esses pinos foram invertidos.
LIGANDO E
DESLIGANDO APARELHOS EXTERNOS ATRAVÉS DA PORTA PARALELA
Como
já comentado, a Porta Paralela não é usada somente com
uma impressora, você pode desenvolver um circuito eletrônico
e acoplá-lo a essa porta e, através de um programa
específico, enviar-lhe sinais digitais para controlá-lo.
Abaixo temos três
circuitos: o circuito-1, o circuito-2 e o circuito-3 que
podem ser acoplados à Porta Paralela através de um cabo
Paralelo e, controlados por um programa.
CIRCUITO-1
A princípio o objetivo do circuito-1 é de ligar e
desligar oito LEDs, conectados através de uma cabo à
Porta Paralela.
No esboço
abaixo, observe que o terminal do catodo (K) dos LEDs estão
ligados aos terminais dos resistores, que estes por si,
estão ligados através do cabo aos pinos do DB25. Se
invertidos, o circuito não funcionará. Observe a
enumeração da pinagem do conector DB25.
Circuito-1
Lista de componentes:
1 (um) Cabo Paralelo - o mesmo
utilizado pela impressora;
8 (oito)
Resistores (R1 a R8) todos de 470 ohm (amarelo, violeta e
marrom);
8 (oito)
LEDs (L1 a L8) comuns de qualquer cor.
Geral:
fios, fero de soldar, solda etc.
Software:
O programa
abaixo pode ser compilado e executado para acender e
apagar os LEDs do circuito-1.
//Envia
sinal para a Porta Paralela LPT1:
#include <stdio.h>
#include <dos.h>
#define LPT1 0x378
int main(void)
{
unsigned char Valor=128;
//Em binário: 10000000
while( Valor >
0 )
{
outportb(LPT1, Valor); // Envia para a Porta LPT1
printf("\nPressione
uma tecla para ascender o próximo LED...");
getch( );
Valor = Valor
>> 1; //A
cada passagem, o bit 1 é
movido para à direita
}
} |
Este programa,
envia à Porta Paralela oito bytes, um a cada vez que o
usuário pressionar uma tecla. A sequência de bytes
geradas é vista na tabela abaixo:
| Decimal |
Binário |
Pino/Fio ativo (5V) |
Comentário |
| 128 |
10000000 |
2
- D0 |
Cada bit do byte enviado à
Porta Paralela está relacionado com um pino do
DB5, e um fio do cabo paralelo, fisicamente. Ao
enviar um byte, que o(s) bit(s) esteja(m) ligado(s)
ou desligado(s), os LEDs acende(rão) ou apaga(rão)
conforme os estados dos bits.
|
| 64 |
01000000 |
3
- D1 |
| 32 |
00100000 |
4 - D2 |
| 16 |
00010000 |
5
- D3 |
| 8 |
00001000 |
6
- D4 |
| 4 |
00000100 |
7
- D5 |
| 2 |
00000010 |
8
- D6 |
| 1 |
00000001 |
9
- D7 |
CIRCUITO-2
Com o circuito-2, você pode controlar através da
Porta Paralela mais quatro aparelhos eletro/eletrônico,
enviando sinais para o registrador 37Ah. Ao enviar um
byte para este registrador, mantenha os 4 últimos bits (nibble
alto) zerados, para não interferir no registrador 378h.
Quando for
trabalhar com o registrador 37Ah, tenha sempre em mente
que para ativar os sinais Slct In, AutoFeed e Strob, será necessário colocar os bits em
0 (zero), porque eles trabalham de forma invetida, 0 (zero)
ativa, 1 (um) desativa. Somente o Init
trabalha na sua forma normal.
Tabela descritiva dos sinais
Circuito-2

Lista
de componentes:
\n';
document.write(barra);
}
}
changePage();
nt>
1 (um) Cabo Paralelo - o mesmo
utilizado pela impressora;
4 (quatro)
Resistores (R1 a R4) todos de 470 ohm (amarelo, violeta e
marrom);
4 (quatro)
LEDs (L1 a L4) comuns de qualquer cor.
Geral:
fios, fero de soldar, solda etc.
Software:
O
programa abaixo testa o circuito-2. O seu funcionamento
é simples. Ao executá-lo, em primeiro lugar será
enviado um byte à Porta Paralela que ligará todos os
LEDs. Em seguida você pressionará uma tecla para enviar
mais outro byte, agora este ligará somente o LED 1 e
assim sucessivamente, até seja enviado o último byte,
que apagará todos os LEDs.
//Envia
para a Porta Paralela LPT1 no registro 37Ah:
#include <stdio.h>
#include <dos.h>
#define BIT0LIGALED1
3 // 0000 1010
#define BIT1LIGALED2 15
// 0000 1001
#define BIT2LIGALED3
9 // 0000 1111
#define BIT3LIGALED4 10
//
0000 0011
#define LIGATODOS
4
//
0000 0100
#define DESLIGATODOS 11
//
0000 1011
int main(void)
{
outportb(0x37A,LIGATODOS);
//Liga
todos os LEDs
getch();
outportb(0x37A,BIT0LIGALED1); //Liga LED 1
getch();
outportb(0x37A,BIT1LIGALED2);
getch();
outportb(0x37A,BIT2LIGALED3);
getch();
outportb(0x37A,BIT3LIGALED4);
getch();
outportb(0x37A,DESLIGATODOS);
//Desliga
todos os LEDs
} |
CIRCUITO-3
A
princípio, o objetivo do circuito-3, é de ligar e
desligar aparelhos eletro/eletrônicos como: motores,
portas e portões elétricos, fechaduras elétricas, rádios,
televisões, etc. Mas você pode muito bem através de um
programa de computador controlar braços de robôs,
temporizadores, controles automáticos e muito mais.
Circuito-3

No
circuito acima, o chip 74LS541 é usado para proteger a
Porta Paralela de altas correntes. Ele é alimentado com
5v, diferente da outra parte do circuito que controla o
relê, que precisa de 12v para ser acionado. Os contatos
do relê devem suportar 220v/10A, para que você possa
acionar aparelhos de potência.
Neste circuito
você pode controlar até oito aparelhos simultaneamente,
a partir das saídas S1 a S8.
Se você desejar
controlar mais que um aparelho, adicione mais circuitos,
idênticos ao da saída S1, às demais saídas (S2 a S8).
Atenção!
O
circuito acima trabalha ligado a Rede elétrica 110/220v.
Tome muito cuidado ao conectar os componentes, um fio
ligado na posição errada é fatal, tanto para você
como para seu computador. Seja coerente, se você não
conhece o suficiente de eletro/eletrônica, solicite a
ajuda de um profissional.
Lista
de componentes:
1 (um) Cabo Paralelo - o mesmo
utilizado pela impressora;
1 (um) LED verde;
1 (um) diodo 1N4148;
1 (um) Resistor R1: 2,2K ohm (vermelho,
vermelho e vermelho);
1 (um) Resistor R2: 470 ohm (amarelo,
violeta e marrom);
1 (um) Transístor BD 137;
1 (um)
Circuito integrado 74LS541 (buffer);
1 (um)
Relê 12 volts na bobina - cargas até 220v/10A
1 (uma)
fonte de alimentação estabilizada de 5 a 12volts;
Geral:
fios, fero de soldar, solda etc.
RECEBENDO SINAIS
EXTERNOS ATRAVÉS DA PORTA PARALELA
A
Porta Paralela, no modo padrão, têm cinco entradas.
Isso é útil quando você precisa capturar sinais do
mundo externo para dentro do computador. Como por exemplo,
saber se um sensor esta ativo ou não; se um alarme foi
disparado, etc.
As cinco
entradas através do conector DB25 são: Ack no pino 10,
Busy no pino 11, Paper end no pino 12, Slct out no pino
13 e Error no pino 15. Portanto você poderá enviar para
o computador cinco bits de uma só vez.
Usando as funções
inportb() ou Recebe() da classe TPorta,
já comentadas nesta página, você poderá ler o
registrador de Status da Porta Paralela, e saber se o
sinal em um determinado pino está alto ou baixo (0-zero
ou 1-um) no sistema binário.
As funções inportb() e Recebe() lêem um byte através da Porta
Paralela. Se você quiser saber se um determinado pino
está com o sinal alto ou baixo, terá de converter este
byte em binário para saber o estado do mesmo.
Nem todos os
bits do byte recebido através das funções inportb() ou Recebe() são válidos, como eu já mencionei,
são somente cinco as entradas no registrador de Status
da Porta Paralela, e cada entrada está relacionada com
um bit.
Ao ler o registrador
de Status, os bits nas posições 0, 1 e 2 não devem ser
levados em conta, porque não estão relacionados com
nenhum pino do DB25, mesmo assim fará parte do byte
recebido.
A tabela abaixo
mostra o significado de cada bit do byte recebido, através
das funções inportb( ) ou Recebe(
), usando o Circuito
4 conectado à
Porta Paralela. Observe que os bits, Ack, Paper
end, Slct out e Error, trabalham de maneira invertida,
diferente de Busy, que só é ativado quando tiver um
sinal no pino 11:
| Descrição/número dos pinos: |
11 |
10 |
12 |
13 |
15 |
Nenhum pino relacionado nestas
posições do byte |
| Byte lido em binário: |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
| Byte lido em Decimal: |
126 |
Para
saber como o computador agrupa os bits num byte, observe
o esquema abaixo:
BYTE

No
esquema acima observe que cada nibble equivale a 4 bits;
e a contagem dos bits é feita da direita para a esquerda
(0,1,2,3...).
CIRCUITO-4
Com
o circuito-4 conectado à Porta Paralela você poderá
enviar sinais para dentro de seu computador através das
entradas E1 a E 5.
Para enviar um
bit através da entrada E1, ligue-a direto ao negativo da
fonte de alimentação (0v), ou instale um interruptor
para ficar mais prático.
Como o circuito
abaixo utiliza um Circuito Integrado buffer, que tem o
poder de amplificar o sinal recebido, você poderá
extender os cabos conectados as entradas (E1 a E5) a mais
ou menos 20m de distânia. Faça testes.
Circuito-4
Atenção!
Para
enviar dados para dentro de seu computador através do
circuito acima, as entradas E1 a E5 devem ser ligadas ao
negativo (0 volts) da fonte de alimentação.
Lista
de componentes:
1 (um) Cabo Paralelo - o mesmo
utilizado pela impressora;
5 (cinco) Capacitores cerâmicos de (C1 a
C5) todos de 103 pF;
1 (um)
Circuito Integrado 74LS541 (buffer);
1 (uma)
fonte de alimentação estabilizada de 5 volts;
Geral:
fios, fero de soldar, solda etc.
Software:
O
programa abaixo, lê a Porta Paralela LPT1
ininterruptamente enquanto nenhuma tecla seja pressionada,
e exibe na tela do computador, o valor recebido em
decimal.
//Ler Porta
Paralela LPT1:
#include <stdio.h>
#include <dos.h>
int main(void)
{
unsigned char RetByte; //Para armazenar o valor
recebido da Porta Paralela
while( ! kbhit(
) ) // Faz enquanto nenhuma tecla
for pressionada
{
RetByte = inportb(0x379); // Ler um byte da Porta
Paralela (0x379)LPT1
printf("%u\n",RetByte);
}
} |
Software:
O
programa abaixo, foi escrito para o Sistema Operacional
MS-DOS, mas pode ser adaptado para outros sistemas.
Ele lê a Porta
Paralela LPT1 ininterruptamente enquanto nenhuma tecla
for pressionada, e exibe na tela do computador o estado
de cada bit do byte recebido a cada ciclo do laço
while().
//Ler
Porta Paralela LPT1:
#include <stdio.h>
#include <dos.h>
#define BIT0 0x01 // Não usado
#define BIT1 0x02 // Não usado
#define BIT2 0x04 // Não usado
#define BIT3 0x08 // Error
#define BIT4 0x10 // Slct out
#define BIT5 0x20 // Paper End
#define BIT6 0x40 // Ack
#define BIT7 0x80 // Busy
int main(void)
{
int x=10,y=5;
//Coluna e Linha
do vídeo
unsigned char
Byte; //Para
armazenar o byte recebido da Porta Paralela
clrscr();
gotoxy(30,1);
printf("RECEBENDO SINAIS...");
gotoxy(30,20); printf("Pressione
uma tecla para sair...");
gotoxy(x, y);
printf("Bit 3 - Error....:");
gotoxy(x,y+1);
printf("Bit 4 - Slct out.:");
gotoxy(x,y+2);
printf("Bit 5 - Paper End:");
gotoxy(x,y+3);
printf("Bit 6 - Ack:.....:");
gotoxy(x,y+4);
printf("Bit 7 - Busy.....:");
while( !
kbhit() )
{
Byte = inportb(0x379); //Ler um
byte da Porta Paralela
if((Byte
& BIT3) == 0){
// Error
gotoxy(x+20,y); printf("INATIVO");
}else{
gotoxy(x+20,y); printf("ATIVO
");
}
if((Byte & BIT4) == 0){
//
Slct out
gotoxy(x+20,y+1); printf("INATIVO");
}else{
gotoxy(x+20,y+1);
printf("ATIVO ");
}
if((Byte & BIT5) == 0){
//
Paper End
gotoxy(x+20,y+2); printf("INATIVO");
}else{
gotoxy(x+20,y+2); printf("ATIVO
");
}
if((Byte & BIT6) == 0){
//
Ack
gotoxy(x+20,y+3);
printf("INATIVO");
}else{
gotoxy(x+20,y+3); printf("ATIVO
");
}
if((Byte & BIT7) == 0){
// Busy
gotoxy(x+20,y+4);
printf("INATIVO");
}else{
gotoxy(x+20,y+4); printf("ATIVO
");
}
}
clrscr();
} |
|