USART para MIDI

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

USART para MIDI

Mensagem  arboechat em Qui Dez 03, 2009 9:54 pm

Quero usar a função USART para fazer transmissão no protocolo MIDI.
O MIDI é um protocolo que transmite assincronamente a taxa de 31,25 Kbits informaçoes em pacotes de 8 em 8 bits + start bit + stop bit.
Pelo que li USART é uma boa forma de fazer essa transmissão.
Não preciso fazer leitura no meu projeto então só estou interesado no bit TX.
Não encontrei na documentação se posso escolher qual pino quero usar para o TX, ou senão, qual é o pino do TX.
Se alguem tiver disponivel um exemplo de implementação da configuração do USART não seria mal também não.
Abraços

arboechat

Mensagens : 3
Data de inscrição : 03/12/2009

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: USART para MIDI

Mensagem  arboechat em Sex Dez 04, 2009 8:03 pm

Me parece que é o pino 25, vou fazer alguns testes aqui.

arboechat

Mensagens : 3
Data de inscrição : 03/12/2009

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: USART para MIDI

Mensagem  arboechat em Sab Dez 05, 2009 1:05 am

Funcionou perfeitamente usando a seguinte config do USART:

OpenUSART( USART_TX_INT_OFF &
USART_RX_INT_OFF &
USART_ASYNCH_MODE &
USART_EIGHT_BIT &
USART_SINGLE_RX &
USART_BRGH_HIGH,
95 );

E usando WriteUSART para enviar os dados.
Lembrando de checar os 3 pinos do conector midi que serão conectados a quais portas (na expecificação MIDI - Musical Instrument Digital Interface).

Infelizmente a saida do pino 25 (RC6) é utilizada no display de 7 seguimentos portanto não posso usar midi e o display ao mesmo tempo no nosso kit.

95 foi calculado usando a formula SPBRG = (Fosc/(16xBAUD))-1 onde Fosc=48000000 e BAUD=31250

arboechat

Mensagens : 3
Data de inscrição : 03/12/2009

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: USART para MIDI

Mensagem  bruno_dayrell em Sex Mar 02, 2012 3:52 pm

Obrigado
arboechat
,
quando estive estudando, apareceream muitas informações sobre MIDI, mas somente por meio do seu post eu consegui realizar a configuração correta do PIC18.

Retribuindo um pouco o favor, selecionei um pouco de informação para acrescentar ao tópico, preparei um texto falando mais a fundo sobre o MIDI e a USART.


Citando um pouco da história do MIDI, foi criado na década de 80, com o intuito de integrar os instrumentos musicais e equipamentos. Podemos citar como grandes responsáveis os sintetizadores e os computadores. O MIDI ainda hoje é muito utilizado por aqueles que convivem em meio musical, principalmente após o lançamento de pedaleira de efeitos virtuais em tempo [quase] real nos computadores, tenho visto muitos tópicos na internet com dúvida e curiosidades sobre o assunto.
O MIDI é geralmente utilizado, então, para a conexão entre instrumentos e equipamentos, para uma maior interdependência e mais opções aos utilizadores. O MIDI é um protocolo de comunicação que funciona com comunicação serial, a uma taxa de transferência de 31 250 bits por segundo, e cada mensagem possui 8 bits, sendo geralmente enviado um conjunto de 3 mensagens ( 3bytes ) para cada informação. Para quem não sabe, a comunicação serial é um método de comunicação no qual os dados binários são enviados sequencialmente, um após o outro, sendo que a ordem de envio é referente à ordem de grandeza dos bits.

Gosto de dividir as instruções ( conjunto de 3 bytes ) em dois grupos básicos: instruções de nota e instruções de comando. As instruções de notas servem, por exemplo, para indicar qual a nota, se foi pressionada ou solta, e ainda seu valor (itensidade). Já as instruções de comando são utilizadas geralmente para informação de acesso a bancos de efeitos diferentes (acesso a endereço de memória), ou mesmo alteração de parâmetros, como volume ou algum efeito (reverb, chorus, wah, ganho, etc.).
O protocolo utiliza em sua implementação uma subdivisão de 16 canais, numerados de 1 a 16, com seus respsectivos valores de 0 a 15 ( o canal 1 é 0x00 ou 0h ). Isso foi criado para que, com um mesmo barramento ( um par de fios somente ) fosse possível controlar até 16 equipamentos distintos através de seu canal, por exemplo, vários sintetizadores podem ser ligados a um mesmo equipamento. Entretanto, para uma comunicação simples entre dois equipamentos é necessário que estejam configurados para o mesmo canal.


