Ir ao conteúdo

Outro Attiny2313 com cristal de 20mhz usando PWM


Ir à solução Resolvido por vtrx,

Posts recomendados

Postado

Estou tendo dificuldade para entender por que não consigo fazer um circuito com cristal de 20 MHz funcionar. Posso reproduzir áudio usando um oscilador interno de 8 MHz ou cristal de 12 MHz. Usando um cristal de 20 MHz, a saída PWM emite apenas ruído. Não é necessário ter alta velocidade na frequência PWM, imagino qualquer frequência acima de 31Khz pois o áudio foi gravado em 11050 Hz. Abaixo está um trecho do código usado.

#ifndef F_CPU

// #define   F_CPU 8000000UL

 #define   F_CPU 12000000UL

 //#define   F_CPU 20000000UL

#endif

 

...

//--------------------------------------------

void pwm_init(void)

{

    // fast PWM mode

    TCCR0A = (1 << COM0A1) | (1 << WGM01) | (1 << WGM00);

   // TCCR0A = (1 << COM0A1) | (1 << COM0B1) | (1 << WGM01) | (1 << WGM00);

    //TCCR0B = (1 << CS01);   // clock source = CLK/8, start PWM

    TCCR0B |= (1<<CS00);            // no prescaling

   // Setup the output for PWM

    DDRB |= (1 << DDB2);

    OCR0A = 128;                   //duty cycle

}/////////////////////////////////////////////////////////////////

