Arduino Lab 08 – Banco de teste para memória RAM HM6116 de 16k
Neste Lab iremos descrever a implementação de um sistema para testar antigas memórias RAM, estática, modelo HM6116LP-4 que ainda são utilizadas em equipamentos industriais. No meu caso, estas memórias estão aplicadas em uma placa de memória de um antigo sistema de CNC da Siemens denominado Sinumerik Sistema 3. Minha necessidade era testar a integridade de escrita e leitura das memórias e é este o tema deste Lab.
Funcionamento da memória
Memórias do tipo SRAM (Static Random Access Memory, memória estática de acesso aleatório) mantém os dados armazenados desde que seja mantida sua alimentação, não precisando que as células que armazenam os bits sejam atualizadas, processo usualmente chamada de refreshing, como é o caso das memórias DRAM. A estrutura básica de uma SRAM é indicada na figura abaixo.
Apesar de não ser necessária a atualização constante, essa memória ainda pode ter a característica de ser volátil, ou seja, após um tempo sem energia a informação guardada por ela pode ser perdida. Outra desvantagem é que são mais caras, complexas e menos densas, ocupando mais espaço, quando comparadas às DRAM.
Mas a vantagem de apresentar um tempo de acesso menor e, consequentemente serem mais rápidas, justifica seu uso em certos nichos, como em cache L1 e L2 presentes em processadores ea algumas aplicações muito específicas em equipamentos especiais. Além disso, as memórias estáticas consomem mais energia e aquecem mais quando comparadas com as DRAM. Memórias estáticas usam circuitos no modelo flip-flop para armazenar os dados.
A memória que estamos trabalhando neste Lab apresenta um tamanho de 2048 palavras de 8 bits. Este tamanho não é algo grande quando comparado as memorias das máquinas atuais que possuem no mínimo 1 GB para o correto funcionamento, porém, para uma máquina fabricada no ano de 1987 a associação destas memórias era a única solução para a implantação dos sistemas.
Para endereçar 2048 posições diferentes de memória são necessários 11 bits de dados. O diagrama de blocos funcional desta memória está apresentado abaixo e ilustra os 11 bits utilizados para o endereçamento, os 8 bits de dados e as 3 entradas de controle além do Vcc e Vss totalizando um encapsulamento de 24 pinos.
Dinâmica de Funcionamento do teste
Um diagrama funcional do teste da memória é apresentado abaixo. O teste é iniciado quando o usuário pressiona o botão de início (Obvio isto!). O valor a ser escrito na memória é enviado ao lado B do buffer que ainda está desabilitado. A linha de controle OE (Output Enable) da memória permanece em nível alto e o outro pino de controle WE (Write Enable) vai a nível zero. O buffer é então habilitado, permitindo a passagem do dado do lado B para o lado A habilitando assim a escrita em cada posição de memória que é incrementada com um contador binário que inicia seu valor em 0x000 e termina em 0x7FF.
Entre o incremento de cada endereço, o pino WE deve ir a nível alto e logo após a nível baixo novamente para que a escrita seja efetivada. Esta dinâmica de funcionamento é exemplificada no diagrama temporal fornecido pelo datasheet do fabricante e ilustrado abaixo.
Após a escrita dos dados para teste da memória, uma rotina de leitura em cada posição é feita e o valor é comparado com o dado que foi escrito anteriormente. Se o programa encontrar uma falha na comparação o mesmo para a execução com o comando break e o teste deve ser reiniciado novamente. Toda esta dinâmica acontece quando bloquemos o buffer levando o pino CS em nível HIGH, o pino WE da memória em nível HIGH e o pino OE em nível LOW. O diagrama temporal abaixo mostra este processo de leitura da memória em detalhe.
Quando a comparação é bem sucedida, uma rotina que apaga todos os dados escritos nas posições de memorias escrevendo o valor 0x000 em cada uma é executada.
Diagrama de ligação
O diagrama de ligações está indicado abaixo. Não há complexidade em executar estas ligações visto que todos os componentes trabalham no mesmo nível de tensão de alimentação (5Vcc).
Todo o projeto foi simulado no software Proteus antes da montagem final na protoboard. O software na versão 8.0 não atendia as minhas necessidades pois não apresentava a opção de leitura do mapa de memórias como indicado na imagem abaixo e somente a versão 7 atendia este requisito.
Os arquivos de simulação deste Lab no software Proteus estão disponíveis neste link.
Na imagem abaixo temos o detalhe do componente buffer (SNx4LS245 Octal Bus Transceivers With 3-State Outputs) e das resistências utilizadas para o Pull down dos pinos de entrada do Arduino e do botão de início do teste.
Algoritmo e testes
O algoritmo que determina todo o funcionamento desta aplicação está descrito abaixo e alguns comentários estão inseridos no corpo do código para um melhor entendimento.
[crayon-67505e6ed169f326234553/]
Um detalhe importante foi o uso do acesso direto de dados que trafegam em um Port específico do microcontrolador, neste caso os pinos 22 a 29 que representam o PORT A.
Este acesso foi importante no momento de comparação do dado escrito em posições especificas da memória e que são lidos no PORT A, graças a velocidade de leitura dos registradores de entrada do microcontrolador utilizando este método, com o dado padrão escrito na etapa de escrita do teste, que no caso foi 0x7FF.
Um vídeo explicativo sobre este lab está disponível abaixo.
Conclusão
Neste Lab implementamos um banco de testes para as antigas memórias HM6116, do tipo SRAM, que ainda são utilizadas em aplicações industriais. Além do aprendizado em programação e esquemático de circuitos eletrônicos, este Lab nos mostrou os aspectos do real funcionamento de uma memória, ainda que seja uma “primitiva”, porém funcional e ainda em operação.