A INFORMAÇÃO
Como já citei, a informação é composta por 3 bytes, onde cada um tem sua importância. Os bytes são análogos, respectivamente, a byte de status, de dados e de valor.

Status byte -> indica qual o canal de comunicação e qual o tipo de instrução (nota, controle, acesso, etc.)

Data byte -> é o parâmetro principal, dizendo por exemplo qual a nota, qual o endereço de acesso ou qual o parâmetro modificado. Tudo isso através de código binário de 0 a 127.

Value byte -> responsável pelo valor, por exemplo, intensidade da nota, ganho, realimentação, efeito, etc. Também algumas vezes pode ser utilizado somente para indicar on/off (0 ou 127).

Acho que neste ponto já deu pra notar a diferença entre uma informação MIDI e uma informação de áudio, e que não dá pra converter uma em outra. O MIDI é um protocolo de comunicação, diz respeito à informações de comandos, e mesmo que diga qual nota está sendo pressionada, cabe ao “gerador de timbre” gerar o som respectivo, que é o áudio. Este áudio então pode ser salvo no formato de arquivo adequado.
Bom, agora sobre o PIC18F4550, possui um módulo USART ( Saída Serial ), que no datasheet pode ser verificado o Tx e o Rx, ligados aos pinos 25 e 26 respectivamente. O módulo USART pode trabalhar em modo até full duplex assíncrono ou half duplex síncrono. O caso em que se aplica, ele foi utilizado somente para envio de dados, mas mostrarei a configuração completa. O compilador possui então a função de OpenUSART() que recebe dois parâmetros. A configuração segue o padrão da configuração dos periféricos.


OpenUSART( USART_TX_INT_OFF &//-Sem interrupção de transmissão
USART_RX_INT_OFF &//------------------Sem interrupção de recepção
USART_ASYNCH_MODE &//--------------Modo assíncrono
USART_EIGHT_BIT & //-------------------Enviado 8 bits por vez
USART_SINGLE_RX & //-------------------Recepção simples (não-contínua)
USART_BRGH_HIGH,//--------------------Alta taxa de transferência
95 );//----------------------------------------spbrg for High baud on asynchronous =


// Cálculo do spbrg => Fosc/(16*(spbrg+1))= Baud
// no MIDI, Baud = 31250; no PIC, Fosc = 48MHz;
// 48M/16(S+1) = 31250 -> 16(s+1) = 48M/31250 -> S = [48M/(31250*16)]-1 = 96 - 1 = 95

A fórmula para o cálculo do spbrg muda conforme o modo de transferência (alta ou baixa taxa). Somente com o parâmetro 95 conseguimos configurar a frequência de comunicação. Entretanto observe que isso não é o suficiente para determinar o protocolo, que impõe outras regras.
As interrupções foram desabilitadas. Elas podem ocorrer tanto na recepção de dados, quando é gerado um flag assim que recebido o primeiro bit, ou na transmissão, que o flag é acionado logo após transmitir o último bit do buffer, indicando a possibilidade de se enviar outra informação logo em seguida.
O modo assíncrono é o modo como a informação é enviada, não necessitando de sincronismo.
Cada informação é composta por 3 bytes, enviamos, assim, um byte de cada vez.
A recepção simples não interfere quando estamos tratando apenas do envio de dados. A configuração de recepção simples ou contínua é utilizado para modo síncrono.
Para chegar à USART_BRGH_HIGH, foi utilizado o complexo estudo matemático computacional aprendido durante a formação acadêmica de qualquer indivíduo. Analisando os métodos de probabilidade, o pic pode reconhecer a taxa como alta ou como baixa. Teremos então 2 alternativas, das quais somente com a alta taxa é que funcionou, testes feitos com baixa taxa de transferência não me indicaram resultados exatos, os bits eram errados. Se funcionar com alguém, peço que me avise.
Em relação ao restante do firmware, não há muito segredo. É preciso configurar o estado da porta utilizada (como saída ou entrada), sendo que o TX é saída e RX é entrada. Para escrever na porta então temos duas opções do compilador: void WriteUSART(char data), que envia o byte (tipo char = 8bits) correspondente na porta serial, envia também o 9º bit, se estiver habilitado; void putrsUSART(const rom char *data) , que recebe um ponteiro apontando para o endereço de um vetor de caracteres e envia os bits sequencialmente. Poderia ser utilizado. Também é muito comum o uso da função “printf” para envio de dados na serial. Claro que antes disso tudo não podemos deixar de lembrar de incluir a biblioteca <usart.h> própria do compilador.

