Pesquisar este blog

quinta-feira, 9 de abril de 2015

Relógio binário de leds

Relógio Binário com PIC


Em 2004 eu bolei esse relógio binário usando um PIC 16F628 já que começaram a aparecer alguns projetos semelhantes e eu quis ter o meu. A ideia era usar leds pra representar os bits que representam números binários pra apresentar a hora e dia da semana. Passado esse tempo todo eu resolvi publicar aqui no blog pra deixar documentado e  deixar mais um projetinho bacana usando PIC.

Eu usei uma placa de acrílico transparente para servir de suporte como se fosse um painel. Tive que dobrar um pedaço usando uma pequena tocha de algodão e álcool pra amolecer a dobra e fazer a base. No fim uns furos nos cantos pra prender com os espaçadores de tubo de alumínio e parafuso. O resultado final foi esse:



Ao todo são 23 leds dispostos em uma matriz de 7 linhas por 4 colunas com acendimento multiplexado.
A leitura do relógio segue essa lógica:

Aqui um detalhe do relógio e a parte traseira:

Para ajustar o relógio, ele conta com 3 botões: set, select e incrementa. O botão set entra em modo de ajuste, o botão select escolhe qual linha vai ser ajustada (dezenas de horas, unidades de horas, dezenas de minutos, etc) e o último botão de incremento altera o valor da linha. Ao final do ajuste, aperta-se novamente o set para o relógio começar a funcionar. A alimentação é a partir de uma fonte de parede de 7 a 12Vdc.

A precisão é obtida a partir do cristal de 4MHz do oscilador principal do PIC. Muitos relógios e RTCs usam um cristal de 32768Hz no oscilador auxiliar do PIC. Eu optei por pegar a base de tempo a partir do próprio oscilador principal. Pra isso uma rotina em assembly usa o Timer1 do PIC pra gerar um estouro e uma interrupção a cada meio segundo e incrementar a variável de segundo (na verdade de meio segundo = halfsec). O resultado é que o relógio tem uma excelente precisão e depende apenas do cristal.

MOVWF wsave
SWAPF STATUS,W
CLRF STATUS
MOVWF ssave
MOVF PCLATH,W
MOVWF psave
MOVLW 221
MOVWF TMR1L
MOVLW 11
MOVWF TMR1H 'carrega valor 11x256+221=3037 no contador TMR1, falta 62499 contagens x8us=0,5s
BCF PIR1,0
INC halfsec 'o contador TMR1 estoura a cada 0,5s e incrementa a variavel
BTFSS halfsec,1
GOTO xxx
CLRF halfsec
INC unseg
xxx MOVF psave,W
MOVWF PCLATH
SWAPF ssave,W
MOVWF STATUS
SWAPF wsave,F
SWAPF wsave,W
BSF interr,0
RETFIE 

