ci para falar as cooerdenadas com pic[RESOLVIDO]

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mensagempor barboza » 16 Fev 2010 21:45

cristian escreveu:o codigo ta meio gorseiro mas era pra dar algum sinal da audi nao acham



1 - Não usou int, entao nao tem garantia do tempo de amostragem para reproduzir corretamente;

2 - Os dados estão em memória externa, então tem que garantiar que o tempo de leitura dos dados seja menor que o periodo de amostragem (125us);
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor Vonnilmam » 16 Fev 2010 22:52

vou me intrometer, intrometendo! há

olha só a dica do barbosa é corretissima, como vc cristian deseja aprender ou melhor esta querendo reproduzir uma wav, o melhor caminho é fazer o basição que foi o que o barbosa indicou, vou até um pouco além:

ao invé se utilizar dacs dedicados, vc pode montar uma rede r2r de 8 bits na saida do pic (o diagrama desta rede é super comum, procura no google por r2r 8bits), coloca no porte b do pic por exemplo, faça uma rotina onde o timer 1 estoure na frequencia que vc fizer a amostra ou sample, então toda a vez que a int do timer 1 estourar vc envia um byte da memória para o seu port b, simples assim...

eu já fiz um treco destes, como eu só tava brincando eu fiz uma amostra (ex. peguei uma amostra da filha falando "papai") gravei essa amostra numa eeprom 24lc256, fiz uma rotina para pegar essas informações e transporta-las para uma memória 62256 ram...e depois uma outra rotina para a reprodução...

Porque eu fiz essa treta de gravar numa flesh 24lc256 e depois importar os dados para um ram, é simples: primeiro porque eu queria ter um resultado rápido do meu circuito, podendo assim gravar inumeras vezes a flesh com varias amostras diferentes, o detalhe da ram é porque para se reproduzir sons vc tem que ter velocidade de leitura como no caso citado, então deverá utilizar rans ou rons...

todavia vc poderá utilizar um eprom do tipo 27c256 ou 512 gravando diretamente a wav nessa memória...tudo isso é só para efeito de teste, depois que vc aprender e entender como funciona a coisa vc começa a pensar em Sdcard, USB e PWM...

Esse último recurso PWM, é interessantíssimo e se vc for prosseguir na sua empreitada sonora, vá estudando as técnicas de PWM..

Outro detalhe, o melhor formato para vc montar numa memória as waves é vc converte-las para o formato PCM, além de consumir menos memória o mesmo wave (porque vc retira o protocolo wav do pacote de amostras e só fica o PCM puro)...eu utilizo o soundforge, para fazer essas trapalhadas de audio....

Outra coisa, no meu circuito eu coloquei no hardware um contador binario 4040 ligado ao pic, assim o pic em seu programa envia os sinais de clock e reset para esse contador que controla os pinos de endereçamento da ram (no caso)...,

Antigamente esse era o método mais utilizado para gerar sons baseados em tabelas de wave, hoje em dia com o mcus e afins, as coisas ficaram mais globalizadas no audio e diversas técnicas podem ser utilizadas para gerar sons, uma delas é a interpolação de dados de audio que permite fazer muita coisa com pouco wave...e por aí vai...

espero ter ajudado,
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Mensagempor cristian » 17 Fev 2010 15:30

ja tive um resultado aqui

coloquei o pic 18f252 para 25mhz, usei o timer2 para 120us

entao conseguir ouvir a voz porem esta lenta como se a taxa de execuçao estivesse baixa ...estou nos testes ainda

ah fiz o 2R/R
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba

Mensagempor barboza » 17 Fev 2010 16:23

cristian escreveu:ja tive um resultado aqui

coloquei o pic 18f252 para 25mhz, usei o timer2 para 120us

entao conseguir ouvir a voz porem esta lenta como se a taxa de execuçao estivesse baixa ...estou nos testes ainda

ah fiz o 2R/R


Deve estar lendo os dados diretamente da eeprom e esta lendo o tempo de leitura.

Coloque um toogle em algum pino quando atualizar a sua rede r2r, assim você verá qual é sua real taxa de atualização.
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor cristian » 17 Fev 2010 17:41

galera conseguir ouvir a voz na velocidade normal o problema realmetne é o tempo de leitura da eeprom fiz com o pic ler 1300bytes para depois ligar a interrupçao a apareceu a voz normalmente ...mas claro com o tempo curto oque nao estou coinseguindo é recarregar obuffer no tempo certo , do geito q esta ai embaixo o pic depois de escrever no DAC os 1300 bytres ele para recarrega e volta a escrever .. isso foi so pra teste a voz fica soluçando mas na velocidade certa ... entao so preciso encher o buffer no tempo certo de acordo o DAC for esvaziando

