Informações sobre o curso.
LPTInit
Inicialização involuntária
Por: Antônio Rogério Messias
Página 1 de 1     Home  Índice  
RESOLVENDO O PROBLEMA DA INICIALIZAÇÃO INVOLUNTÁRIA DA PORTA PARALELA INDUZIDA PELA BIOS E O SISTEMA OPERACIONAL AO LIGAR O COMPUTADOR
Para uso particular ou educacional.
Copyright(c) 1999-2006 ROGERCOM.COM
Todos os direitos reservados.


 
      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 impre
ssora. 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.

Download do programa (LptInit.zip) 208Kb.
Se o programa for rodar no Windows NT, 2000 ou XP, faça download do driver clicando aqui


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.




Volta à página principal. 
 

Índice dos artigos.

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