O
objetivo desse artigo é apresentar uma solução
simples, econômica e eficaz para resolver o problema da
inicialização involuntária da Porta Paralela
no momento do auto-teste (POST) e após o processo de boot,
independente da versão da BIOS e do sistema operacional.
Quando ligamos um computador
ele passa por um processo conhecido como auto-teste (Power On Self
Test - POST). Toda a seqüência lógica para realizar
o auto-teste está gravada na BIOS (memória EPROM ou
FLASH) onde está escrito um programa de entrada e saída
básico para testar o hardware e carregar o Sistema Operacional
na memória. Não é somente no auto-teste
que ocorre a reinicialização da Porta Paralela, após
o processo de boot alguns Sistemas Operacionais também reinicializam
a Porta.
Como a Porta Paralela foi
projetada pela IBM para conectar uma impressora e não quaisquer
dispositivos, quando ocorre o auto-teste um serviço (programa)
gravado dentro da BIOS é executado, passando a enviar algumas
seqüências de sinais para a Porta Paralela com a finalidade
de inicializar uma impressora.
A seqüência lógica de sinais enviados para a Porta
Paralela no auto-teste depende da versão da BIOS. Testes realizados
em equipamentos contendo versões diferentes da BIOS mostram
seqüências variadas. Essa seqüência de sinais
tanto afeta o Registro de Controle como o Registro de Dados, fazendo
com que dispositivos conectados a Porta Paralela sejam involuntariamente
reinicializados ao ligar o computador, tornando o desenvolvimento
de alguns projetos especiais inviáveis através da Porta
Paralela.
Não é todo
projeto que precisa da solução idealizada neste artigo,
é somente alguns casos especiais onde o circuito não
pode parar de funcionar e fornecer serviços, mesmo que o computador
seja desligado.
O circuito descrito aqui
utiliza componentes que já foram utilizados em nossos artigos
anteriores, portanto há informação suficiente
para auxiliar-nos no desenvolvimento desse novo projeto.
A informação
enviada ao Registro de Dados só estará disponível
no circuito LptInit se a combinação correta de bits
no Registro de Controle da Porta Paralela for satisfeita, caso contrário,
nenhum sinal de dados será aceito.
O software para testar o
circuito foi elaborado para ligar e desligar 8 dispositivos simulados
através de LEDs. Esse software, além de controlar os
dispositivos, armazena em arquivo a última alteração
ocorrida nos dados enviados ao circuito, sendo assim, mesmo que desligarmos
e ligarmos o computador, o software terá a informação
do último estado dos dispositivos.
Segue abaixo, figuras, ilustrações
e animações para facilitar o entendimento de todo o
projeto.
Figura
1 - Simulação do Demultiplexador 74LS138

Na
animação acima observamos uma simulação
de funcionamento do Demultiplexador 74LS138, usado
em nosso projeto como um seletor de endereçamento, para permitir
que o LATCH 74HCT573 seja habilitado somente quando
o código binário enviado pelo Registro de Controle coincidir
com o endereço de uma das saídas (D0-D7)
do 74LS138.
Observe que somente uma
saída é habilitada por vez e estas saídas estão
invertidas em relação à entrada. Por natureza,
todas as saídas do 74LS138 estão em
nível lógico "1".
Sabemos também que
os pinos 1-Strob,
14-Auto-Feed
e 17-Slct-In
do Registro de Controle da Porta Paralela são naturalmente
invertidos. Portanto, para facilitar a programação e
trabalhar com lógica normal para habilitar o endereçamento
do 74LS138, foi acrescentado ao circuito um inversor
74LS04.
Ao ligarmos o computador
tanto a BIOS como o Sistema Operacional enviam uma seqüência
de sinais para o Registro de Controle, como já sabemos, esse
Registro tem 4 bits: C3, C2, C1 e C0 relacionados respectivamente
aos pinos 17,
16, 14
e 1 do conector DB25,
assim, com 4 bits podem ser geradas
combinações. Portanto, uma das saídas do 74LS138
só será habilitada se os bits C3, C2, C1 e C0 do Registro
de Controle forem combinados corretamente.
Para descobrimos qual
é um "bom endereço" para usarmos no software
de controle de dispositivos (LptInit), teremos que observar ao ligar
e desligar o computador, qual é a saída (S0
à S7) do Demultiplexador
74LS138 que não
será acionada. Para se fazer isso é necessário
ligar o pino 9 do 74LS04 a uma das
saídas (S0 à
S7) do 74LS138
antes de realizarmos cada teste. Se nenhum dos LEDs acender, isso
indica que descobrimos um "bom endereço", ou seja,
nem o auto-teste e nem o Sistema Operacional gerou essa combinação.
Também é bom observar ao desligar o computador, se ocorre
algum acionamento das saídas.
Figura 2 - Pinagem do inversor 74LS04

Na
figura acima temos a pinagem e o esquema das portas NOT
do CI 74LS04, usado no circuito para inverter a saída
do demultiplexador 74LS138
e os pinos 1, 14
e 17 do Registro de
Controle.
Figura
3 - Inversão do nível alto em baixo