Aqui o código hexadecimal para gravar no PIC:
:02000000B42822
:10000800CA28A400400884003E082620841300055E
:100018002C1C3E06031923282408031D1B282A0824
:10002800FF3E031C24280A3030202A082428240AEA
:10003800FF3003192328240B23282B082428AD0973
:10004800AD0CAF2884178004AF2883178001840A79
:10005800FF3E031D2A28AF28A301A200FF30A207F4
:10006800031CA307031CAF280330A100DF303E2088
:100078003228A101E83EA000A109FC30031C472852
:10008800A00703184428A0076400A10F44282018DB
:100098004D28A01C5128000051280800013EA70047
:1000A8000A30A200A3017D20A70B572824080800C6
:1000B800A101A301A20002306628A101A301A200A8
:1000C80001306628A80023082102031D6D28220894
:1000D8002002043003180130031902302805031DDB
:1000E800FF30AF280038031DFF300405031DFF3023
:1000F800AF28A501A4011030A600210DA40DA50D5F
:100108002208A4022308031C230FA502031893281E
:100118002208A40723080318230FA5070310A00D1E
:10012800A10DA60B81282008AF281030A800A10136
:10013800A001A70CA60C031CA7282208A0072308C7
:100148000318230FA107A10CA00CA50CA40CA80B45
:100158009D282408AF288313031383126400080022
:1001680007309F008316F830850086012030840010
:10017800603083122A20A030840050302A2020309A
:100188008400303029200130C300E228D400030E57
:100198008301CE000A08CD00DD308E000B308F00C1
:1001A8000C10C90AC91CDA28C901D30A4D088A00EB
:1001B8004E0E8300D40E540E4C1409000330A300D5
:1001C800E8303120C0308B003530900083160C1495
:1001D8006400831253080A3C031DF428D3013F210D
:1001E80064008519F9288B13B8296400051AFD28BD
:1001F800802A7C214408A00045085C20B2004F08F2
:10020800A00050085C20B40032088400340876202E
:10021800B400B5004608A00047085C20B6003408C2
:100228003504840036087620B600B7005108A000CF
:1002380052085C20B8003608370484003808762055
:10024800B800B9004208A00001305C20BA003808A4
:10025800390484003A087620BA00BB0064003A08E2
:100268003B040319392905153A2905116400851A33
:100278003E29C201E628C80A64004808063C031D56
:100288004729C80148210800D10A640051080A3CDE
:10029800031D5029D10151210800C60A64004608EF
:1002A800063C031D5929C6015A210800CA0A05152A
:1002B800C8303020051164004A08183C031D66291F
:1002C800CA0173214A08A000A10100305220CF00C2
:1002D8004A08A000A10101305220C4000800C30A46
:1002E80064004308083C031D7B290130C300080053
:1002F800D5016400C93055020318B72964004C08B9
:10030800013C031D8929CC01E62853088600851481
:10031800023030208510480886000514023030204D
:100328000510510886000000861702303020861319
:100338000000460886000000061702303020061329
:1003480000004F0886000000861602303020861212
:10035800000044088600000006160230302006120D
:100368000000D50F7D2908004408860001303020A0
:100378000616C83030206400851AD629C40A6400DD
:100388004408033C031DD629C4010A30A600A7016E
:100398004408A200A3019920B2002508B3004F0821
:1003A8003207CA006400051ADB290612EB2905305A
:1003B800C0000830BE00AC016430AA00AB010130B7
:1003C800AD0056080520D6000318E228B8294F08C2
:1003D8008600013030208616C83030206400851A27
:1003E800122ACF0A64004F080A3C031DFC29CF01DA
:1003F8004F08A00003306120B2004408A00002307A
:100408005C20B4003208840034087620B400B500BB
:100418006400340835040319122ACF010A30A600F3
:10042800A7014408A200A3019920B2002508B3003F
:100438004F083207CA006400051A242A8612342A93
:100448000530C0000830BE00AC016430AA00AB0122
:100458000130AD0056080520D6000318E228EB2924
:1004680046088600013030200617C8303020640066
:10047800851A452AC60A64004608063C031D452A13
:10048800C6016400051A4A2A06135A2A0530C00014
:100498000830BE00AC016430AA00AB010130AD00E9
:1004A80056080520D6000318E228342A5108860089
:1004B800013030208617C83030206400851A6B2A36
:1004C800D10A640051080A3C031D6B2AD10164005B
:1004D800051A702A0613B8290530C0000830BE0076
:1004E800AC016430AA00AB010130AD00560805200C
:1004F800D6000318E2285A2A0130A300F43031202C
:100508000130C20045088600013030200616C83088
:1005180030206400851AA42AC50A64004508033CF3
:10052800031DA42AC5010A30A600A7014508A20098
:10053800A3019920B2002508B30050083207CB0068
:100548006400051AA92A0612B92A0530C000083025
:10055800BE00AC016430AA00AB010130AD00560802
:100568000520D6000318E228802A500886000130AA
:1005780030208616C83030206400851AE02AD00A58
:10058800640050080A3C031DCA2AD0015008A00084
:1005980003306120B2004508A00002305C20B4009E
:1005A8003208840034087620B400B50064003408AA
:1005B80035040319E02AD0010A30A600A70145082E
:1005C800A200A3019920B2002508B3005008320701
:1005D800CB006400051AF22A8612022B0530C000EF
:1005E8000830BE00AC016430AA00AB010130AD0098
:1005F80056080520D6000318E228B92A47088600BD
:10060800013030200617C83030206400851A132BBB
:10061800C70A64004708063C031D132BC701640082
:10062800051A182B0613282B0530C0000830BE0009
:10063800AC016430AA00AB010130AD0056080520BA
:10064800D6000318E228342A5208860001303020E8
:100658008617C83030206400851A392BD20A640006
:1006680052080A3C031D392BD2016400051A3E2B9F
:100678000613802A0530C0000830BE00AC01643083
:10068800AA00AB010130AD0056080520D6000318BA
:08069800E228282B63004E2B21
:02400E00053F6C
:00000001FF

