Porta Paralela em C#.pdf IFSP Automação

Porta Paralela em C#.pdf IFSP Automação

(Parte 1 de 3)

Dicas de Porta Paralela

O modelo tradicional de porta paralela, utilizado desde os tempos do XT, é conhecido como "normal" ou SPP (Single Parallel Port). Possui taxa de transferência de 150 KB/s e é unidirecional. Para a conexão micro-micro ou na conexão de equipamentos externos (como o ZIP Drive), o sistema usa transmissão 4 bits por vez, utilizando sinais de retorno como "busy", "paper out", etc. Este sistema só funciona bem mesmo com impressoras. Para a conexão de ZIP drives e até mesmo impressoras mais rápidas, a porta paralela tradicional é muito lenta, sobretudo porque é unidirecional e utiliza apenas 4 bits de retorno (ou seja, transmite a 8 bits, porém recebe informações a 4 bits por vez).

Para resolver este problema, foi desenvolvida a porta paralela avançada ou EPP

(Enhanced Parallel Port). Este modelo de porta paralela é bidirecional e atinge uma taxa de transferência de 2 MB/s. Entretanto, para atingir esta taxa, necessita de um cabo especial, pois o cabo tradicional só comporta uma taxa de até 150 KB/s. Este cabo é conhecido no mercado como "cabo bidirecional", sendo que sua verdadeira característica não é ser bidirecional, mas sim permitir altas taxas de transmissão.

Aumentar a taxa de transferência trouxe um problema: a necessidade de mais atenção por parte do processador. Para resolver isto, desenvolveu-se a porta paralela ECP (Enhanced Capabilities Port). Ela é igual a EPP porém utiliza um canal de DMA, que faz com que a transmissão e recepção sejam feitas sem a intervenção do processador, aumentando o desempenho do micro.

Todos os micros novos possuem porta paralela na própria placa-mãe ("on board"), permitindo que você, através do setup do micro, configure-a a trabalhar em qualquer um dos três modos de operação. O modo que você deverá trabalhar depende do caso. A maioria dos periféricos conectados na porta paralela aceitam somente o modo normal (SPP). Alguns outros periféricos, como é o caso do ZIP Drive, funcionam perfeitamente no modo normal, mas terão sua taxa de transferência (ou seja, seu desempenho) aumentada sensivelmente se o modo da porta paralela for EPP ou ECP. Outros periféricos, como é o caso das impressoras HP série 800 e Epson Stylus Color I, necessitam obrigatoriamente que a porta paralela esteja operando em modo EPP ou ECP, necessitando, portanto, do tal "cabo bidirecional".

Controle de dispositivos externos através da porta paralela utilizando C#

Antes de começarmos precisamos entender alguns conceitos importantes. Porta Paralela Modos de Operação A porta paralela atualmente possui três modos de operações. São eles:

SPP – bits de dados unidirecional EPP – bits de dados biderecional ECP – bits de dados bidericional

Estes modos de operação são configurados pelo BIOS Setup. A diferença entre EPP e ECP é que esta última utiliza DMA(acesso direto a memória).

Endereços da Porta Paralela

Para enviarmos ou recebermos dados da porta paralela precisamos saber o seu endereço base.

Nome da Porta no SO Endereço LPT1 378 hexadecimal / 8 decimal LPT2 278 hexadecimal / 632 decimal

Pinagem Pinagem da porta paralela DB-25.

A pinagem no conector DB25 é dividida em três grupo, são eles:

1. Pinos de Dados (Data Register) 2. Pinos de Controle (Control Register) 3. Pinos de Status (Status Register)

Em nosso projeto utilizaremos apenas os pinos de dados (D0 a D7) para controlar dispositivos externos. E como estaremos apenas enviando sinal de saída (unidirecinoal), o projeto funcionará independente do modo de operação definido no BIOS Setup.

Observe também que D0 a D7 representam 8 bits (1 byte). Então o valor de saída pode variar entre 0 (0 decimal) e 1(255 decimal).

Software

Bem, agora que já temos um embasamento técnico sobre o hardware da porta paralela, iremos nos concentrar no software que irá controlá-la.

Nos sistemas operacionais da família Windows 9x , a maioria das linguagens de programação acessavam com facilidade a porta paralela através de funções nativas da própria linguagem ou via código assembler.

Sistemas operacionais como o Windows NT/2000/XP não permitem o acesso direto a este tipo de porta. Nesse caso é necessário um driver de sistema.

Para contornar este problema usaremos a Inpout32.dll que pode ser adquirida em http://www.logix4u.net/.

Veja o funcionamente básico da Inpout32.dll na figura abaixo:

A Inpout32.dll possui duas funcões: Out32 e Inp32. A primeira para escrever um valor (byte) num endereço de I/O e a segunda para ler um valor (byte) de um endereço de I/O.

Como não se trata de uma dll .NET devemos utilizá-la como Código Não-Gerenciado (UnManage Code).

Aplicativo

Vamos então ao nosso software. Inicie o VS.NET e crie uma nova aplicação C# Windows Forms.

Vamos então criar uma classe de nome Paralela.cs para manipular a dll. Veja figura abaixo.

Escreva o seguinte código para a classe:

using System; using System.Runtime.InteropServices; namespace automacao { /// <summary>

/// Summary description for Paralela.

/// </summary> public class Paralela {

// Escreve um byte no endereço

[DllImport("Inpout32.dll", EntryPoint="Out32")] public static extern void Escrever(int endereco, byte valor);

// Lê um byte do endereço [DllImport("Inpout32.dll", EntryPoint="Inp32")] public static extern byte Ler(int endereco); }

Não esqueça de declarar o namespace que permite a utilização de dlls não gerenciadas.

using System.Runtime.InteropServices;

Embora o nosso projeto utilize apenas o método de escrita (enviar dados para um dispositvo externo), decidi importar também o método de leitura. Então nossa classe possuirá dois métodos estáticos que são:

public static extern void Escrever(int endereco, byte valor); public static extern byte Ler(int endereco);

Como deu pra perceber os endereços são do tipo inteiro e o valor escrito/lido do tipo byte. Dessa forma podemos garantir que o valor lido/escrito estará sempre entre 0 e 255.

Agora vamos retornar ao nosso formulário e deixá-lo conforme a figura abaixo:

Vamos definir o seguinte código para o botão Escrever: private void btnEscrever_Click(object sender, System.EventArgs e)

{ int endereco = Convert.ToInt32(txtEndereco.Text.Trim(), 16); byte dados = Convert.ToByte(txtDados.Text.Trim(), 2);

Paralela.Escrever(endereco,dados);

MessageBox.Show("O byte " + txtDados.Text.Trim() + " foi enviado para o endereço " + txtEndereco.Text.Trim() , "Automação"); }

Observe que utilizamos os métodos estáticos da classe Convert para converter os valores fornecidos para inteiro e byte.

Pronto! Com isso nossa aplicação já está pronta para enviar dados para a porta paralela. Para testarmos nossa aplicação vamos construir um hardware bem simples.

Hardware

Como o nosso objetivo é apenas didático, iremos montar um circuito com 8 leds que serão acionados de acordo com a saída de dados de nossa aplicação. Observe que nada impede de utilizarmos um circuito com relés para acionar dispositivos mais potentes. Aconselho a pedir a ajuda de um técnico caso você não possua conhecimentos em eletrônica suficientes para montar o circuito. Se não desejar montar o circuito você poderá medir com um multímetro os valores de tensão diretamente nos pinos da porta paralela. Onde:

(Parte 1 de 3)

Comentários