quarta-feira, 1 de julho de 2015

Tocador de arquivos VGM com PIC16F877 / Stand-alone VGM player using PIC16F877

Sempre fui fã de jogos antigos e de seus respectivos sons. Sempre me impressionou a qualidade do som de alguns jogos, estes apresentavam uma qualidade que exigia muito conhecimento e criatividade dos compositores da época. Pois os Chips de áudio da época eram limitados. Com o passar do tempo esses Chips foram sendo atualizados, ganhando novas funções e uma melhor qualidade. Eu tenho um conhecimento melhor quando se fala de consoles da Sega. Os sons gerados pelos consoles como Sega Master System, Sega Mega Drive utilizam um Chip de áudio para gerar os sons.
Somente para fins didáticos, irei estudar a arquitetura do Chip SN76489 que é o Chip responsável por gerar os sons no console Master System, e tentar criar um player stand-alone capaz de reproduzir sons armazenados em uma memória EEPROM. Os arquivos que o Player será capaz de reproduzir será o arquivo VGM, que é facilmente encontrado na internet em sites que abordam esse tipo de assunto, games antigos.
Toda a programação do Player será feita em um compilador Freeware e será utilizado Linguagem C. O Microcontrolador PIC16F877A foi escolhido por possuir portas I/O suficientes ao projeto, e por ser capaz de trabalhar à um clock suficiente para esse projeto, 20Mhz.

Material utilizado:
Microcontrolador PIC16F877A
CI SN76489 (Gerador de sons complexos)
CI AT24C512 (EEPROM 512K Serial)
CI LM386 (amplificador de áudio simples)
Oscilador 4Mhz

Primeiros passos:
O primeiro passo é estudar e entender a arquitetura e o funcionamento do Chip SN76489.
SN76489

Na imagem acima podemos ver a função de cada terminal. 
Os terminais 1,2,3,10,11,12,13 e 15 recebem os bytes de forma paralela.
Terminal 4 indica que o CI esta em ready state.
Terminal 5 habilita o CI para receber os dados.
Terminal 6 habilita o CI.
Terminal 7 é a saída de áudio.
Terminal 14 é a entrada de clock.

Se você olhar o datasheet orinal do componente, irá notar que os terminais que recebem os bits estão invertidos. Isso porque no início da eletrônica se adotava o bit 0 como MSB e o bit 7 como LSB.




Por enquanto não entrarei em detalhes sobre o funcionamento completo do CI SN76489. Com o tempo irei atualizar esse post com mais detalhes. Por enquanto deixo abaixo o link com todas as informações que eu utilizei.

http://www.smspower.org/uploads/Development/SN76489-20030421.txt

Abaixo segue o link onde é possível encontrar informações sobre como funciona a estrutura do arquivo VGM. Nesse link também esta disponível os arquivos para serem compilados e gravados no PIC.
https://drive.google.com/folderview?id=0B99rwmJ4DTXSMlNjTXM0Z1I3V3M&usp=sharing

Desenvolvimento:
Após toda a analise do Datasheet do CI SN76489 e também da documentação que descreve o funcionamento do arquivo VGM iniciei os primeiros testes no componente. Os primeiros testes são basicamente gerar sons simples enviando simples instruções ao componente (Primeira etapa).

Primeira etapa

Após a etapa anterior melhorei a programação do PIC incluindo novas interpretações do arquivo e já foi possível extrair áudio do arquivo VGM. É possível ouvir vários Glitchs durante a reprodução. Isso ocorre devido a várias instruções do arquivos serem ignoradas durante a interpretação (Segunda etapa).

Segunda etapa

Na Terceira etapa já é possível notar uma estabilidade na reprodução e melhora no áudio. Isso foi possível após a inclusão de novas interpretações do arquivo VGM.

Terceira etapa

Após a Terceira etapa o que faltava era basicamente melhorar a programação do PIC para uma total interpretação do arquivo VGM.
Na Quarta etapa incluí ainda mais interpretações do arquivo e também a capacidade de reproduzir vários arquivos armazenados na mesma memória EEPROM. Um LED de três cores nos mostra o status do hardware.
  • Verde - Arquivo VGM válido.
  • Azul - Reproduzindo.
  • Vermelho - Erro / EoF.
Ainda é possível notar que ao concluir a reprodução de um arquivo e gerado um resíduo. Isso ocorre devido a falta de uma rotina para zerar o SN76489. 
O hardware já encontra-se montado definitivamente em uma placa PCB. O projeto final conta também com um amplificador simples já incluso na placa, possibilitando assim a inclusão de um falante diretamente à placa.

Quarta etapa

Abaixo podemos ver o diagrama elétrico feito por mim. Esse diagrama é a montagem definitiva que esta na placa do vídeo acima.

Diagrama elétrico