domingo, 8 de setembro de 2013

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

Olá,

Já faz um bom tempo que eu não escrevo nada no blog. Um pouco por conta de falta de tempo, um pouco por dificuldades diversas que eu tenho enfrentado em meus projetos e um pouco por conta de uma falta de interesse momentâneo. Mas é isso. Espero retomar as atividades tanto aqui como nos meus projetos.

O projeto do emulador de interface de disquete está se arrastando. Dificuldades mil eu tenho encontrado. E tocando o projeto sozinho amplia o grau de dificuldade.

O primeiro problema que eu tenho encontrado é com relação à comunicação com os cartões SD propriamente dito. Os cartões SD possuem duas formas de comunicação: usando o que é chamado de protocolo SD que é mais rápido, porém mais complexo, e a outra é por meio do "protocolo" SPI que é mais simples e que muitos MCUs disponibilizam dispositivos que implementam este protocolo como é o caso do PIC18F4550 que está sendo usado no projeto. O problema reside no fato de que aparentemente nem todos os cartões SD suportarem corretamente o protocolo SPI. Há documentos "oficiais" que descrevem em detalhes como se deve comunicar com os cartões SD tanto em modo SD como em modo SPI, mas aparentemente há cartões que não seguem estritamente o que é estipulado para este modo. Inclusive no documento versão 2 dos cartões SD é informado que futuras revisões do padrão podem não mais suportar o modo SPI. Uma pena. De qualquer forma eu consegui interagir com alguns cartões micro SD que eu tenho aqui em casa o que para mim já é satisfatório. E agora vai aí uma dica: aparentemente os cartões da marca Kingston funcionam muito bem em modo SPI.

O segundo problema é que eu não consigo fazer funcionar corretamente a interrupção de baixa prioridade. Como eu já descrevi em posts anteriores a interrupção que trata do barramento de dados do MSX precisa ser muito rápida e para isto eu dei a este rotina a interrupção de alta prioridade e escrevi a rotina em assembler para garantir o máximo de velocidade possível. Para garantir maior velocidade eu decidi também que a interrupção de alta velocidade tratará apenas da "interrup-on-change" que é a interrupção que é acionada quando o MSX faz uma operação de leitura ou escrita na faixa de endereços de IO equivalente ao controlador de disquete original deste computador (0xD0 à 0xD7). Pois bem, o problema surge quando eu quero usar os outros dispositivos do computador dando a elas a interrupção de baixa prioridade. Eu não sei porque, toda a vez que eu libero (habilito) as interrupções de baixa prioridade o MCU parece travar no mesmo instante. No momento os outros dispositivos não estão fazendo falta ainda. Mas seria legal poder usar a interrupção de baixa prioridade para por exemplo temporizar alguma coisa, sei lá.

O terceiro problema é com o sistema de arquivos FAT em si. Inicialmente estava pensando em usar o "petit FatFs" que é um software livre criado justamente para permitir que MCUs com pouco memória RAM e Flash possam fazer a interface com cartões SD contendo partições FAT. Pois bem, quando eu tento compilar o código do Petit FatFs o compilador acusa o erro de falta de espaço para o parâmetro X qualquer. Após muito quebrar a cabeça eu percebi que, apesar do código do Petit FatFs ser bastante enxuto, na verdade ele transfere muita informação entre as suas diversas funções e isto acaba violando o espaço que foi destinado por default pela Microchip para uso com estes parâmetros. Eu acho que se eu mudar o espaço reservado para a COMRAM no arquivo lkr do pic18F4550 eu consigo fazer as rotinas compilarem normalmente... mas pensando bem é melhor não. Porque? Eu explico. O Petit FatFs foi feito para transferir pequenas quantidades de informação mas na minha aplicação eu vou transferir entre o MSX e o cartão SD setores inteiros de 512 bytes. Eu então achei melhor reservar um espaço de 512 bytes na memória do PIC apenas para estas transferências entre o PIC e o cartão SD. Sendo assim eu estou fazendo as minhas próprias rotinas de tratamento do FAT.

As rotinas em si ainda possuem uma quantidade enorme de bugs mas já consigo navegar entre as pastas e arquivos dos cartões SD que estão em teste.

Abaixo segue algumas imagens da tela LCD do emulador de interface de disquete:







Nas imagens acima estou visualizando um arquivo chamado "ELEVAT~1.DSK" e um diretório chamado LOST respectivamente. É possível observar que no caso do arquivo eu não estou apresentando a extensão DSK porque eu achei desnecessário já que a minha rotina está filtrando para apresentar apenas os arquivos com esta extensão. Mas eu estou começando a perceber que isto pode ser um erro. Porque? Porque caso não haja no cartão SD um arquivo com extensão DSK e nem um diretório o rotina informa que o cartão está vazio e eu acho que isto pode levar o usuário a pensar erroneamente que o cartão está vazio enquanto que na verdade não está. Eu acho que vou mudar meu código para apresentar o simbolo do disquete apenas para arquivos válidos (com extensão DSK) mas apresentar outros arquivos que existam no cartão. O cadeado aberto indica que o arquivo, ou disco, pode ser escrito. Para o MSX, um arquivo com cadeado aberto vai representar um disquete sem a proteção contra a gravação e portanto o disquete (arquivo) pode ser alterado pelo MSX. As setas no canto direito indicam que há mais arquivos "para cima ou para baixo" que você pode navegar com as setas de UP e DOWN do controle da interface.

Ainda há muito a ser feito neste projeto mas o projeto está andando. Abaixo eu deixo o link para o código fonte do firmware do PIC. Caso alguém se sinta compelido em estudar o código e ajudar ou dar ideias, por favor, se sinta a vontade.

https://dl.dropboxusercontent.com/u/62498964/MSXFirmware_3.X%20-%20Nova%20Vers%C3%A3o.zip

Um abraço,

José Paulo

Nenhum comentário:

Postar um comentário