Воспроизведение Wav на Arduino Mega1280
- Войдите на сайт для отправки комментариев
Втр, 07/02/2012 - 15:30
Всем привет...
хочу воспроизвести 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);
}
А как ты собираешься без Wave Shield`a музыку воспроизводит?
DataFlash 16Mbit AT45DB161D - это дополнительная EEPROM память.
А как ты собираешься без Wave Shield`a музыку воспроизводит?
кидаю перекодированную вавку в шим
DataFlash 16Mbit AT45DB161D - это дополнительная EEPROM память.
я знаю. там вавка в формате хекс и записана
А как ты собираешься без Wave Shield`a музыку воспроизводит?
DataFlash 16Mbit AT45DB161D - это дополнительная EEPROM память.
Вот пример воспроизведения PCM звука , без шилда
PCM это тот же WAV только без заголовка
Вот пример воспроизведения PCM звука , без шилда
Это понятно, я тот же пример использовал, но дело в том что у меня данные идут в внешнего еепрома, не с локальной флеш памяти...
может кто знает как это дело организовать...а то у меня один визг только, такое ощущение что звук затягивается и пищит
Дело в том что работа воспроизведения основана на двух таймерах и воспроизведение будет работать в фоновом режиме
поэтому в loop нужно поставить паузу с длительностью звукового семпла
В примере на который я сослался стоит delay после старта воспроизведения
void loop() { startPlayback(); delay(2500); startPlayback(); delay(2500); }