2.
вот кусок кода из Ардуино...
rec.write("RIFF");
byte1 = fileSize & 0xff;
byte2 = (fileSize >>

& 0xff;
byte3 = (fileSize >> 16) & 0xff;
byte4 = (fileSize >> 24) & 0xff;
rec.write(byte1); rec.write(byte2); rec.write(byte3); rec.write(byte4);
rec.write("WAVE");
rec.write("fmt ");
byte1 = waveChunk & 0xff;
byte2 = (waveChunk >>

& 0xff;
byte3 = (waveChunk >> 16) & 0xff;
byte4 = (waveChunk >> 24) & 0xff;
rec.write(byte1); rec.write(byte2); rec.write(byte3); rec.write(byte4);
byte1 = waveType & 0xff;
byte2 = (waveType >>

& 0xff;
rec.write(byte1); rec.write(byte2);
byte1 = numChannels & 0xff;
byte2 = (numChannels >>

& 0xff;
rec.write(byte1); rec.write(byte2);
byte1 = sampleRate & 0xff;
byte2 = (sampleRate >>

& 0xff;
byte3 = (sampleRate >> 16) & 0xff;
byte4 = (sampleRate >> 24) & 0xff;
rec.write(byte1); rec.write(byte2); rec.write(byte3); rec.write(byte4);
byte1 = bytesPerSec & 0xff;
byte2 = (bytesPerSec >>

& 0xff;
byte3 = (bytesPerSec >> 16) & 0xff;
byte4 = (bytesPerSec >> 24) & 0xff;
rec.write(byte1); rec.write(byte2); rec.write(byte3); rec.write(byte4);
byte1 = blockAlign & 0xff;
byte2 = (blockAlign >>

& 0xff;
rec.write(byte1); rec.write(byte2);
byte1 = bitsPerSample & 0xff;
byte2 = (bitsPerSample >>

& 0xff;
rec.write(byte1); rec.write(byte2);
rec.write("data");
byte1 = dataSize & 0xff;
byte2 = (dataSize >>

& 0xff;
byte3 = (dataSize >> 16) & 0xff;
byte4 = (dataSize >> 24) & 0xff;
rec.write(byte1); rec.write(byte2); rec.write(byte3); rec.write(byte4);
что этот кусок кода делает в Ардуино ?
об этом я тоже писал выше...
и на последок... забегая вперёд))
если вдруг... все что мы записали на самодельный диктофон... мы захотим послушать на ПК... в браузере... или на своём любимом плеере... то перед началом записи на флешку мы должны добавить на флешку заголовок... с описанием формата wav...
браузеры... или любые плееры... сначала читают заголовки... а потом читают wav поток...
теперь разберём код из Ардуино...
Добавлено after 4 minutes 52 seconds:
// заголовок на флешку записали...
// далее переходим непосредственно к записи данных... по 512 байт...
Добавлено after 14 minutes 27 seconds:
[uquote="Morroc",url="/forum/viewtopic.php?p=4242464#p4242464"]Неудобно с файловой системой работать без буфера как ни крути. Все кластерно-секторное.[/uquote]
файловая система нужна для работы ПК...
а моему самодельному плееру...
- 2.jpg
- (84.78 КБ) 60 скачиваний
не нужны никакие заголовки wav)) поэтому я все заголовки wav из своей меги8 удалил... и освободил память меги8 для других задач.
Добавлено after 1 minute 17 seconds:
далее...
[uquote="olegue",url="/forum/viewtopic.php?p=4242446#p4242446"]касающиеся накопления байт в буфере и сброса их на карту.[/uquote]
Добавлено after 14 minutes 50 seconds:
запись данных на флешку осуществляется по прерыванию таймера номер 2.
// старт записи
void StartRec() { // begin recording process
digitalWrite(ledStart, HIGH);
digitalWrite(ledStop, LOW);
recByteCount = 0;
recByteSaved = 0;
recPressed = 1; // recording button has been pressed
stopPressed = 0;
writeWavHeader();
sbi (TIMSK2, OCIE2A); // enable timer interrupt, start grabbing audio
}
а вот и сам таймер ))
sbi (TIMSK2, OCIE2A); //enable timer interrupt, start grabbing audio (или по-русски включаем таймер и начинаем захват аудио... по прерыванию таймера номер 2)
// остановка записи
void StopRec() { // stop recording process, update WAV header, close file
cbi (TIMSK2, OCIE2A); // disable timer interrupt
writeOutHeader();
digitalWrite(ledStart, LOW); // turn off recording LED
digitalWrite(ledStop, HIGH); // light stop LED
recPressed = 0;
}
а вот и сам таймер ))
cbi (TIMSK2, OCIE2A); // disable timer interrupt (или по-русски отключить прерывание таймера номер 2...)
sbi (TIMSK2, OCIE2A)
cbi (TIMSK2, OCIE2A)
это чё такое... типа ассемблерный вставки... ))
точно))
sbi - установить бит в регистре маски прерывания TIMSK2...
cbi - сбросить бит в регистре маски прерывания TIMSK2...
Ардуина на Ассемблере !!!
Это круто!!! ))
Добавлено after 7 minutes 12 seconds:
// настройки таймера номер 2
// тут мы устанавливаем скорость записи/чтения данный на флешку...
void Setup_timer2() {
TCCR2B = _BV(CS21); // Timer2 Clock Prescaler to : 8
TCCR2A = _BV(WGM21); // Interupt frequency = 16MHz / (8 x 90 + 1) = 22191Hz
OCR2A = 90; // Compare Match register set to 90
}
// настройки ADC
// тут мы устанавливаем режим работы ADC
void Setup_ADC() {
ADMUX = 0x61; // set ADC to read pin A5, ADLAR to 1 (left adjust)
cbi(ADCSRA, ADPS2); // set prescaler to 8 / ADC clock = 2MHz
sbi(ADCSRA, ADPS1);
sbi(ADCSRA, ADPS0);
}
// а вот обработчик прерывания таймера номер 2.
// тут мы читаем данные из ADC и записываем данные в буфер... для последующей записи на флешку...
ISR(TIMER2_COMPA_vect) {
sbi(ADCSRA, ADSC); // start ADC sample
while (bit_is_set(ADCSRA, ADSC)); // wait until ADSC bit goes low = new sample ready
recByteCount++; // increment sample counter
bufByteCount++;
if (bufByteCount == 386 && bufWrite == 0) {
bufByteCount = 0;
bufWrite = 1;
} else if (bufByteCount == 386 & bufWrite == 1) {
bufByteCount = 0;
bufWrite = 0;
}
if (bufWrite == 0) {
buf00[bufByteCount] = ADCH;
}
if (bufWrite == 1) {
buf01[bufByteCount] = ADCH;
}