E o esquema elétrico do relógio:

E um filminho mostrando o relógio contando o tempo:





sábado, 14 de fevereiro de 2015

Teste free run de microprocessadores

Como Testar Microprocessadores Antigos

Há alguns dias recebi uma mensagem pedindo ajuda para testar o funcionamento de microprocessadores Z80.  Pra isso eu tenho computadores que tem o Z80 como CPU e basta retirá-lo do soquete, inserir o Z80 em teste e ligar o computador pra ver se funciona. Mas o autor da mensagem não tinha esse recurso, portanto precisa de um circuito bem básico para testar os integrados. Eu sugeri que ele montasse um circuito que achei na internet, que usava um artifício de fazer o microprocessador executar apenas instruções NOP (no operation), dessa forma o microprocessador vai incrementando o contador de programa (PC - program counter) e jogando o endereço no barramento de endereços em busca de novas instruções para executar.  Se alimentarmos o microprocessador com um clock decente e fazer pullup e pulldown em alguns sinais de controle, o microprocessador começa a funcionar e podemos ver isso monitorando os sinais na barra de endereços altos (os baixos vão piscar muito rapidamente, dependendo da frequência de clock).
O site em questão é esse:
http://www.z80.info/z80test0.htm

E o esquema do circuito mínimo proposto pelo autor é assim:

Não cheguei a montar e experimentar esse circuito, mas eu tenho outros microprocessadores que eu gostaria de testar o funcionamento. Pesquisando mais um pouco, achei esse site com um projeto de um computador básico usando o microprocessador 8085 da Intel:
http://saundby.com/electronics/8085/index.shtml

O projeto é descrito passo a passo, e nos primeiros ele também faz o 8085 rodar em "free running", executando instruções NOP e verificando a alteração no contador de programa através de monitoramento das linhas de endereço altas.
Eu montei o circuito conforme esse esquema (na verdade os pinos de endereço alto foram ligados a um buffer 74LS245 que aciona os leds):
Fiz a montagem no meu protoboard que já tem alguns circuitos de infraestrutura e usei uma plaquinha com oscilador e divisores de frequência para fornecer o clock para o 8085A. Um detalhe: o 8085 precisa de dois sinais de clock, sendo um invertido em relação ao outro, logo o sinal passa também por uma porta inversora 74LS04 antes de entrar no pino X2.


Vídeo do teste do 8085A
http://youtu.be/2wEv_p6LGJ8
Descobri que tenho um 8085A pifado ...

E no mesmo site havia um circuito para testar também o CDP1802 que é outro microprocessador de 8 bits.
O circuito que eu montei foi o seguinte:


A complicação no 1802 é que o op code da instrução NOP não é $00 como no Z80 ou 8085, mas o código $C4  (1100 0100), portanto as linhas de dados precisariam ter esses bits como entrada. Os resistores ligados  em 5V fazem o bit 1 e os resistores ligados ao terra fazem o bit 0. As linhas de endereçamento foram ligados também ao buffer 74LS245 para acionamento dos leds.



Vídeo do CDP1802
http://youtu.be/oLWaoay9sSI
Dessa vez, todos meus CDP1802 funcionaram.  :o)




quinta-feira, 12 de fevereiro de 2015

Computador Nestor 2

NESTOR 2

Faltava eu colocar mais informações e fotos sobre o Nestor 2, projeto de microcomputador com Z80 da revista Nova Eletrônica, com repaginação do Victor Trucco e firmware adaptado pelo Fábio Belavenuto.

Inicialmente eu até tentei montar e testar em protoboard, mas não funcionou a tentativa. Além de ficar muito confuso e sujeito a falhas e mau contato. Vejam a bagunça:
Começou a faltar fiozinho pra fazer as ligações e meu protoboard não foi suficiente para colocar as teclas, portanto o que me levou a montar o Nestor 2 na placa de circuito impresso.

As fotos a seguir são da sequência de montagem:
 
 Placa com os resistores soldados.

Com os botões colocados.

 
Colocação dos soquetes de cis e para os displays e jacks do cassete.

Com os displays de sete segmentos (vermelhos).


 
Quase no final, com os transistores.

Com o conector de força e o cristal (soquetado).
Cristal de 4MHz.


Placa toda montada, com os integrados e ligada com os displays vermelhos. Na verdade, eles ficaram muito fracos na luminosidade, então substitui pelos verdes que vieram no kit, e que são de brilho mais intenso.


