O essencial para programar a porta paralela (C/C++) 1






Tabela de conteúdos

O essencial para programar a porta paralela (C/C++) 1

ALERTA!

Mecher na porta paralela causa dependência (vício). E também é perigoso. A porta paralela está ligada diretamente à placa mãe. Qualquer curto ou uso indevido pode comprometer todo o computador. Não nos responsabilizamos por qualquer dano que você possa vir a causar ao seu computador. Seguindo a risca as orientações do tutorial, você minimizará as chances de qualquer defeito.

Boa diversão!

Entendendo a Porta Paralela

A porta paralela foi inventada pela IBM originalmente com o intuito de controlar impressoras. Por esse motivo, a porta paralela ficou conhecida como a porta de conexão de impressoras. Porém, existem uma infinidade de dispositivos que podem ser controlados por essa interface de comunicação, como exemplo: Scanners, máquinas fotográficas digitais, dispositivos de armazenamento, e até mesmo outros computadores. Por ser uma porta de entrada e saída de dados, podemos controlar e receber informações por meio da porta paralela, desde que sigamos algumas regras. Tendo uma noção de eletrônica básica, poderemos então controlar (ligar, desligar, receber informações) qualquer dispositivo, tornando a porta paralela em um meio de exportar o seu programa do mundo virtual, para o mundo real. E é a este propósito que se destina este tutorial.

A porta paralela, encontrada no padrão PC IBM, tem um conector padrão chamado DB25. Como podemos ver nas figuras 1.1 e 1.2.

Fig. 1.1: Conector fêmea encontrado na parte traseira do pc.

Fig. 1.2: Conector macho

Como tudo, a porta paralela sofreu algumas modificações ao passar do tempo, visando sempre a melhoria do seu sistema. Por conta disso, surgiram novos padrões de porta paralela. Hoje existem 3 padrões diferentes de porta paralela estão no mercado. São eles: SPP, EPP e ECP. Existem também variações dentro destes padrões. Eles diferem em comportamento. Na maioria dos computadores atuais, podemos ter os 3 modos, que podem ser escolhidos no “Setup” do computador. Para acessarmos o setup temos que reiniciar o computador e teclar alguma tecla na inicialização. Normalmente F2, F8 ou Delete (depende da placa mãe).

O Setup é Programa onde o operador, pode fazer algumas personalizações sobre como vai funcionar o seu computador. Está residente, juntamente com o BIOS, numa memória ROM, que fica na placa mãe, suas determinações ficam guardadas numa outra memória a CMOS (Complementary Metal/Oxide Semiconductor), memória volátil de baixo consumo que guarda as informações relevantes ao processo de boot do sistema.

Vamos uma rápida explicação sobre os 3 padrões.

  • SPP – Standard Parallel Port: É um padrão de comunicação UNIDIRECIONAL, ou seja existe apenas um sentido de comunicação na sessão de dados, cuja a capacidade máxima de trafego de dados é a 150 KB/s. Você pode receber alguns sinais de periféricos nesse modo, porem não tem uma seção própria para trafego de dados, por isso é dito unidirecional.
  • EPP (Enhaced Parallel Port): É um padrão bidirecional, onde a sessão de dados tem trafego bidirecional (em ambos os sentidos)a mesma pode atingir até a velocidade de 2MB/s. Enquanto que o modo SPP foi feito com alvo em impressoras, esse modo, criado pela Intel, Xircom & Zenith Data Systems, para prover uma comunicação mais rápida entre os dispositivos. Com alvo em geral em dispositivos de armazenamento.
  • ECP (Extended Capabilities Port): Trata-se de um padrão perfeitamente idêntico ao EPP, com a vantagem de possuir DMA (Direct Memory Access)- Acesso direto a memória. Ou seja, ele não precisa passar pelo processador para acessar o dado residente na memória.

Vejamos então uma diagrama com a pinagem do conector DB25 no padrão SPP na figura 2.

fig2

Tabela 1

