terça-feira, 6 de agosto de 2013

Atualização do projeto de emulador de interface de disquete (#3)


https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZHw0fNBzg1aEjpplLKxzro_rHK8gd7tivyLPS-9BS2R_jqkP5vaLSuxM0IVRSsp8a2H5R7kiFpBvRx5MNgJrU8_7DQxehsW4YDwixj0l4qkL7RZlTIJPWwl9qCxQ9GRETzIkaqTsN2sg/s1600/Proto1.jpg


Olá,

Eu fiquei um período relativamente grande sem postar nada porque eu estava tendo uma série de dificuldades com o projeto do emulador. Acima tem as imagens da fiação no meu protoboard com a EEPROM, o PIC, o display de LCD e o CPLD instalados. Quase não dá pra ver a eeprom e o PIC de tanto fio em torno dos componentes, mas está tudo funcionando até agora. Ainda falta instalar no protoboard o cartão SD e as quatro teclas de controle.

Depois que eu descobri que o PIC18F4550 possui pinos conflitantes entre os dispositivos EUSART e MSSP eu decidi que não mais usaria um PIC no módulo de controle externo para controlar o display de LCD e as teclas de controle. Eu tinha tomado esta decisão inicialmente com o objetivo de diminuir o "overhead" sobre o PIC principal que faz a comunicação diretamente com o barramento do MSX. Desta forma a topologia do projeto mudou e o PIC agora controla as teclas de controle e o display de LCD. Eu também estava pensando em trocar o PIC por outro modelo mais moderno com mais memória e com dispositivos EUSART e MSSP não conflitantes mas decidi em insistir no mesmo PIC. Abaixo segue a imagem com a nova topologia.

Com a topologia num estágio mais maduro eu fui capaz de finalmente decidir qual será a função dos pinos do PIC. Ou seja, eu consegui distribuir o que cada pino do PIC fará.. A tabela abaixo ainda não é definitiva mas está bem próxima do que cada pino fará. Talvez eu use o pino RE3/MCLR para detecção de pressionamento de uma tecla e use um outro pino do PIC para acender e apagar um LED. O LED seria usado para indicar a presença do cartão SD no slot e também para indicar que está havendo alguma atividade no cartão. Da seguinte forma: 1) Led Apagado - Sem cartão SD, 2) Led Acesso - Com cartão SD e 3) Led piscando - O cartão SD está sendo acessado. Eu ainda não me decidi completamente porque me parece que o LED seria uma redundância desnecessária já que eu terei um LCD com as informações que o LED me dará e muito mais.


O primeiro passo... e o primeiro problema... foi para inserir o código para tratar o LCD. A PLIB da Microchip oferece o xlcd que teoricamente deveria funcionar bem com o meu display mas por algum motivo que eu desconheço não funcionou ou eu não fui capaz de fazer as funções funcionarem para mim. Então eu criei as minhas próprias funções para tratamento do LCD. Eu criei um função putch para permitir que eu use a função printf em conjunto com o LCD também. Abaixo segue uma imagem com o display funcionando. Eu usei o printf para escrever o texto abaixo e na segunda linha eu "printei" alguns caracteres customizados que eu criei para usar com o emulador. O primeiro caractere seria um disquete (não acho que ficou muito parecido com um). O segundo caractere uma pasta (também não sei se ficou muito parecida). O terceiro e o quarto representam um cadeado aberto e fechado respectivamente. E os demais caracteres seriam setas para cima e para baixo que serão usados para a navegação dos arquivos dentro do cartão SD. O disquete seria para indicar que o arquivo sendo visto é um arquivo .dsk válido e a pasta para indicar que na verdade o que estamos vendo é um pasta de trabalho. Talvez eu crie um caractere especial em formato de coração para marcar um arquivo .dsk para ser carregado por default ao ligar a interface.