A seguir, mostro algumas das funções e como funciona o teclado:
Existem 24 teclas: 16 com os dígitos hexadecimais de 0 a F, e 7 teclas para funções. A primeira tecla é a "P" de permissão. Ela serve para entramos com dados de endereço. Ao apertarmos P, os quatro dígitos da esquerda e os dois da direita se apagam e podemos entrar com um endereço de 4 dígitos hexadecimais ($0000 a $FFFF, ou 0 a 65535 decimal, que é o máximo de endereços de memória que o Z80 pode acessar). Digitando 0000, e em seguida apertamos "L" de leitura, podemos ver o dado nessa posição de memória.


Nestor com displays verdes e mostrando o conteúdo do endereço $0000, que tem $31 (EPROM). Podemos alterar o conteúdo da posição de memória (desde que seja RAM), apenas digitando-se os novos dados no teclado. As informações digitadas correm da direita para esquerda continuamente, de forma que não é necessário se apagar se houver erro na digitação.

As teclas -1 e +1 apenas decrementam ou incrementas a posição de memória em uma posição. 
Apertando +1, o endereço aumenta de 1.





A tecla "R" faz rodar o programa em assembly que estiver no endereço de memória mostrado no display. Esse é um programa na EPROM que mostra uma palavra.

 A tecla "ER" faz com que o conteúdo dos registradores internos do Z80 sejam mostrados.
Inicialmente o valor do registrador A (acumulador).

Apertando ER novamente, mostra o registrador B.

Mais uma vez o ER, e aparece o registrador C. Em sequência serão apresentados os registradores D, E, H, L, F (flags) e I, depois retornando ao acumulador.

 Por fim, a tecla IV, é para definir uma interrupção vetorizada.


Quem precisa de Raspberry Pi ou Arduino ? Isso é para os fracos. Os fortes programam em assembly,  digitando diretamente os opcodes em hexadecimal na mão (he he he).


Até é possível fazer montagens experimentais e interligação com protoboard (como fazem com Arduino e Raspberry Pi) graças ao conector em barra com os sinais do Z80 disponíveis.

Aqui os esquemas do Nestor:
Circuito de geração de clock, circuito de reset e pullups de alguns pinos do Z80. Como eu coloquei um soquete para o cristal, isso permite que eu mude a frequência do clock apenas trocando o cristal. Eu coloquei um cristal de 2MHz para testar alguns Z80 (de 2,5MHz de clock máximo) e com o Z80A deixei com cristal de 4MHz (o original da revista era um de 3,58MHz).

As memórias usadas foram uma 2732 de 4kbytes em EPROM e uma RAM estática 62256 de 32 kbytes.

Circuito de decodificação e seleção de memórias e entrada e saída. O 74LS138 decodifica e seleciona quais chips de memória serão acessados. Os sinais de entrada são: endereços de A13 a A15 e MREQ (pedido de memória). Isso significa que o 74LS138 aciona blocos de memória de 8kbytes em cada saída. A primeira saída aciona a EPROM de 4kbytes ($0000 a $0FFF) sendo que a EPROM fica espelhada nos endereços de $1000 a $1FFF). A RAM fica no espaço de endereços de $2000 a $9FFF, para isso 4 saídas do 74LS138 são combinadas com portas E do 74LS08.

A habilitação de entrada e saída é feita combinado os sinais IORQ (pedido de entrada e saída) com os sinais WR e RD (write e read).

Circuitos de portas de entrada e saída, habilitadas pelos sinais combinados no esquema anterior. Para isso as entradas passam por buffers tri state 74LS126 e os dados de saída ficam disponíveis e guardados em latches 74LS75. Existem dois barramentos de acesso na placa.

Circuito do teclado matricial, acionado por portas de entrada semelhantes ao esquema anterior e usando buffers tri state 74LS126.

Circuito dos displays de catodo comum multiplexados.

Circuito da interface de cassete (gravação e leitura) e do alto falante.