Outro detalhe importante é o flag de “busy” do usart. É um flag que fica ativo em nível alto enquanto está enviando a informação anterior. Emtão o firmware deve ser capaz de verificar o estado de busy através da função BusyUSART(), para então enviar o dado.
Um exemplo de código:
Código:

/*********************************************************************
 *
 *            SEMPRA EXEMPLOS (PIC18F4550)
 *
**********************************************************************
 *
 * Nome do Arquivo:  main.c
 * Dependencias:    Veja a seção INCLUDES abaixo
 * Processador:      PIC18F4550
 * Plataforma:      SEMPRA kit E-P18
 * Opção de Clock:  HS 20MHz (externo), Fosc 48MHz (interno) 
 * Compilador:      C18 v3.20 ou superior
 *
 * Empresa:    SEMPRA
 *
 * Autor:      Bruno Aípio Dayrell
 * Data:        02/03/2012
 *
 * Prática:    Exemplo de comunicação MIDI 
 *
 * Descrição:  Este código serve de exemplo para a comunicação
 *              seguindo o protocolo MIDI, através da
 *              configuração do periférico USART (EUSART)
 *
*********************************************************************/

#include <p18cxxx.h>
#include "usart.h"

unsigned char Frase[] = "www.sempratec.com.br";
unsigned char dado = 0xAA;

void main(void)
{
   unsigned char config=0,spbrg=0,baudconfig=0,i=0;
   
   TRISEbits.TRISE1 = 1;
   
   CloseUSART();  // garante que o módulo USART estará desabilitado
                // durante a configuração
   
   // Configuração do módulo USART
   OpenUSART( USART_TX_INT_OFF &  // Sem interrupção de transmissão
   USART_RX_INT_OFF &            // Sem interrupção de recepção
   USART_ASYNCH_MODE &            // Modo assíncrono
   USART_EIGHT_BIT &              // Enviado 8 bits por vez
   USART_SINGLE_RX &              // Recepção simples (não-contínua)
   USART_BRGH_HIGH,              // Alta taxa de transferência
   95 );                        // spbrg for High baud no modo assíncrono    
   
   while(BusyUSART());               // Verifica se o USART está ocupado
   putsUSART((char *)Frase);         // Transmite a string Frase
   
   while(1){
   if(PORTEbits.RE1){
   while(BusyUSART());              // Verifica se o USART está ocupado
   WriteUSART(dado);               // Transmite a o byte dado
   }
   
   while(PORTEbits.RE1){}           
   
   } // fim do while(1)
                    
} // fim do main


/** V E C T O R  R E M A P P I N G *********************************/
// Copiar na íntegra esta parte do código dentro do arquivo "main.c"
// de TODO projeto usado com o Bootloader no PIC.

extern void _startup (void);  // See c018i.c in your C18 compiler dir

  #pragma code REMAPPED_RESET_VECTOR = 0x1000
  void _reset (void)
  {
      _asm goto _startup _endasm
  }

//---------------------------------------------------------------------
//---------- FIM DO ARQUIVO ------------------------------------------


Outro detalhe importante,
utilizei um programinha chamado midi monitor, não achei o link mas postei a foto com o jeito dele,
só colocar em Data monitor que ele verifica tudo o que é chegado e coloca na tela. Utilizei a entrada serial de um computador,
através de um conversor MIDI-RS232, meus testes não funcionaram com MIDI-USB, embora eu ainda acho que nao tenha conseguido configurar corretamente.
Espero que tenha ajudado, qualquer dúvida por favor mandem.

Atenciosamente,

Bruno Alípio Dayrell

bruno_dayrell

Mensagens : 1
Data de inscrição : 19/02/2012

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: USART para MIDI

Mensagem  Conteúdo patrocinado


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo


 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum