Esse artigo faz parte da revista Clube Delphi Edição 100. Clique aqui para ler todos os artigos desta edição

TR>

·         Breve histórico de acesso ao hardware em diferentes versões do Windows;

·         Acesso ao hardware através de funções em Assembly;

·         Acesso ao hardware através de dlls como o InpOut32.dll;

·         Detalhes sobre LCDs (Arquitetura e Funcionamento);

·         Construção de uma classe de controle de LCDs (THD44780);

·         Projeto de um programa de Controle de LCDs.

Qual a finalidade?

·         Controle e manipulação de LCDs do tipo HD44780 pela porta paralela.

Quais situações utilizam esses recursos?

·         CaseModding, hobbistas de eletrônica e projetos de interfaceamento de dispositivos eletrônicos.

 

Resumo do DevMan

         Durante a época do MS-DOS e Windows 3.1, 95  e 98 tínhamos como desenvolver facilmente programas para envio de informações ao hardware utilizando diversas linguagens. Uma delas era o próprio Delphi em sua primeira versão. A utilização da porta paralela para interfacear hardware era comum, porém, hoje, nos deparamos com um grande problema: a dificuldade em se enviar comandos para a porta paralela usando programas de modo usuário.

         Nesse artigo veremos como fazer uso do Delphi e do componente LPTPort para criar um exemplo que manipula um display de LCD.

 

Engenheiros, hobbistas e outros interessados em utilizar o computador para manipular hardware externo, durante muito tempo utilizaram o Turbo Pascal e o Delphi 1, pois estas ferramentas possuíam uma combinação de poder e velocidade de compilação, facilitando o interfaceamento de circuitos e outros dispositivos eletrônicos. Esta flexibilidade e poder de programação eram ótimos em DOS, também no Windows 3.1 e Windows 95 com o Delphi 1, que possuía comandos de acesso as portas do PC. Mas a partir do Delphi 2 em diante, juntamente com o Windows NT, a manipulação direta do hardware não é mais permitida e devido a isto o acesso nativo ao hardware pelas linguagens visuais modernas foi retirada.

Neste artigo faremos uma revisão dos métodos mais utilizados para acesso ao hardware através do Delphi, e mostrar todas as formas utilizadas de acesso ao hardware através da evolução do Windows e do Delphi. E para demonstrar as capacidades de controle do Delphi controlaremos um LCD de 16x2 pela porta paralela (Figura 1) utilizando o componente LPTPort.

 

Nota DevMan

A porta paralela é uma ferramenta de controle simples e barata para construção de dispositivos e projetos. A simplicidade e facilidade de programação fazem da comunicação paralela a mais popular dos hobbistas eletrônicos, ela também é utilizada em robôs controlados por computador, programadores de micro controladores, automação doméstica, etc, por isso sua utilização nesse artigo é indispensável, visto que conseguiremos elaborar um exemplo simples, mas bastante detalhado.

 

 

Figura 1. Interfaceamento de módulos LCD

 

A saga do acesso ao hardware

No final dos anos 80, caso alguém desejasse acender LEDs através do computador teria de ligá-los a um cabo de impressora, e escrever um programa que alterasse o valor armazenado em um endereço específico de memória (no caso o endereço da porta paralela). Em Turbo Pascal era possível utilizar o comando Port a seguir:

 

Port[Endereço] := Valor;

 

Este comando funcionava sem dificuldades nas primeiras versões do Windows e Delphi 1, já que o Delphi 1 era 16 bits e até meados de 1995 ainda possuía um comando Port de 8 bits e PortW de 16 bits. Então o Windows ficou “melhor”. Acesso direto a localizações específicas se tornou uma má idéia, e a partir do Delphi 2 o comando foi retirado. Apesar de não ser mais comercializado, o Delphi 1 acompanha versões subseqüentes do Delphi. Em sua primeira versão é possível produzir programas que rodam nas versões 3.1, 95 e 98 do Windows, porém nada de Windows NT 4.0.

A partir da versão 2 em diante, ainda era possível acessar o hardware do computador de forma direta através de instruções em assembly como na Listagem 1.

 

Listagem 1. Código para escrita e leitura na porta paralela nas versões do Windows 95 e 98

procedure WritePort(Port: word; Value: byte);

asm

 push word ptr Port

 mov al, Value

 pop dx

 out dx, al

end;

 

function ReadPort(Port: word): byte;

asm

 mov dx, Port

 in al, dx

end;

 

Nota: Essas funções, WritePort e ReadPort, funcionavam apenas nas versões do Windows 95 e 98.

 

A título de curiosidade, veja que o cabeçalho das funções é Delphi, mas o corpo em si é todo Assembly. Inclusive diversas funções que utilizamos no dia-a-dia são desenvolvidas em Assembly, como IntToStr, por exemplo.

 

A era das restrições

Como vimos, escrever programas para controlar a porta paralela no tempo do velho MS-DOS era muito simples, assim como na época do Windows 95/98. Podíamos utilizar as funções WritePort e ReadPort sem nenhuma restrição. Mas ao entrar na nova era do Windows NT, 2000 e XP, toda esta simplicidade foi retirada. E com certeza, se em alguma ocasião você já tentou controlar as portas do PC em Windows NT, deve ter se deparado com problemas.

Quando tentamos rodar um programa que utiliza funções convencionais de acesso ao hardware nestas versões Windows, o sistema operacional mostrará uma mensagem de exceção de instrução privilegiada (Figura 2).

 

Figura 2. Mensagem erro durante uma tentativa de acesso ao hardware

 

Sendo um sistema operacional seguro, o Windows NT confere alguns privilégios e restrições aos diferentes tipos de programa que operam sobre ele. Ele classifica todos os programas em duas categorias: modo usuário e modo kernel (Figura 3).

 

Figura 3. Arquitetura de acesso ao hardware em Windows NT/2000/XP

 

Os programas que geralmente criamos estão na categoria do modo usuário. Programas de modo usuário são restritos a certas instruções como entrada, saída, etc. Toda vez que um programa de modo usuário tenta executar tais instruções, o sistema operacional interrompe a execução deste programa e mostra uma mensagem de erro.

Em resumo: nossos programas de interfaceamento são interrompidos quando executam instruções de entrada ou saída para leitura ou escrita de dados na porta paralela. Mas ao mesmo tempo programas de modo kernel não são restritos de nenhuma forma ao executar tais instruções. Device drivers são capazes de rodar em modo ...

Quer ler esse conteúdo completo? Tenha acesso completo