E aqui o firmware a ser gravado na EPROM com o programa monitor básico e de cassete.
:1000000031009CC5D5E5F521E69B36192169001123
:10001000E79B010600EDB031E49B21E79B06001E43
:10002000063E01CD960079871DC2230078FE00CAE6
:10003000170021E79BCDA2007AD303DB01FE00C2AB
:100040003200CDC300CDDE00FE17C25000C3000851
:10005000FE15CA7D00FE10DA8900CDF60021E69B70
:100060007EC36F000000C3F29BC8869287C0CE217A
:100070003203856F7E4F3E0A856F6E61E921E69BF4
:100080007EFE15CAF601C35A0021E69B7EFE15CA04
:10009000070200C35D004FCDAF00DB01FE00C84783
:1000A00051C90E063E01CDAF00870DC8C3A600F5AD
:1000B000D3037ED301D91100011B7AB3C2B900D991
:1000C00023F1C90E003E01BACADC00870E08BACA85
:1000D000DC00870E10BACADC00C3170051C91E0825
:1000E0000E003E01B8CAF1000C871DC2E400C31720
:1000F0000079824700C921E69B70C90E0621E69B64
:10010000361721E79B36FF230DC205013600233643
:1001100000233600C3170021EE9B78ED6F23ED6FAF
:10012000CD5A01C31700CD480121E69B361821EFB7
:100130009BCD5A01C31700CD480178ED6F7E122187
:10014000EF9BCD5A01C3170021EE9B5E23561A2B5D
:100150002B77E521E69B3618E1C901E79BCD7601B7
:100160002BCD76012BCD7601C921EE9B7323722B0B
:100170002B1A77C9FFFF7EE521F09B77AFED6FCD9E
:100180008E010203AFED6FCD8E010203E1C9D511DF
:100190009701835F1AD1C9C0F9A4B0999282F880FF
:1001A000908883C6A1868ECD480113CD690121EFC9
:1001B0009BCD5A01C31700CD48011BCD690121EF2A
:1001C0009BCD5A01C31700FFFFFF3EFFD3033E7FC5
:1001D000D30121ED9B36C331F89BF5E5D5C531E45C
:1001E0009BC3ED9B21E59B36FEC3F60121E79B36C1
:1001F000FF2336FF23C911060321E59B34347B8698
:100200005F1A6F131A67E921E59B111D037B86C3F3
:100210000002CDEC0136882336B721F99BC32002BA
:1002200001EB9BCD7601C3170021F99B78ED6FC3DD
:100230002002CDEC0136832336B721FF9BC3200279
:1002400021FF9B78ED6FC32002CDEC0136C623362B
:10025000B721FE9BC3200221FE9B78ED6FC32002D5
:10026000CDEC0136A12336B721FD9BC3200221FD31
:100270009B78ED6FC32002CDEC0136862336B72183
:10028000FC9BC3200221FC9B78ED6FC32002CDECC8
:100290000136892336B721FB9BC3200221FB9B78C3
:1002A000ED6FC32002CDEC0136C72336B721FA9B90
:1002B000C3200221FA9B78ED6FC32002CDEC0136FA
:1002C0008E2336B721F89BC3200221F89B78ED6F6F
:1002D000C32002ED5721F79B77CDEC0136F9233689
:1002E000B721F79BC3200221F79B78ED6F7EED4786
:1002F000C3200201F29B3EC3020321EE9B7E020358
:10030000237E02C317001202320249026002770202
:100310008E02A502BC02D3021A03C3E401290240E3
:100320000257026E0285029C02B302CA02E702FF74
:10033000FFFF0000000000000000000000000000BF
:10034000000000010101010102010100FB26B7A725
:10035000CAE4F31737170000000000000000000097
:10036000000000000000000000000000000000008D
:10037000000000000000000000000000000000007D
:10038000000000000000000000000000000000006D
:10039000000000000000000000000000000000005D
:1003A000000000000000000000000000000000004D
:1003B000000000000000000000000000000000003D
:1003C000000000000000000000000000000000002D
:1003D000000000000000000000000000000000001D
:1003E000000000000000000000000000000000000D
:1003F00000000000000000000000000000000000FD
:1004000000000000000000000000000000000000EC
:1004100000000000000000000000000000000000DC
:1004200000000000000000000000000000000000CC
:1004300000000000000000000000000000000000BC
:1004400000000000000000000000000000000000AC
:10045000000000000000000000000000000000009C
:10046000000000000000000000000000000000008C
:10047000000000000000000000000000000000007C
:10048000000000000000000000000000000000006C
:10049000000000000000000000000000000000005C
:1004A000000000000000000000000000000000004C
:1004B000000000000000000000000000000000003C
:1004C000000000000000000000000000000000002C
:1004D000000000000000000000000000000000001C
:1004E000000000000000000000000000000000000C
:1004F00000000000000000000000000000000000FC
:1005000000000000000000000000000000000000EB
:1005100000000000000000000000000000000000DB
:1005200000000000000000000000000000000000CB
:1005300000000000000000000000000000000000BB
:1005400000000000000000000000000000000000AB
:10055000000000000000000000000000000000009B
:10056000000000000000000000000000000000008B
:10057000000000000000000000000000000000007B
:10058000000000000000000000000000000000006B
:10059000000000000000000000000000000000005B
:1005A000000000000000000000000000000000004B
:1005B000000000000000000000000000000000003B
:1005C000000000000000000000000000000000002B
:1005D000000000000000000000000000000000001B
:1005E000000000000000000000000000000000000B
:1005F00000000000000000000000000000000000FB
:1006000000000000000000000000000000000000EA
:1006100000000000000000000000000000000000DA
:1006200000000000000000000000000000000000CA
:1006300000000000000000000000000000000000BA
:1006400000000000000000000000000000000000AA
:10065000000000000000000000000000000000009A
:10066000000000000000000000000000000000008A
:10067000000000000000000000000000000000007A
:10068000000000000000000000000000000000006A
:10069000000000000000000000000000000000005A
:1006A000000000000000000000000000000000004A
:1006B000000000000000000000000000000000003A
:1006C000000000000000000000000000000000002A
:1006D000000000000000000000000000000000001A
:1006E000000000000000000000000000000000000A
:1006F00000000000000000000000000000000000FA
:1007000000000000000000000000000000000000E9
:1007100000000000000000000000000000000000D9
:1007200000000000000000000000000000000000C9
:1007300000000000000000000000000000000000B9
:1007400000000000000000000000000000000000A9
:100750000000000000000000000000000000000099
:100760000000000000000000000000000000000089
:100770000000000000000000000000000000000079
:100780000000000000000000000000000000000069
:100790000000000000000000000000000000000059
:1007A0000000000000000000000000000000000049
:1007B0000000000000000000000000000000000039
:1007C0000000000000000000000000000000000029
:1007D0000000000000000000000000000000000019
:1007E0000000000000000000000000000000000009
:1007F00000000000000000000000000000000000F9
:100800003E0032599B214B0A115A9B010600EDB064
:10081000215A9B06001E063E01CD960079871D20B9
:10082000F878FE0028EA215A9BCDA2007AD303DB98
:1008300001FE0020F1CDC300CDDE00FE14CA640825
:10084000FE103810FE132803C310083A599BFE000F
:10085000CA5B09C73A599BFE00282FFE012830FECB
:10086000022831C73A599BFE002809FE012810FED4
:10087000022844C721510A3E0132599BC30808216E
:10088000570A3E0232599BC3080821509B18082181
:10089000529B180321549B3EFF325E9B325F9B7834
:1008A000E5ED6F23ED6F015C9BE1CD760123015AED
:1008B0009BCD7601C310083EFFD3033EF7D301CD95
:1008C000EC08DA2F0A32569B21A00FCD43092150A4
:1008D0009B010700CD0C0921D007CD4709CDF908B0
:1008E000CD0C0921A00FCD4709C3370ACDF908D88F
:1008F000AF86EDA1EAF108B7C921529B5E235623CA
:100900004E236669B7ED524D4403EBC95ECD16091F
:10091000EDA1EA0C09C91608B7CD2909CB1BCD29D1
:10092000091520F837CD2909C9D9260038092E081C
:10093000CD47092E0218072E04CD47092E04CD43BA
:1009400009D9C90E9A18020E40291101003EFFD3A1
:10095000044110FEEE01ED5220F5C93EFF325E9BD0
:10096000325F9B2A509B22579B3EFFD3033EBFD34F
:100970000121E803CDD70938F02B7CB520F6CDD77F
:100980000930FB21509B010700CDF40938DB015CE5
:100990009B21509BCD760123015A9BCD7601ED5BC7
:1009A000509B0620215A9BCDA20010F82A579B008D
:1009B000B7ED52C269093EFFD3033EFED301CDF924
:1009C00008DA2F0ACDF409DA2F0ACDEC0821569B5C
:1009D000BEC22F0AC3370A110000DB0213CB1F3837
:1009E000F93E00D304DB0213CB1F30F93EFFD304E2
:1009F0007BFE42C9AF08CD010A73EDA1EAF60908F2
:100A0000C9CD120A1608CD120ACB1B1520F8CD123B
:100A10000AC9D9210000CDD70938062D2DCBC4181D
:100A2000F52CCB4428F0CB15D9C9083708D9C921F2
:100A30003F0ACDA20018F821450ACDA20018F88679
:100A4000CECEC0FFFF8EF9C8FFFFFF87F987C1C771
:100A5000C08EC0C88786FF8EF9C888C7FF00000017
:100A60000000000000000000000000000000000086
:100A70000000000000000000000000000000000076
:100A80000000000000000000000000000000000066
:100A90000000000000000000000000000000000056
:100AA0000000000000000000000000000000000046
:100AB0000000000000000000000000000000000036
:100AC0000000000000000000000000000000000026
:100AD0000000000000000000000000000000000016
:100AE0000000000000000000000000000000000006
:100AF00000000000000000000000000000000000F6
:100B000000000000000000000000000000000000E5
:100B100000000000000000000000000000000000D5
:100B200000000000000000000000000000000000C5
:100B300000000000000000000000000000000000B5
:100B400000000000000000000000000000000000A5
:100B50000000000000000000000000000000000095
:100B60000000000000000000000000000000000085
:100B70000000000000000000000000000000000075
:100B80000000000000000000000000000000000065
:100B90000000000000000000000000000000000055
:100BA0000000000000000000000000000000000045
:100BB0000000000000000000000000000000000035
:100BC0000000000000000000000000000000000025
:100BD0000000000000000000000000000000000015
:100BE0000000000000000000000000000000000005
:100BF00000000000000000000000000000000000F5
:100C000000000000000000000000000000000000E4
:100C100000000000000000000000000000000000D4
:100C200000000000000000000000000000000000C4
:100C300000000000000000000000000000000000B4
:100C400000000000000000000000000000000000A4
:100C50000000000000000000000000000000000094
:100C60000000000000000000000000000000000084
:100C70000000000000000000000000000000000074
:100C80000000000000000000000000000000000064
:100C90000000000000000000000000000000000054
:100CA0000000000000000000000000000000000044
:100CB0000000000000000000000000000000000034
:100CC0000000000000000000000000000000000024
:100CD0000000000000000000000000000000000014
:100CE0000000000000000000000000000000000004
:100CF00000000000000000000000000000000000F4
:100D000000000000000000000000000000000000E3
:100D100000000000000000000000000000000000D3
:100D200000000000000000000000000000000000C3
:100D300000000000000000000000000000000000B3
:100D400000000000000000000000000000000000A3
:100D50000000000000000000000000000000000093
:100D60000000000000000000000000000000000083
:100D70000000000000000000000000000000000073
:100D80000000000000000000000000000000000063
:100D90000000000000000000000000000000000053
:100DA0000000000000000000000000000000000043
:100DB0000000000000000000000000000000000033
:100DC0000000000000000000000000000000000023
:100DD0000000000000000000000000000000000013
:100DE0000000000000000000000000000000000003
:100DF00000000000000000000000000000000000F3
:100E000000000000000000000000000000000000E2
:100E100000000000000000000000000000000000D2
:100E200000000000000000000000000000000000C2
:100E300000000000000000000000000000000000B2
:100E400000000000000000000000000000000000A2
:100E50000000000000000000000000000000000092
:100E60000000000000000000000000000000000082
:100E70000000000000000000000000000000000072
:100E80000000000000000000000000000000000062
:100E90000000000000000000000000000000000052
:100EA0000000000000000000000000000000000042
:100EB0000000000000000000000000000000000032
:100EC0000000000000000000000000000000000022
:100ED0000000000000000000000000000000000012
:100EE0000000000000000000000000000000000002
:100EF00000000000000000000000000000000000F2
:100F000000000000000000000000000000000000E1
:100F100000000000000000000000000000000000D1
:100F200000000000000000000000000000000000C1
:100F300000000000000000000000000000000000B1
:100F400000000000000000000000000000000000A1
:100F50000000000000000000000000000000000091
:100F60000000000000000000000000000000000081
:100F70000000000000000000000000000000000071
:100F80000000000000000000000000000000000061
:100F90000000000000000000000000000000000051
:100FA0000000000000000000000000000000000041
:100FB0000000000000000000000000000000000031
:100FC0000000000000000000000000000000000021
:100FD0000000000000000000000000000000000011
:100FE0000000000000000000000000000000000001
:100FF00000000000000000000000000000000000F1
:00000001FF



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



