Воспроизведение 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 после старта воспроизведения