/*==============================================================================

...

Estou usando uma memória Flash 25Qxx, não estou usando a frequência PWM diretamente. Eu não entendo o que está acontecendo. Em 20mhz o áudio sai com ruídos incompreensíveis. Será porque esta configuração usa o TIMER0 de 8 bits?

Postei esta dúvida no forum AVR Freaks,mas ta saindo mais confusão que solução.

Postado

Voltando...

Não achei solução,mas algumas observações.

Estou usando protoboard,testei com capacitor de 22pf e não adiantou.

O 'problema' parece que é usando PWM,se usar um pisca led,a temporização demonstra que esta tudo ok,mas usando PWM para gerar áudio(som wav gravado) o áudio gerado é cheio de ruídos como se estivesse super saturado.

O maior valor que consegui foi com cristal de 16mhz.

Meu intuito não era reproduzir um áudio a grandes taxas,mas sim um experimento de mixagem de dois áudios usando um canal PWM e uma única memória externa flash(25Qxx) com um micro barato.

Consegui usando cristal de 16mhz e áudio a 11025khz.

Minha experiencia usou,como inspiração,street Fighter II.

Reproduzo uma musica do jogo no fundo e ao mesmo tempo gero  efeitos sonoros,tipo Coin,Shuriken,sem troca de rotina ou memória externa.

Ficou bom,pena que quando o efeito sonoro é reproduzido(com a musica de fundo)o efeito sonoro não fica 'perfeito',deve ser por causa da resolução de 8 bits ou nível de volume misturado.

Voltando...

Não achei solução,mas algumas observações.

Estou usando protoboard,testei com capacitor de 22pf e não adiantou.

O 'problema' parece que é usando PWM,se usar um pisca led,a temporização demonstra que esta tudo ok,mas usando PWM para gerar áudio(som wav gravado) o áudio gerado é cheio de ruídos como se estivesse super saturado.

O maior valor que consegui foi com cristal de 16mhz.

Meu intuito não era reproduzir um áudio a grandes taxas,mas sim um experimento de mixagem de dois áudios usando um canal PWM e uma única memória externa flash(25Qxx) com um micro barato.

Consegui usando cristal de 16mhz e áudio a 11025khz.

Minha experiencia usou,como inspiração,street Fighter II.

Reproduzo uma musica do jogo no fundo e ao mesmo tempo gero  efeitos sonoros,tipo Coin,Shuriken,sem troca de rotina ou memória externa.

Ficou bom,pena que quando o efeito sonoro é reproduzido(com a musica de fundo)o efeito sonoro não fica 'perfeito',da para ouvir um pequeno 'chiado' junto,deve ser por causa da resolução de 8 bits ou nível de volume misturado.

  • Membro VIP
Postado
  • Mostre a rotina que efetivamente gera o pwm ou som e não apenas a de inicialização
  • Não use funções mastigadas (ccs?) mas sim escreva diretamente nos registros pwm. Nem precisa ser em assembly mas se achar que deve/pode, tente pra ver.
  • Mostre o circuito ou filtro que converte para áudio.
  • Verifique com osciloscópio (se tiver, óbvio)

e .. permita-me

  • Pra gerar/criar áudio com mc, cogite um barato módulo mp3 dfplayer (clique). Comprei alguns há alguns anos só porque era barato d+... Tão literalmente no plástico até hoje e com projetos em banho maria...

 

 Não me lembro é de ter esquecido...

20 horas atrás, vtrx disse:

Esqueceu de um detalhe,

enfim... boa sorte

e.. de nada

Postado
27 minutos atrás, .if disse:

Pra gerar/criar áudio com mc, cogite um barato módulo mp3 dfplayer (clique). Comprei alguns há alguns anos só porque era barato d+... Tão literalmente no plástico até hoje e com projetos em banho maria..

Esqueceu de um detalhe,minha distração é ficar bolando algorítmicos 'estranhos'.

Estou usando AVR e o unico compilador que uso para eles,AtmelStudio.

void pwm_init(void)
{
    // fast PWM mode
	TCCR0A = (1 << COM0A1) | (1 << WGM01) | (1 << WGM00);
   // TCCR0A = (1 << COM0A1) | (1 << COM0B1) | (1 << WGM01) | (1 << WGM00);
   // TCCR0B = (1 << CS01);													// clock source = CLK/8, start PWM
	TCCR0B |= (1<<CS00);													// no prescaling
   // Setup the output for PWM
    DDRB |= (1 << DDB2);
	OCR0A = 128;															//duty cycle
}/////////////////////////////////////////////////////////////////
...
void reproduzir(uint32_t address_music,uint32_t size_music,uint32_t address_efect,uint32_t effect_size)
{
	uint32_t x = 0;
	uint8_t  on = 0;
  
while(size_music > 1)
 {
  x++;
  PORTB = PORTB &  ~(1<<CS);								//CS low  
  spi_transmit_receive (0x03);								//initiate read operation
  spi_transmit_receive ((uint8_t) (address_music >> 16));	//write address MSB
  spi_transmit_receive ((uint8_t) (address_music >> 8));
  spi_transmit_receive ((uint8_t) (address_music >> 0));	//write address LSB	 
  OCR0A = spi_transmit_receive (0xff);						//read spi data and send to
  size_music--;
  address_music++;											//11025khz
  PORTB = PORTB | (1<<CS);									//CS HIGH 
  if(on == 0){_delay_us(45);}								//11025KHZ A 16MHz
//............... efeito sonoro ..............................  
  if(effect_size > 0 && x > 100000)
  {
   on = 255;
   PORTB = PORTB &  ~(1<<CS);								//CS low 
   spi_transmit_receive (0x03);									
   spi_transmit_receive ((uint8_t) (address_efect >> 16));		
   spi_transmit_receive ((uint8_t) (address_efect >> 8));
   spi_transmit_receive ((uint8_t) (address_efect >> 0));	
   OCR0A = spi_transmit_receive (0xff);	
   effect_size--;
   address_efect++;
   PORTB = PORTB | (1<<CS);									//CS HIGH  		  
  }
  else
  {
	on = 0;  
  }
//................fim efeito sonoro ............................			
 }
	  
}

 Lembrando que a única coisa que muda para não funcionar como devia é aumentar o valor do cristal,abaixo de 16mhz tudo ok.

Anexei o resultado por curiosidade.

teste_forum.zip

Postado

Voltando,o problema do ruido quando mistura um efeito a musica de fundo,resolvi gerando um PWM para musica e outro para efeito,ligado ao CI de áudio.

Ficou bom conforme anexo,Musica de fundo game Gradius 3 mais efeito coin e musica Super Street Fighter II Turbo mais Haduken,usando uma memória flash para os dois apenas e um Micro,sem Ram externa ou Buffer.

teste.zip

Postado

Continuando...

To quase chegando onde quero,mas tem um problema que notei e deixei por ultimo.

Toda vez que inicia um áudio pelo PWM,é gerado um ruído tipo 'toc',no inicio do som e no fim.

Não é filtro e percebi que alguma pessoas relatam o mesmo,dizendo que é característica de alguns AVR.

Vou fazer um teste com um Atmega8 e 32 que tenho,mas seria muito útil se não tivesse que mudar para um AVR maior,já que vai sobrar recurso.

 

  • Solução
Postado

Consegui concluir as rotinas e resolver o problema do 'spike' inicial e final.

Não consegui utilizar o cristal de 20mhz,mas com 16mhz consigo gerar sample simultâneo a 11025 que é suficiente..

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!