O segundo passo foi fazer o PIC finalmente comunicar com o MSX via barramento. Eu estou disponibilizando todo o código na minha pasta pública do Dropbox e o link segue no final da mensagem mas eu estou listando o código da rotina de tratamento da interrupção do PIC abaixo porque me deu muito trabalho e gostaria de falar um pouco mais em detalhe sobre ela. A rotina abaixo é o coração de todo o projeto, simplesmente do seu funcionamento depende todo o restante do projeto. Se eu não conseguisse fazer uma rotina rápida o suficiente para atender as requisições do barramento do MSX o projeto se tornaria inviável. Mas posso adiantar que eu consegui.

#include "xc.inc"

global _total_bus_read, _total_bus_write, _total_bus_readwrite
global _temp_FSR0L,_temp_FSR0H
global MSXBUSIntRead
global MSXBUSIntWrite

PSECT highintvec,class=CODE,abs,
ovrld
            org 0x10
HighIntStart:
            movff   FSR0L,_temp_FSR0L
            movff   FSR0H,_temp_FSR0H
            clrf    FSR0H
            movf    PORTB,w
            andlw   0xf0
            swapf   WREG
            movwf   FSR0L
            incf    INDF0
            bsf     FSR0L,4
            btfsc   PORTB,PORTB_RB7_POSITION
            goto    MSXBUSIntRead
            goto    MSXBUSIntWrite

PSECT text,class=CODE,ovrld

MSXBUSIntRead:
            movff   INDF0,PORTD
            clrf    TRISD
            bra     wait_bus_r

MSXBUSIntWrite:
            movff   PORTD,INDF0

            banksel _total_bus_write
            incf    _total_bus_write
            bnc     wait_bus
            incf    _total_bus_write+1
            bra     wait_bus

wait_bus_r:
            banksel _total_bus_read
            incf    _total_bus_read
            bnc     wait_bus
            incf    _total_bus_read+1

wait_bus:
            movf    PORTB,w
            andlw   0xf0
            xorlw   0xf0
            bnz     wait_bus
                       
            setf    TRISD
            banksel _total_bus_readwrite
            incf    _total_bus_readwrite
            bnc     end_int
            incf    _total_bus_readwrite+1
end_int:
            bcf     INTCON,INTCON_RBIF_POSITION
            movff   _temp_FSR0L,FSR0L
            movff   _temp_FSR0H,FSR0H
            retfie  f
            end

Inicialmente eu gostaria de falar que eu já tinha programado em assembler para PIC (PIC12F e PIC16F) e que fazia um tempo longo que eu não tinha programado nada em assembler. E com este projeto eu descobri como eu estou literalmente enferrujado para programar em assembler. Foi um verdadeiro pesadelo criar esta rotina simples e eu acho que o ASPIC18, que é o compilador assembler que acompanha o XC8, tem várias e várias armadilhas para quem tá começando. Boa parte da minha dificuldade foi em descobrir o que o compilador e o linker estavam fazendo com o meu código. Uma dificuldade adicional é o fato de que o compilador gera pouquíssimas mensagens de erro o que dificulta bastante a depuração. Isto posto vou agora voltar a descrição do projeto.

O barramento de dados do MSX está ligado diretamente nos pinos RD0..RD7 do PIC e os pinos de seleção do CPLD estão ligados nos pinos RB4..RB7. Uma descrição mais detalhada de como funciona os pinos de seleção está na mensagem #2. O importante é saber que caso seja realizado uma operação de IO dentro dos endereços válidos o estado lógico dos pinos RB4..RB7 serão alterados e será gerada no PIC uma "interrupt-on-change" que foi dada alta prioridade. A idéia é que nenhuma outra fonte de interrupção no PIC gera interrupções de alta prioridade a não ser a "interrupt-on-change" com isto eu diminuo a quantidade de código no vetor de alta prioridade e aumento a velocidade no tratamento da interrupção.