sexta-feira, 5 de dezembro de 2014

Coleção de Microprocessadores

Coleção de Microprocessadores


No passado eu colecionei fascículos de uma enciclopédia da antiga Rio Gráfica Editora - Microcomputador Curso Prático, que depois se tornaram dois volumes muito interessantes e ricamente ilustrados. Num dos artigos, sobre a história dos microprocessadores, havia um quadro evolutivo (até então) dos principais microprocessadores usados, quadro do qual eu tirei uma foto que é a abaixo:




Tem gente que coleciona computadores velhos, mas isso demanda muito espaço e dinheiro (tá eu tenho alguns computadores velhos ... :o)  ), então é mais fácil e barato colecionar apenas as CPUs usadas nos computadores antigos.  Dos que serviam para computadores pessoais, eu consegui os mais importantes e que contam  a história da microcomputação dos anos 1970 e 1980. Vejam a foto das minhas CPUs:


Bom, seguindo a ordem do quadro da enciclopédia, mostro as fotos das minhas CPUs e descrevo alguns equipamentos onde elas foram usadas:


Esse era o Motorola MC6800, um processador de 8 bits. Foi usado no MITS Altair 680.  O MC6800 foi projetado em 1974, mesma época do processador a seguir.


O Intel 8080 foi o segundo microprocessador de 8 bits da Intel. Esse processador influenciou toda uma família de CPUs, incluindo o Z80 da Zilog e os seus sucessores na Intel.  O 8080 foi usado no MITS Altair 8800, um dos primeiros computadores pessoais e também nos videogames Arcade, incluindo o jogo Space Invaders. Com o 8080 foi desenvolvido o sistema operacional CP/M.