me ajudei ai meus neuronios nao aguentam mais


Código: Selecionar todos

ind=0;
ind2=0;
for (x=0;x<=1300;x++)
{
buffer[x]=read_ext_eeprom(ind);//encher buffer x com 500bytes
ind++;
}
enable_interrupts(int_timer2);
while(1)
{

//*********************************************iniicio do buffer
if(ind2>1300)//enche com +200bytes de 0 a 200
{
disable_interrupts(int_timer2);
ind2=0;//volta pro inicio do buffer
for (x=0;x<=1300;x++)
{
buffer[x]=read_ext_eeprom(ind);//encher buffer x com 500bytes
ind++;
if(ind>27000)ind=0;
}
enable_interrupts(int_timer2);
}


a interrupçao esta assim
Código: Selecionar todos

#int_timer2
void timer2()
{
dute=buffer[ind2];
output_b(dute);
ind2++;
}

cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba

Mensagempor barboza » 17 Fev 2010 21:53

Tente com uma fifo:

Código: Selecionar todos
#define   TRUE   (1)
#define   FALSE   (0)
#define   TAM_BUF   (100)
#define   TAM_MSG   (1300)


typedef   unsigned char    u8;
typedef   unsigned int    u16;

u8   u8_buf[TAM_BUF];
u8   u8_idx_rd, u8_idx_wr;
u16   u16_end_msg;

void   main   (void)
{
   // Inicializa os indices
   u8_idx_rd = 0;
   u8_idx_wr = 0;
   u16_end_msg = 0;

   // Leia o primeiro byte da mensagem
   u8_buf[u8_idx_wr++] = read_ext_eeprom(u16_end_msg++);

   // Habilita a int
   enable_interrupts(int_timer2);

   while (1)
   {
      // Declara um indice temporario
      u8 u8_next_idx_wr;

      // Calcule o proximo indice de escrita de forma circular
      u8_next_idx_wr = (u8_idx_wr+1);
      u8_next_idx_wr %= TAM_BUF;

      // Aguarde se o buffer estiver cheio
      while(u8_idx_rd == u8_next_idx_wr);

      // Se tem espaço, leia o próximo byte, incremente o endereço da msg
      u8_buf[u8_idx_wr] = read_ext_eeprom(u16_end_msg++);

      // Faça o loop na mensagem
      u16_end_msg %= TAM_MSG;

      // Salve o proximo indice de escrita
      u8_idx_wr = u8_next_idx_wr;
   }
}


#int_timer2
void timer2()
{
   // Leia e escreva o proximo byte da msg
   output_b(u8_buf[u8_idx_rd++]);
   // Incremente o indice de leitura de forma circular
   u8_idx_rd %= TAM_BUF;
}


Ajuste os tipos das variaveis, não sei qual compilador esta usando...

Depois de uma lida aqui:

http://www.asm51.eng.br/phpbb/viewtopic ... highlight=
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor cristian » 17 Fev 2010 21:57

bom galera o problema parece ser no tempo de leitura da memoria 24c512

baixei a taxa da musica para 6000khz o timer2 esta configurado assim


setup_timer_2(T2_DIV_BY_16,12,6); o que dar uns 184uS ou seja 5.405khz

se auemntar a taxa fica dando uns pipocos no som , simulando no proteus da pra perceber q o buffer esvazia antes de ler a memoria

desse geito a voz fica um pouco lenta mas foi o melhor q conseguir com

PIC18F252 A 25MHZ COM 24C512

Código: Selecionar todos

int  buffer[602];
int  buffer2[602];

#int_timer2
void timer2()
{
le=1;
if(b1)
{
dute=buffer[ind2];
}else{
      dute=buffer2[ind2];
     }
output_b(dute);
ind2++;

}

//--------------------------INT


b1=1;
ind=0;
ind2=0;
for (x=0;x<=600;x++)
{
buffer[x]=read_ext_eeprom(ind);//encher buffer x com 500bytes
ind++;
}
for (x=0;x<=600;x++)
{
buffer2[x]=read_ext_eeprom(ind);//encher buffer x com 500bytes
ind++;
}
enable_interrupts(int_timer2);

while(1)
{

//*********************************************iniicio do buffer
if(ind2>=600)//enche com +200bytes de 0 a 200
{
ind2=0;
enche=1;
if(b1)
{
b1=0;//le buffer2
}else
   {
   b1=1;
   }
}

if(enche)
{
enche=0;
if(!B1)
{
for (x=0;x<=600;x++)
{
buffer[x]=read_ext_eeprom(ind);//encher buffer x com 500bytes
ind++;
if(ind>17100)ind=0;
}
}
else{
   for (x=0;x<=600;x++)
      {
      buffer2[x]=read_ext_eeprom(ind);//encher buffer x com 500bytes
      ind++;
      if(ind>17100)ind=0;
      }
   }
}


ta ai o codigo com 2 buffer de 600bytes

alguma sugestao melhor ????????????
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba

Mensagempor vtrx » 17 Fev 2010 22:06

Cristian,como voce está gravando os dados da musica?
Achei o programa que te falei e aproveitei para dar um 'upgrade',assim ele separa os bytes que são do áudio do arquivo wav e gera um arquivo hex com os dados de áudio apenas,para ser gravado direto na memória com qualquer programa (tipo o ponyprog).
Mas posso gerar tambem um trecho do código para C ja formatado com os bytes,voce apenas 'colaria 'na IDE o trecho,mas para isso preciso saber a formatação do código.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor barboza » 17 Fev 2010 22:09

vtrx escreveu:Cristian,como voce está gravando os dados da musica?
Achei o programa que te falei e aproveitei para dar um 'upgrade',assim ele separa os bytes que são do áudio do arquivo wav e gera um arquivo hex com os dados de áudio apenas,para ser gravado direto na memória com qualquer programa (tipo o ponyprog).
Mas posso gerar tambem um trecho do código para C ja formatado com os bytes,voce apenas 'colaria 'na IDE o trecho,mas para isso preciso saber a formatação do código.



É possível fazer isso usando o Goldwave, conforme informei a alguns posts atras.

.....
3 - Salve um tipo RAW (.snd), codifique com 8 bits linear mono, 8KHz;
.....
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor barboza » 17 Fev 2010 22:11

cristian escreveu:
alguma sugestao melhor ????????????




Tentou a opção com a fifo?

É possível otimizar o codigo, retirando o operador % e usar comparação.....
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor vtrx » 17 Fev 2010 23:31

É possível fazer isso usando o Goldwave, conforme informei a alguns posts atras.

Não ví esse programa ainda,mas apartir de qualquer arquivo wav ele salva direto em .hex apenas os bytes de audio?
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor barboza » 17 Fev 2010 23:37

vtrx escreveu:
É possível fazer isso usando o Goldwave, conforme informei a alguns posts atras.

Não ví esse programa ainda,mas apartir de qualquer arquivo wav ele salva direto em .hex apenas os bytes de audio?


http://www.goldwave.com/index.php

É um software compativel com o sound forge.
A extensão de saida é o .snd, mas é o arquivo .wav sem cabeçalho.
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor vtrx » 17 Fev 2010 23:56

Eu baixei e ví,é que programei para ja fazer isso em qualquer wav direto sem converter.
Só achei estranho é que converti um arquivo de 11045 bytes de audio ele salvou em formato raw 8 bits,8khz mono(como no original) com o praticamente o dobro de tamanho.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor cristian » 18 Fev 2010 08:12

vtrx vou querer sim o programa , como faz?


Tentou a opção com a fifo?

É possível otimizar o codigo, retirando o operador % e usar comparação.....


como assim barboza?

estou fazendo assim :
modifico o audio com goldwave e salvo no formato wave PCM unsigned ,8bit mono

abro o programa HEX edit tiro o cabeçalho e salvo no formato .bin para depoios com pinyprog salvar na memoria

mas a leitura da memeoria parece ser lenta vcs sabem o valor ??
mesmo com 25mhz .

sera q agora o cartao sd nao seria a soluçao ?? ele é mais rapido de ler ???

estouusando ainda o 2R/R tenho q transformar para pwm ...
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba

Mensagempor barboza » 18 Fev 2010 08:24

cristian escreveu:vtrx vou querer sim o programa , como faz?


Tentou a opção com a fifo?

É possível otimizar o codigo, retirando o operador % e usar comparação.....


como assim barboza?

estou fazendo assim :
modifico o audio com goldwave e salvo no formato wave PCM unsigned ,8bit mono

abro o programa HEX edit tiro o cabeçalho e salvo no formato .bin para depoios com pinyprog salvar na memoria

mas a leitura da memeoria parece ser lenta vcs sabem o valor ??
mesmo com 25mhz .

sera q agora o cartao sd nao seria a soluçao ?? ele é mais rapido de ler ???

estouusando ainda o 2R/R tenho q transformar para pwm ...


Cara, a discussão com o Goldwave é outra estoria. Você pode salvar os dados sem cabeçalho diretamente no GOldwave, escolhendo o tipo de arquivo Raw (.snd).

Sobre o codigo, Veja meu post em Qua Fev 17, 2010 9:53 pm
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

AnteriorPróximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x