A primeira parte do código incrementa um contador de acessos de registro. O que isto significa? Significa o seguinte: Imagine que o MSX faça um acesso de escrita de IO no endereço D1 a primeira parte de código incrementará o valor contido no endereço 0x01 da memória do PIC. Já se o MSX fizer um acesso de leitura de IO no endereço D2 a primeira parte do código incrementará o valor contido no endereço 0x0a da memória do PIC. O objetivo disto é para termos uma forma de descobrir qual registro foi lido ou escrito pelo MSX. A idéia é que estes registros por default tenham valor 0 e a rotina principal do PIC faça com regularidade uma varredura destes contadores, caso um ou mais destes contadores não possua valor 0 a rotina principal tratará o registro de acordo com a situação e zerará o contador novamente. Caso o contador possua um valor maior que 1 significa que o MSX fez dois ou mais acessos ao registro sem que a rotina principal a tenha processado o que, dependendo da situação, pode ou não ser uma situação de erro.

Depois do código inicial a rotina se divide em duas partes. Uma parte que trata as leituras de barramento e a outra que trata as escritas. No caso das escritas, o código lê o valor contido no PORTD e armazena este valor no registro correto. No caso de leituras, o registro correto é escrito na PORTD e a PORTD é configurada como saída (o estado normal da PORTD é estar configurada como entrada). Há um conjunto especifico de registros no PIC para leituras e um conjunto específico para as escritas. Desta forma é possível o MSX escrever um valor em um endereço de IO e imediatamente após ler um outro valor no mesmo endereço de IO. Isto na verdade está em acordo com o que faz o CI controlador de disquete WD2793 que estou tentando emular que no endereço 0 você escreve um comando mas no mesmo endereço você lê o status do chip. Até este momento o código é crítico e precisa ser o mais rápido possível. Eu me esforcei bastante em diminuir ao máximo a quantidade de instruções nesta parte da rotina e nos meus cálculos  eu consigo atender o barramento do MSX com 21 ciclos de máquina do PIC ou seja, consigo atender o barramento em 1,75 us com o PIC rodando a 12 MIPS. É uma pena que não tenha como reservar o uso dos registros de indexação FSRx para a rotina de interrupção. Eu conseguiria economizar 5 ciclos de máquina do PIC simplesmente se eu não tivesse que salvar o estado de FS0L e FS0H e se não tivesse que iniciar o FS0H toda vez que a interrupção roda. Mas fazer o que?

A parte final da rotina incrementa uns contadores de 16 bits que eu estou usando para fazer testes mas que na versão final serão retirados e há um loop em que espera os pinos RB4..RB7 voltarem para seu estado default, i.e., todos os pinos com nível lógico 1, para finalmente restaurar o estado de FS0RL e FS0RH e terminar a interrupção. O interessante é que durante a inicialização do MSX com a BIOS do CDX2 os registros relativos ao disco são sempre acessados o mesmo número de vezes. Durante meus testes eu fiz uma rotina que de tempos em tempos amostra no LCD a quantidade de vezes que foi realizado operações de escrita ou leitura nos endereços de IO de D0 até D7. A foto abaixo foi tirada após a inicialização do meu MSX com a BIOS CDX2.

Na imagem acima o barramento de dados ainda não tinha sido ligado ao PIC. Depois que eu liguei o barramento de dados ao PIC a rotina de inicialização trava na inicialização tentando ler milhares de vezes os endereços de IO, muito interessante. Eu agora tenho que ligar o MSX com o PIC desligado para só então ligar o PIC. Isto para evitar o travamento durante a inicialização. Provavelmente o valor 0xff no registrador de status faz com que a rotina de inicialização da bios do CDX2 entre em loop constante. Como ainda não há uma rotina que trate adequadamente os registros o valor nunca muda.