Tabela de endereços das portas paralelas.

Tabela 2

Esses endereços serão de suma importância para o que vem mais a frente neste tutorial. Sendo que o endereço de controle deve ser usado com muita cautela, pois os bits mais significativos, quando operados de forma indevida, podem causar danos ao computador, sugiro que para início de estudo, não use o endereço de controle.

Aplicando nossos conhecimentos Manipulando a porta paralela

Cada linguagem de programação terá suas funções para a manipulação da porta paralela. A linguagem que estudaremos será a linguagem C em ambiente windows, usando o compilador Dev-C++.

Por motivo de segurança, as versões mais novas do windows não permitem que um programa acesse recursos de hardware de forma direta. Mais precisamente, todos os sistemas baseados na tecnologia NT (New Tecnology). Exemplo os windows 2000 e XP. Os demais não tem qualquer entrave nesse quesito, ex: windows 95, 98, ME. Para que o nosso programa possa, então, acessar a porta paralela, que é um recurso de hardware, teremos de fazer uma “ponte” com uma dll. A dll inpout32.dll .

Ela será responsável por resolver este nosso “problema”.

Muito bem, vamos a explicação. Usaremos a função outportB(). Esta função recebe dois atributos. O primeiro é o endereço da porta que você vai utilizar. O segundo é o dado que você vai enviar. Se eu quiser ligar um led que está conectado ao pino 2 (Bit0 de dados) da porta LPT1 eu devo escrever a linha ? outportB(0×378,1);
No caso, eu estou dizendo para a minha função outportB que mande para o endereço de dados (0×378) o byte que representa o numero decimal 1 (0000 0001 em binário). Se eu quiser ligar o led do bit1 a mesma coisa. outportB(endereço,dado); ? outportB(0×378,2). Na linguagem C, quando entramos um dado Hexadecimal, colocamos o prefixo “0x”. Quando entramos um dado decimal, não precisamos colocar prefixos.

Uma breve explicação sobre BIT. A palavra Bit significa Bibary Digit, ou seja, Digito que representa apenas dois estados. No caso: Nível alto (Ou ligado) e Nível Baixo(Ou desligado). Pois bem, na nossa porta paralela nós temos, na saída de dados, 8 Bits que podem ser definidos no nosso programa como (Ligados ou desligados). Convencionou-se a leitura de um dado binário da direita para a esquerda, como se faz a leitura de um número decimal! Na esquerda estão os números mais significativos, e na direita os menos significativos. Então, quando mandamos um dado à saída de dados, estamos dizendo: Ligue tal bit, desligue tal bit, ligue aquele outro… Vamos a uma tabela bem intuitiva, onde temos o dado e o bit que ele vai ligar dentro do endereço de dados de LPT1 (0×378).

tabela 3

Exemplo de código em C no Dev-C++ que usa a porta paralela para ligar e desligar leds e que usa a inpout32.dll.

/*
 BBBB  RRRR  W   W N   N  OOO
 B   B R   R W   W NN  N O   O
 BBBB  RRR   W W W N N N O   O    Tutorial Porta Paralela
 B   B R  R  W W W N  NN O   O          Dev-C++
 BBBB  R   R  W W  N   N  OOO      brunofgc@gmail.com
*/
#include <stdio.h>   // Biblioteca Standard Input/Output
#include <conio.h>   // Biblioteca necessária para o uso da função getch();
#include <windows.h> // Biblioteca necessária para o carregamento da inpout32.dll

/*Inpout32*/
//Declaração dos ponteiros para função.
typedef short _stdcall (*PtrInp)(short EndPorta);
typedef void _stdcall (*PtrOut)(short EndPorta, short datum);
HINSTANCE hLib; //Instância para a DLL inpout32.dll.
PtrInp inportB;     //Instância para a função Imp32().
PtrOut outportB;  //Instância para a função Out32().
/*Inpout32*/