Acima tenho dois 6502, que foram as CPUs dos Apple 1, Apple II, Commodore PET e eram as CPUs mais baratas na época (por isso a Apple o escolheu). Aqui no Brasil foi usado no TK2000.
A CPU menor 6507 era uma versão encolhida do 6502 e foi o processador dos videogames ATARI 2600. 




O processador seguinte da Intel foi o 8085, que era compatível com o 8080 em software, mas melhor em hardware. O 8085 foi usado no TRS-80 model 100, um precursor dos micros portáteis.



A evolução da Motorola se deu com o MC6809. Esse processador foi usado pelos TRS - Color Computer (aqui CP400).



Talvez o mais famoso dos processadores de 8 bits, o Zilog Z80 foi o processador usado em muitos computadores da época: TRS-80 (clone CP300), Sinclair ZX80, ZX81 (e os clones nacionais TK82C, TK83, TK85, Ringo, CP200), ZX Spectrum (TK90X e TK95), CP500, os MSX (aqui Hotbit e Expert) e em diversos videogames (Gameboy com LR35902 da Sharp similar ao Z80, Master System, Mega Drive). Por ser compatível com o 8080 em software, podia usar o CP/M e até no Apple II foi usado com uma placa com Z80.




Entrando na era dos 16 bits, a Intel lançou a família 8086. Na foto eu tenho os 8088 que foram os processadores dos IBM Personal Computers (PC, XT) e que levaram a Intel à liderança de mercado até os dias de hoje. O Chip com o quadrado dourado é um 8087, coprocessador matemático usado com os 8088 e 8086.  O NEC V20 era uma versão mais avançada do 8088, tinha uma performance melhor e podia emular o funcionamento do 8080. Eu tenho um laptop Toshiba T1000 com um 80C88, versão CMOS do 8088.



A Motorola também desenvolveu de processadores de maior desempenho e lançou esse chipão de 64 pernas, o MC68000 de 16 e 32 bits. Junto na foto, o MC68008 com 48 pernas, uma versão mais simples do 68000.  O 68000 foi o processador dos Apples Lisa e MacIntosh, Atari ST, Amiga e também muito usado em Workstations Unix. Foi o processador do videogames Mega Drive (junto com o Z80). O 68008 foi usado no Sinclair QL (Quantum Leap).


Esses dois processadores não estão no quadro da enciclopédia, mas eu tenho esses chips da RCA e da Harris, que são o processador CDP1802 ACE de 8 bits e tecnologia CMOS, o que faz com que eles tenham um baixo consumo de energia. Por isso foram usados em sondas espaciais e num computador chamado COSMAC ELF que saiu na revista Popular Electronics.