https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCi8OMtlN5uHqIFnYRoyLTzg5KxyWSK6zGtiBwA-oML3TnOjwlPvMs-JKVhkn7AbIv7GVhXDhSUOJwBwmsL-6LV1UWH_JiuPn8WwXdWRat2hlYjopSPTpnYosBgYvNOtVyZv5nELX4nBQ/s1600/PIC+Entrando+em+a%C3%A7%C3%A3o.jpgNa Imagem ao lado podemos ver o PIC entrando em ação. No MSX foi gerado uma leitura no endereço de IO D0. A linha amarela é a linha de endereço A2 sendo monitorada no pino RB6 do PIC e a linha azul é a linha de dados D0. Podemos observar que um pouco antes da descida da linha de endereço do Z80 a tensão do barramento de dados começa a flutuar porque nem o Z80 e nem o PIC está comandando o barramento. No momento que a linha de endereço desce o "interrupt-on-change" entra em ação e a rotina de interrupção começa a tratar o barramento. Podemos ver o momento exato em que o TRISD é zerado e o barramento de dados se torna uma saída escrevendo o valor lógico 1 na linha de dados D0. Todo o intervalo desde a descida da linha de endereço até que linha de dados passe a ser controlada pelo PIC é o tempo de processamento da rotina de interrupção descrita anteriormente. A linha de endereço só se mantém ativa todo este período graças aos 7 wait states que estou inserindo. Eu ainda não testei mas é provavel que com 5 ou 6 wait states o circuito continue funcionando. Mas de qualquer forma ficou claro que é muito importante o uso de wait states para o meu emulador.

Mais a frente eu devo alterar o CPLD para que multiplique o número de wait states sendo gerado por 2 ou por 3. De forma que se os pinos  WS_SEL  possuir o valor 7 por exemplo seja gerado 14 ou até mesmo 21 ciclos de espera. Desta forma espero tornar o meu projeto compatível com computadores mais rápidos como por exemplo o Turbo-R.

Na imagem acima é a mesma configuração dos sinais da imagem anterior só que desta vez é uma operação de escrita aonde está sendo escrito o valor 0 no endereço de IO D0. Podemos observar que o Z80 baixa a linha de dados um pouco antes de baixar a linha de endereço e que ele levanta a linha de dados um pouco depois de levantar a linha de endereço.

Por hoje é só. Estou mega cansado e me sentindo um pouco estafado mas feliz com o progresso do projeto. Espero que as informações que estou colocando aqui seja de alguma utilidade para alguém.
Conforme prometido segue o link para o arquivo contendo todo o código do PIC até agora. Eu vou estudar uma forma de colocar o código num servidor de svn para que, quem quiser, possa contribuir também para o projeto. Se alguém tiver alguma sugestão ou crítica sou todo ouvidos.


Um abraço,

José Paulo

quinta-feira, 18 de julho de 2013

Problemas de precisão no CNC Portátil



Olá,

Eu criei o programa acima para me auxiliar nos testes com o meu cnc portátil. Tenho realizado alguns testes mas continuo com o problema de falta de precisão. Creio que estou perdendo passos ao iniciar o movimento do motor e ao parar.

Porquê? Eis a questão.

Eu de inicio acreditei que era um problema lógico. Alguma coisa no firmware dos controladores dos motores de passo. Repassei várias vezes o código do firmware e não detectei nada de anormal. Depois eu pensei que pudesse ser um problema mecânico. Já lubrifiquei tudo para diminuir o atrito e o problema persiste. Agora eu estou acreditando que o problema é a inércia.

Eu outro dia vi um vídeo no Youtube aonde uma pessoa estava segurando um motor que estava sendo controlado pelo software linuxCNC. E no vídeo pude perceber que ao iniciar o movimento o motor sofre uma aceleração progressiva e antes de concluir o movimento o motor sofre uma desaceleração progressiva. Isto me deixou pensando. E agora eu percebo que talvez o software linuxCNC movimente o motor dessa forma para diminuir o efeito da inércia sobre a parte mecânica do sistema.

O meu CNC portátil salta do 0 para a velocidade final instantâneamente e talvez isto provoca alguma perda de passos devido a inércia. Eu já fiz um teste com o CNC portátil do jeito que está mas com a velocidade de operação do motor bem mais baixa e o problema persiste apesar de eu estar com a impressão de que o problema melhorou um pouco.

Nos próximos dias vou aprontar uma nova versão do firmware com o objetivo de incluir o recurso da aceleração e desaceleração progressiva e ai eu posto o resultado aqui no blog.

Um abraço,

José Paulo

segunda-feira, 15 de julho de 2013

