terça-feira, 27 de janeiro de 2015

Duplicador de Eprom

DUPLICADOR DE EPROM


Há muito tempo eu precisava fazer uma cópia de uma EPROM (a do NESTOR, pois eu tenho duas placas) e como não tenho gravador de EPROMs, resolvi fazer um circuitinho bem simples e barato para fazer essa duplicação.
Estudando um pouco o processo de gravação de uma 2716, apenas necessitamos de uma fonte de 25V para o pino Vpp (além evidentemente de uma de 5V para alimentação normal) e gerar pulsos de 50ms com amplitude de 5V, estando os dados e o endereço de gravação presentes nos respectivos barramentos da EPROM.
A ideia é gerar os endereços automaticamente e fazer com que os dados da EPROM original sejam jogados no barramento de dados da EPROM cópia. Os bits de endereço serão iguais nas duas EPROMs.
Para gerar esses endereços, nada melhor do que um microcontrolador e para isso escolhi o PIC 16F628 que possui o número de portas suficiente para gerar os 11 bits de endereço necessários (na verdade eu deixei 12 portas reservadas pra isso) e mais o sinal de pulso de programação, um de controle de chip enable (da EPROM original) e dois botões para comando (um de reset do PIC e outro para iniciar a programação). Como o 16F628 tem oscilador interno, não preciso usar cristal externo e disponibilizo assim 16 portas no total, justinho para o que preciso.
O firmware que escrevi é bem simples: inicializo o PIC e fico esperando o aperto do botão PROGRAMA, que simplesmente habilita a EPROM original abaixando a linha de CE (chip enable ou select), e um contador de endereços de 0 a 2047 (capacidade de endereços da 2716). A cada endereço, jogo um pulso de 50ms no pino PGM da EPROM cópia (que também faz acender um led indicando que a programação está em curso), incremento o endereço e repete-se o ciclo até a contagem chegar a 2047. Ao final desabilita-se o CE e termina o programa.

O esquema é o seguinte:



O firmware para o PIC 16F628:
:10000000412883178001840AFF3E031D02283C28F3
:10001000A301A200FF30A207031CA307031C3C2876
:100020000330A100DF3016200A28A101E83EA0001D
:10003000A109FC30031C1F28A00703181C28A007D7
:100040006400A10F1C2820182528A01C29280000C6
:1000500029280800A2000530A80023082102031D5A
:10006000332822082002043003180130031902301B
:100070002805031DFF303C288313031383126400FB
:1000800008008316303085008601831207309F00F8
:10009000860180308500C830082020308400603020
:1000A0000220A03084005030022020308400303004
:1000B00001206400051A5D285E284B283808860058
:1000C00039180514391C0510B9188514B91C851088
:1000D00039190515391D0511B9198515B91D851170
:1000E0008513013008200517323008200513B80A9F
:1000F0000319B90AA0010830A1003908A300380883
:100100002A20031D842885285E28851785286300FA
:0201100087283E
:02400E00703F01
:00000001FF


Eu fiz a montagem em protoboard, por isso a bagunça de fios que mal dá pra ver as memórias e o PIC. Pra ajudar eu coloquei um 74LS244 (buffer octal) e 8 leds pra visualizar os dados (eles ficam piscando a medida que a cópia acontece) e saber que a coisa funciona. Ao final, posso pegar a cópia e colocar no lugar da original e ver se a gravação foi feita, basta apertar o botão PROGRAMA.

A seguir a versão e as ligações para duplicar uma 2732A. As diferenças são que a tensão Vpp de programação deve ser de 21V e o pulso de programação também é de 50ms, mas um pulso negativo (ativo em nível baixo). Adicionalmente, a linha de endereço A11 precisa ser usada (ela é de 4kbytes).

E o firmware para o PIC 16F628:

:10000000412883178001840AFF3E031D02283C28F3
:10001000A301A200FF30A207031CA307031C3C2876
:100020000330A100DF3016200A28A101E83EA0001D
:10003000A109FC30031C1F28A00703181C28A007D7
:100040006400A10F1C2820182528A01C29280000C6
:1000500029280800A2000530A80023082102031D5A
:10006000332822082002043003180130031902301B
:100070002805031DFF303C288313031383126400FB
:1000800008008316303085008601831207309F00F8
:100090008601C0308500C8300820203084006030E0
:1000A0000220A03084005030022020308400303004
:1000B00001206400051A5D285E284B283808860058
:1000C00039180514391C0510B9188514B91C851088
:1000D00039190515391D0511B9198515B91D851170
:1000E0008513013008200513323008200517B80A9F
:1000F0000319B90AA0011030A1003908A30038087B
:100100002A20031D842885285E28851785286300FA
:0201100087283E
:02400E00703F01
:00000001FF