Воспроизведение Wav на Arduino Mega1280

Dimon49773
Offline
Зарегистрирован: 07.02.2012

 Всем привет...

хочу воспроизвести wav с помощью arduino используя Datalash AT45DB161D.

С памяти читаю, в шим эти значения вывожу, но слышны одни визги...может гляните на прогу и скажите в чём дело...или если есть готовые исходники либо ссылки на похожие статейки...заранее благодарен

здесь файлы библиотеки www.filedropper.com/dataflsh

main


#include <stdint.h>
#include <avr/interrupt.h>
#include <avr/io.h>
#include <avr/pgmspace.h>

#include <DataFlash.h>

#define SAMPLE_RATE 8000

const int sounddata_length=10000;

byte temp;

unsigned char sounddata_data[] PROGMEM = {};
int ledPin = 13;
int speakerPin = 10;
volatile uint16_t sample;
byte lastSample;

// This is called at 8000 Hz to load the next sample.
ISR(TIMER1_COMPA_vect) {
        
        int(temp) = DataFlash.ReadByte();
        OCR2A = temp;
        //Serial.println(temp,HEX);
  
}

void startPlayback()
{
    pinMode(speakerPin, OUTPUT);

    // Set up Timer 2 to do pulse width modulation on the speaker
    // pin.

    // Use internal clock (datasheet p.160)
    ASSR &= ~(_BV(EXCLK) | _BV(AS2));

    // Set fast PWM mode  (p.157)
    TCCR2A |= _BV(WGM21) | _BV(WGM20);
    TCCR2B &= ~_BV(WGM22);

    // Do non-inverting PWM on pin OC2A (p.155)
    // On the Arduino this is pin 11.
    TCCR2A = (TCCR2A | _BV(COM2A1)) & ~_BV(COM2A0);
    TCCR2A &= ~(_BV(COM2B1) | _BV(COM2B0));

    // No prescaler (p.158)
    TCCR2B = (TCCR2B & ~(_BV(CS12) | _BV(CS11))) | _BV(CS10);

    // Set initial pulse width to the first sample.


    // Set up Timer 1 to send a sample every interrupt.

    cli();

    // Set CTC mode (Clear Timer on Compare Match) (p.133)
    // Have to set OCR1A *after*, otherwise it gets reset to 0!
    TCCR1B = (TCCR1B & ~_BV(WGM13)) | _BV(WGM12);
    TCCR1A = TCCR1A & ~(_BV(WGM11) | _BV(WGM10));

    // No prescaler (p.134)
    TCCR1B = (TCCR1B & ~(_BV(CS12) | _BV(CS11))) | _BV(CS10);

    // Set the compare register (OCR1A).
    // OCR1A is a 16-bit register, so we have to do this with
    // interrupts disabled to be safe.
    OCR1A = F_CPU / SAMPLE_RATE;    // 16e6 / 8000 = 2000

    // Enable interrupt when TCNT1 == OCR1A (p.136)
    TIMSK1 |= _BV(OCIE1A);


    sei();
}

void stopPlayback()
{
    // Disable playback per-sample interrupt.
    TIMSK1 &= ~_BV(OCIE1A);

    // Disable the per-sample timer completely.
    TCCR1B &= ~_BV(CS10);

    // Disable the PWM timer.
    TCCR2B &= ~_BV(CS10);

    digitalWrite(speakerPin, LOW);
}

void setup()
{
  //Serial.begin(9600);
  DataFlash.Init();   
  delay(10);  
  DataFlash.StartRead(0);   
  delay(10);
  pinMode(ledPin, OUTPUT);
  startPlayback();
}

void loop()
{  
  while(true);
    
    
}

 

Mastino
Offline
Зарегистрирован: 03.12.2011

А как ты собираешься без Wave Shield`a музыку воспроизводит?
DataFlash 16Mbit AT45DB161D - это дополнительная EEPROM память.

Dimon49773
Offline
Зарегистрирован: 07.02.2012

Mastino пишет:

А как ты собираешься без Wave Shield`a музыку воспроизводит?

кидаю перекодированную вавку в шим

Mastino пишет:

 

DataFlash 16Mbit AT45DB161D - это дополнительная EEPROM память.

я знаю. там вавка в формате хекс и записана
 

carduino.ru
Offline
Зарегистрирован: 06.12.2011

Mastino пишет:

А как ты собираешься без Wave Shield`a музыку воспроизводит?
DataFlash 16Mbit AT45DB161D - это дополнительная EEPROM память.

Вот пример воспроизведения PCM звука , без шилда

PCM это тот же WAV только без заголовка

 

Dimon49773
Offline
Зарегистрирован: 07.02.2012

carduino.ru пишет:

Вот пример воспроизведения PCM звука , без шилда

Это понятно, я тот же пример использовал, но дело в том что у меня данные идут в внешнего еепрома, не с локальной флеш памяти...

может кто знает как это дело организовать...а то у меня один визг только, такое ощущение что звук затягивается и пищит

carduino.ru
Offline
Зарегистрирован: 06.12.2011

Дело в том что работа воспроизведения основана на двух таймерах и воспроизведение будет работать в фоновом режиме

поэтому в loop нужно поставить паузу с длительностью звукового семпла
 

В примере на который я сослался стоит delay после старта воспроизведения

void loop() 
{ 
         startPlayback(); 
         delay(2500); 
         startPlayback(); 
         delay(2500);
}