Atualização do projeto de emulador de interface de disquete (#2)




Olá,
Conforme vocês podem ver na foto acima eu comecei a testar o conceito do projeto. Eu já tinha um eeprom gravada com a Bios da interface CDX-2 e agora eu criei a lógica no CPLD para atender ao projeto conforme está no diagrama do sistema enviado no outro e-mail. Uma coisa que eu já desconfiava e agora tenho certeza é que não será necessário usar o EPM3064, posso o usar o EPM3032 sem problemas. A parte lógica está usando apenas 13 macrocélulas o que dá para expandir o design mesmo usando o EPM3032 que é bem barato (U$ 2,50 no ebay). O projeto criado no Quartus WEB está num arquivo compactado dentro da minha pasta pública do dropbox. O link segue abaixo:

https://dl.dropboxusercontent.com/u/62498964/CPLD.zip
 

Eu criei um programinha basic (ver foto acima) com a finalidade de constantemente estar gerando gerando requisições de IO para o endereço D0 e desta forma testar o CPLD observando as formas de onda no meu osciloscópio. Na foto dá pra ver também que a eeprom está funcionando conforme o esperado e a Bios do CDX-2 está ativa e funcionando bem.
De cara posso garantir que a parte que decodifica o endereço está funcionando perfeitamente. Abaixo tem uma tabela que demonstra a parte de decodificação.


O objetivo desta decodificação de endereços é acionar no PIC um "Interrupt-On-Change" quando os endereços do IO corretos estiverem presentes no barramento do MSX. Os pinos de seleção serão ligados aos pinos RB4, RB5, RB6 e RB7 do PIC que possuem o recurso de "interrupção com a mudança". Ou seja, caso o estado lógico destes pinos se altere é gerado uma interrupção. Nos PIC18F há dois vetores de interrupção, um de alta prioridade e outro de baixa prioridade. Eu pretendo usar o vetor de alta prioridade para atender às requisições de barramento do MSX. Além disto este vetor de interrupção será escrito em assembler (provavelmente a única parte do programa escrita em assembler) não só para acelerar o atendimento às requisições do barramento como para controlar exatamente a temporização da rotina. O que é difícil de alcançar com uma rotina escrita em C.

O problema agora surgiu na hora de introduzir wait states. Eu criei três pinos no CPLD que selecionam a quantidade de wait states que serão introduzidos caso seja recebida uma requisição de IO válida. O objetivo dos wait states é garantir que o PIC vai ter tempo suficiente para ler e/ou escrever no barramento de dados. Eu não quero criar um número fixo de wait states por dois motivos: 1) Eu não sei se o PIC será ou não capaz de atender às solicitações do barramento sem ciclos de espera (se for possível melhor, mas só vou saber após eu começar a escrever o código para o PIC) e 2) eu não sei se o PIC será capaz de atender as solicitações do barramento em máquinas mais velozes como o Turbo-R (provavelmente não). Por estes motivos é que eu achei importante ter uma forma de introduzir ciclos de espera configuráveis.


Acima tem uma tela do meu osciloscópio. A linha amarela é o IORQ e a linha azul é o sinal de clock. O sinal de clock do barramento é usado para cronometrar o tempo total do sinal de wait state. Na imagem acima o meu programinha basic não está rodando e portanto o osciloscópio está captando outras requisições de IO que o sistema do MSX tem que fazer regularmente. As formas de onda estão ruidosas assim porque estou medindo o sinal que vem de um flat cabe com uns 40 cm de comprimento e na ponta do conector há fios que extendem ainda mais esta distância e isto tudo para plugar num protoboard. Ou seja, tem que ter ruído mesmo. Mas a eeprom está funcionando no protoboard e a parte de decodificação parece estar funcionando bem.




Na imagem acima o programinha basic está rodando e curiosamente o tempo de ativação do IORQ aumentou mas eu posso garantir que não estou introduzindo wait states. E é ai o problema, mesmo que eu introduza wait states o sinal de IORQ não se estende conforme seria o  esperado. Veja a imagem abaixo.