Figura
4 - Inversão do nível baixo em alto

As
duas animações acima simulam o funcionamento de uma
porta NOT, tanto para inverter um nível alto
como um nível baixo.
Figura 5 - Esquema completo do circuito LptInit
No
esquema acima, os dados presentes nos pinos (2 ao 9)
relacionados com o Registro de Dados da Porta Paralela, só estarão
disponíveis nas saídas (12 à 19)
do LATCH 74HCT573 quando o nível lógico
no pino 11 do mesmo for
"1". Observe que o sinal que habilita/desabilita
o LATCH 74HCT573 vem de uma das saídas
do demultilexador 74LS138, passando pelo pino 9
do 74LS04 onde será invertido. A saída
do sinal ficará disponível no pino 8
que está ligado diretamente ao pino 11
do LATCH 74HCT573.
No circuito, o LATCH 74HCT573
é utilizado tanto para truncar as saídas dos dados, como
também para armazenar uma célula de memória com
tamanho de 1 byte, sendo essas características do LATCH vitais
para o funcionamento de todo o projeto.
Figura
5 - Tela do programa de controle LptInit

O
endereçamento selecionado no software acima deverá ser
idêntico ao escolhido no circuito. Foram feitos testes em dois
computadores distintos usando o Sistema Operacional windows 95 e 2000
e o endereço S5
funcionou corretamente. Portanto, faça o teste primeiro com
o endereço S5,
e se não funcionar corretamente, escolha um outro.
Quando o programa LptInit
é fechado, ele grava o status dos dispositivos e a configuração
do endereçamento num arquivo chamado Disp.txt.
Portanto, se o computador for desligado e ligado mais tarde, o programa
LptInit ao ser executado se auto-configurará
a partir dos dados gravados nesse arquivo.
Se
o programa for rodar no Windows NT, 2000 ou XP, faça download
do driver clicando
Figura 6 - Descrição do Reg. de Controle
para controlar o circuito LptInit
Algoritmo
em C++ para controlar o circuito LptInit
|
//Algoritmo
em C++ para controlar o circuito LptInit.
//Autor:
Antonio Rogério Messias
//rogercom@rogercom.com
//www.rogercom.com
//Todos os direitos reservados.
//----------------------------------------------------------------------------------------------------------------------------------------
#define BASE 0x378
//LPT1
#define DADOS BASE
#define CONTROLE BASE+2
#define
ON 8 //xxxx1xxx
- bit C3-Reg. de controle.
#define OFF 0 //xxxx0xxx
- bit C3-Reg. de controle.
//Endereço
de cada saída do Demux. 74LS138:
//CBA
#define SELECT_S0 0
//00000000
#define SELECT_S1 1
//00000001
#define SELECT_S2 2
//00000010
#define SELECT_S3 3
//00000011
#define SELECT_S4 4
//00000100
#define SELECT_S5 5
//00000101
#define SELECT_S6 6
//00000110
#define SELECT_S7 7
//00000111
unsigned char HABILITA_LATCH
= (ON+SELECT_S5);
//00001101
unsigned char DESABILITA_LATCH
= (OFF+SELECT_S5);
//00000101
//----------------------------------------------------------------------------------------------------------------------------------------------
//As instruções abaixo
liga a saída D0 do circuito LptInit:
//----------------------------------------------------------------------------------------------------------------------------------------------
outportb(DADOS,
1); //Disponibiliza
os dados na Porta Paralela (liga pino 2-D0).
//Ao executar a próxima
função, os dados da Porta Paralela ficarão
disponíveis nas saídas do LACH.
outportb(CONTROLE, HABILITA_LATCH);
//Habilita o Latch 74HCT573 - pino 11.
Sleep( 0 ); //Aguarda um
tempo para estabilizar os dados. O valor pode ser 1ms.
outportb(CONTROLE,
DESABILITA_LATCH); //Desabilita
o Latch 74HCT573 - pino 11.
//----------------------------------------------------------------------------------------------------------------------------------------------
//As instruções abaixo desligam todas as 8 saídas
do circuito LptInit:
//----------------------------------------------------------------------------------------------------------------------------------------------
outportb(DADOS,
0); //Disponibiliza
os dados na Porta Paralela (desliga todas as
saídas).
//Ao executar a próxima
função, os dados da Porta Paralela ficarão
disponíveis nas saídas do LACH.
outportb(CONTROLE, HABILITA_LATCH);
//Habilita o Latch 74HCT573 - pino 11.
Sleep( 0 ); //Aguarda um
tempo para estabilizar os dados. O valor pode ser 1ms.
outportb(CONTROLE,
DESABILITA_LATCH); //Desabilita
o Latch 74HCT573 - pino 11.
|
Como
podemos observar no código fonte acima, os dados a serem enviados
são primeiro preparados, e só depois disponibilizados
ao circuito LptInit através da instrução outportb(CONTROLE,
HABILITA_LATCH); que
habilita a escrita no LATCH.


http://www.rogercom.com
©
Copyright, 1999-2006 ROGERCOM - Antonio Rogério Messias
- rogercom@rogercom.com
Todos os Direitos Reservados - All Rights Reserved. |