int main()
{
/*Inpout32*/
   //Carrega a DLL na memória.
   hLib = LoadLibrary("inpout32.dll");
   if(hLib == NULL)
   {
      printf("\n\aErro. O arquivo inpout32.DLL nao foi encontrado.\nO programa vai terminar apos digitar qualquer tecla.");
      getch();
   }
else {//Todo o programa só será executado apenas se a dll for carregada.
   //Obtém o endereço da função Inp32 contida na DLL.
   inportB = (PtrInp) GetProcAddress(hLib, "Inp32");
   if(inportB == NULL)
   {
      printf("\n\aErro. Erro ao endereçar a função Inp32.");
   }
   //Obtém o endereço da função Out32 contida na DLL.
   outportB = (PtrOut) GetProcAddress(hLib, "Out32");
   if(outportB == NULL)
   {
      printf("\n\aErro. Erro ao endereçar a função Out32.");

   }
/*Inpout32*/    

char teclado=' ';
puts("Vamos ao teste da porta paralela.");
puts("Para ligar cada um dos bits da porta paralela\naperte as teclas referentes aos bits\n0,1,2,3,4,5,6,7. Quando quiser terminar o programa\ndigite p para parar.");
teclado=getch();
while(teclado!='p')
    {
     switch(teclado)
          { 
           case '0':
           outportB(0x378,1);  /* A função que manda um byte para a porta paralela no caso o número 1 ou 0000 0001 em binário*/
              break;
           case '1':
           outportB(0x378,2); /* Novamente a função que manda um dado a porta paralela*/
              break;
           case '2':
           outportB(0x378,4);
              break;              
           case '3':
           outportB(0x378,8);
              break;              
           case '4':
           outportB(0x378,16);
              break;              
           case '5':
           outportB(0x378,32);
              break;              
           case '6':
           outportB(0x378,64);
              break;              
           case '7':
           outportB(0x378,128);
              break;            
          }
          teclado=getch();
    }
   
outportB(0x378,0);
}//fim do else pertencente ao if que testa se carregou a dll
    
}//fim da função main e do programa


Para que o programa funcione, temos que colocar a inpout32.dll dentro da mesma pasta que o arquivo executável. Caso tentemos rodar o programa sem a dll na pasta, o programa irá informar o erro e irá finalizar.

Compilando e executando o programa veremos que os leds acendem de acordo com a entrada no teclado de 0 a 7. Vamos então ao esboço eletrônico para ligar os leds na porta paralela.

Receitinha de bolo: 8 Leds, 8 resistores 470 ohm (amarelo, violeta e marrom), 1 cabo paralelo, 1 ferro de soldar, solda à gosto, fios à gosto, uma pitada de conhecimento em eletrônica básica e um pouco de paciência.
Modo de preparo: Misture tudo e leve ao computador, por algumas horas de estudo.

fig3

Como visto na figura 3, basta ligarmos os leds em série com um resistor ao terra e ao pino referente para que possamos fazer nossos testes, sempre respeitando a polaridade dos leds. Para identificar a polaridade do led em Anodo e Katodo (Positivo e negativo respectivamente) utiliza-se um código. No invólucro do led temos um pequeno chanfro identificando o lado negativo, ou a perna mais curta é também do lado negativo. Como visto também os pinos 19-25 são terra, então temos que unir todos eles. Uma forma simples á utilizar um cabo paralelo e desmontar a ponta do lado que vamos fazer nossa montagem, deixando o lado que vamos conectar ao computador intacto. Dentro do cabo teremos uma barra de metal condutor unindo os pinos 19-25. Então basta pegar qualquer um dos pinos, neste caso.

Temos ainda a possibilidade de entrada de dados para o nosso programa pela porta paralela através do endereço de status. Mais, por hora, vamos deixar isso de lado. Pois será necessário um pouco mais de conhecimento em eletrônica para não causar danos ao computador. (Devemos sempre lembrar que, a porta paralela está conectada diretamente à placa mãe do computador. E qualquer deslize pode ser fatal.)

Fonte: TemaDigital.com.br