A linha azul agora é o sinal de wait state e no caso estou introduzindo apenas um ciclo de wait state e eu não sei porque o Z80 não está alongando o tempo do IORQ. A temporização está igual ao datasheet do Z80 com o wait state sendo introduzido após o T3 e mesmo assim o processador parece não estar amostrando a linha de wait. Provavelmente eu vou mudar a lógica do CPLD para que a linha de wait desça junto com o IORQ para ver se o tempo se estende ou não.

Um abraço,

José Paulo

terça-feira, 9 de julho de 2013

Atualização do projeto do emulador de interface para o MSX

Boa Noite,

Acima está um diagrama geral atualizado do sistema que irá compor o emulador de interface de disquete. Abaixo vou explicar melhor o que cada seção fará.

Componentes Selecionados para o Projeto:
================================

1) MCU PIC18F4550
Vantagens:
- Eu já tenho o componente;
- Grande quantidade de pinos disponíveis;
- Opera em 5V (compatível com o MSX);
- Possui encapsulamento DIP (que facilita testes com o protoboard) e TQFP (que facilita a inserção numa placa com as dimensões reduzidas como as placa do cartucho do MSX);
Desvantagens:
- Custo elevado;
- Já está um pouco defasado com relação a outros MCU´s;
- Possui pouca memória de programa. Estou preocupado que não dê para inserir todo o código necessário e é quase certo que não vai dar para inserir código para ativar a funcionalidade do USB e ao mesmo tempo fazer a interface com o cartão SDCARD;
- Trabalha a apenas 12 MIPS. Pode ser um pouco lento para fazer a interface com o barramento do MSX, especialmente com versões mais modernas do MSX como o Turbo-R. Será necessário prever o uso de Wait States no circuito para evitar problemas;

2) CPLD EPM3064
Vantagens:
- Eu já tenho o componente;
- Quantidade de pinos adequada para a aplicação;
- Opera em 3,3V mas os pinos de IO toleram operar em 5V;
- Possui encapsulamento PLCC (possuo placa de desenvolvimento que aceita este encapsulamento) e encapsulamento TQFP (que facilita a inserção numa placa com as dimensões reduzidas como as placa do cartucho do MSX);
- Possui 64 macro-células que eu acredito que seja mais que o suficiente para a aplicação. Talvez seja possível usar o EPM3032 que tem a mesma pinagem mas apenas 32 macro-células e é bem mais barato;
Desvantagens:
- Custo um pouco elevado;

3) EEPROM AT49HF010
Vantagens:
- Eu já tenho o componente;
- Opera em 5V;
- Possui encapsulamento PLCC que é bem menor do que uma EPROM UV tradicional como o 27128 e desta forma facilita a confecção de uma PCI do tamanho de um cartucho de MSX;
Desvantagens:
- Possui 128Kx8 que é muito mais que os 16Kx8 da EPROM original. O que fazer com esta memória a mais? Colocar outras BIOS de "bônus" tais como o MSX Assembler e alguns jogos?

Detalhes da Interface CDX-2:
=====================

A interface CDX-2 original possui basicamente dois componentes: uma eeprom 27128 para armazenar o "disk bios" e um chip WD2793 para fazer a interface do computador com a unidade de disco físico. Pelo que eu pude entender os endereços de IO da interface são como seguem

Endereço de IO        Uso            Tipo de Acesso
D0                            2793            Escrita/Leitura
D1                            2793            Escrita/Leitura
D2                            2793            Escrita/Leitura
D3                            2793            Escrita/Leitura
D4                            Registro        Escrita
D5                            Registro        Escrita
D6                            Registro        Escrita
D7                            Registro        Escrita

O registro na verdade é um flip-flop que seleciona o disk drive, seleciona o lado do disco que será realizada a operação de leitura/escrita e aciona a rotação do motor da unidade de disco. Conforme segue a tabela abaixo:

Bit 0                Disk 0
Bit 1                Disk 1
Bit 2                Disk 2
Bit 3                Disk 3
Bit 4                Side
Bit 5                Motor




Já é tarde, são 1:39 da matina. Depois eu continuo a mensagem.

Um abraço,

José Paulo

segunda-feira, 8 de julho de 2013

Placa de protótipo para a memória IS61LV256

Olá,

Acima está a placa de protótipo para a memória IS61LV256 que é uma memória RAM estática der 32Kx8 e que funciona com 3,3V. Abaixo segue a foto do circuito de teste que eu montei para testar a placa e a memória em sí:


O circuito consiste de uma placa de desenvolvimento com o CPLD EPM570 da Altera controlando as escritas e leituras da memória RAM. O que o circuito faz basicamente é escrever todas as posições de memória com um determinado valor e depois lê este valor da memória e compara para ver se está certo. O resultado final sai num pino do EPM570 que eu consigo monitorar no meu osciloscópio. Depois o ciclo de escrita/leitura recomeça com um valor que é o incremento de 1 do valor antigo. Com o teste e o CPLD funcionando na velocidade de 50MHZ o circuito faz o ciclo de escrita/leitura em todas as 32768 posições de memória 760 vezes por segundo aproximadamente sem dar erros. Muito interessante. Gostei bastante do resultado.

Eu acho que não é necessário dizer que funcionou conforme o esperado. Futuramente pretendo fazer umas experiências bem interessantes com o conjunto memória/CPLD.

Abraços,

José Paulo

quinta-feira, 4 de julho de 2013

KickStart no Projeto do emulador de interface de disquete para MSX

Olá,

A imagem acima é um primeiro "brain storm" do que eu pretendo fazer para a minha interface de disquete. Eu tenho dois computadores MSX: um expert 1.0 e um Hotbit convertido para 2.0. Eu tenho drive de disquete e tenho as interfaces de disquete o que eu não tenho é paciência para continuar trabalhando com disquetes de verdade. Por este motivo é que eu decidi por criar uma interface de hardware que emule o funcionamento da interface de disquete do MSX mas que na verdade trabalhe com disquetes virtuais (arquivos) usando um SDCard. A minha ideia inicial é manter o projeto mais simples possível.

A interface escolhida para ser "emulada" pela sua simplicidade foi a interface CDX. A ideia é que o circuito emulador trabalhe o mais próximo possível de como funcionaria o circuito emulado. Basicamente falando a interface CDX possui dois componentes: A EEPROM que armazena a BIOS de disco e o chip de interface de disquete 2793 que faz a interligação da unidade de disquete com o computador.

A bios que será usada será uma bios de uma interface de disquete real. Neste quesito a minha interface não difere em nada de uma interface tradicional. Talvez apenas o componente escolhido. Ao invés do antigo e tradicional 2764 eu vou usar uma EEPROM AT89HF010 da Atmel com encapsulamento PLCC. Além de ser muito menor, consome bem menos energia.

Vai haver um MCU PIC que vai emular o funcionamento do chip 2793. O PIC escolhido até o momento é o PIC18F4550. Ele também ficará responsável pela comunicação com o SDCard e por controlar a interface com o usuário.

Eu vou usar um CPLD EPM3064 da Altera para executar duas funções: realizar a decodificação dos endereços entre o barramento do MSX e o PIC e servir como buffer conversor de tensão entre o PIC que trabalhará com 5V e o SDCard que trabalha com 3,3V.

Há muito ainda a ser feito. Esta é uma primeira idéia inicial e não sei se os componentes escolhidos até aqui vão ser mantidos até o fim do projeto. Qualquer novidades serão postadas no blog.

Um abraço,

José Paulo

quarta-feira, 3 de julho de 2013

Footprint SOJ-28 300 mils

Olá,

Eu estou criando uma placa para adaptar umas memórias RAM Estáticas modelo IS61LV256 que eu comprei no ebay para uso em protoboard e decidi compartilhar o footprint. Este footprint não existe na biblioteca default do Kicad. Caso seja interessante você pode conseguir o footprint no Kicad Cloud no link abaixo:


http://www.kicadcloud.com/pcbModule/4350


No futuro eu vou compartilhar outros componentes e footprints que eu criei para uso em meus projetos.

Um abraço,

José Paulo