Обсуждаем контроллеры компании Atmel.
Ответить

Ардуино - запись звука

Пн май 30, 2022 13:47:16

Нагуглил вот такой видос. Ардуино запись звука с исходниками.
https://www.youtube.com/watch?v=E9LKPFY3GGI&t=184s

Повторил. Все работает. И вполне устраивает.
Но хотелось бы немножко допилить код. Не буду валить в кучу все свои хотелки.
Поэтому начну с самого необходимого.

Я хочу запихнуть в ардуино на базе Atmega8, поэтому мне нужно сократить код
при компиляции даже выдает вот это, но устройство работает.
Изображение

и , кстати, почему пишет недостаок памяти если занято всего 38%?

Можно ли нерадикальными способами втиснуть код 8кб? И, тяжко ли переписать этот код скажем, на СИ, отказавшись совсем от Ардуино, может быть использование среды ардуино здесь неоправдано. Или может кто-то видел готовый проект на СИ для avr?


код прилагаю:
Вложения
Arduino Audio Recorder V.1-20160524.txt
(7.75 KiB) Скачиваний: 155

Re: Ардуино - запись звука

Пн май 30, 2022 14:32:49

Не получится,надо SRAM минимум 2 кб

Re: Ардуино - запись звука

Пн май 30, 2022 16:31:44

Или может кто-то видел готовый проект на СИ для avr?

https://hubstub.ru/programming/116-zapi ... kartu.html

http://we.easyelectronics.ru/AVR/zapis-zvuka.html

Re: Ардуино - запись звука

Пн май 30, 2022 17:47:20

кстати, почему пишет недостаок памяти если занято всего 38%?

Вы случаем не по своей картинке читаете?
Это относится не к этой памяти, читайте до конца.

Re: Ардуино - запись звука

Пн май 30, 2022 18:35:11

кстати, почему пишет недостаок памяти если занято всего 38%?

Вы случаем не по своей картинке читаете?
Это относится не к этой памяти, читайте до конца.

А к какой?
SRAM занято всего 85%
У меня тоже самое пишет

Re: Ардуино - запись звука

Пн май 30, 2022 19:26:48

А к какой?

К другой… :) К меге328, у которой на борту 32Кб… программа весит (согласно картинке), более 10Кб… ТС хочет её впихнуть в мегу8, у которой на борту 8Кб… вот он и хочет прогу уменьшить чтобы влезла в мегу8. И да все переменные тоже не влезут (без переделки), так как имеют более 1Кб SRAM. :roll:

Re: Ардуино - запись звука

Пн май 30, 2022 19:47:32

Я про атмегу8 понял

Но при компиляции под 328-ю мегу возникает данная ошибка-"недостаточно памяти",хотя она занята на 38 % памяти программы и 85% RAM,так отчего ошибка?

Кстати,в arduino 1.0.5 данной строчки "недостаточно памяти" для атмега328 нет,а вот в 1.8.10 есть...

Re: Ардуино - запись звука

Пн май 30, 2022 23:58:15

Какая ошибка то ? В первом сообщение нет ошибки.
В 1.0.5 просто не выводилось это предупреждение наверное.

Re: Ардуино - запись звука

Вт май 31, 2022 09:01:17

ну более менее понятно

VNS, спасибо за ссылки , буду смотреть. Правда там меги 16 и 36, ну это ничгео. Тоже годится.

Объясните такую тему
Вот код и скетча, т.е основаня его часть там где loop

Код:
void loop() { // THIS RUNS LOTS!

  if (digitalRead(btnStart) == LOW && recPressed == 0) {
    /* Записываем в RecordNumber, значение из ячейки №0 EEPROM, и прибавляем 1. */
    RecordNumber = EEPROM.read(0) + 1;
    /* Записываем в ячейку №0 EEPROM, увеличенное значение RecordNumber. */
    EEPROM.write(0, RecordNumber);
    /*  Для конвертации из byte в char / из RecordNumber в NameRecord */
    String str;  //declaring string.
    str = String(RecordNumber); //converting integer into a string.
    str.toCharArray(NameRecord, 4); //passing the value of the string to the character array.
    StartRec(); // launch StartRec method
   
  }


  else if (digitalRead(btnStart) == HIGH && recPressed == 1){

     for (int i = 0; i <= 250; i++) {                       /*ждем секунду*/
        if (digitalRead(btnStart) == LOW){paused=1;break;}   /*есил была зафиксирована пауза выходим из ожидания (из цикла фо) */
        delay(10);
     }
     if (paused==1) {exit(0);}    /* если была пауза выходим из цикла loop */
    StopRec(); // launch StopRec method
    paused=0;
    /*
       После окончания записи, в памяти контроллера остаются данные.
       И за этого следующая запись бывает качеством хуже.
       Поэтому (Делаем программную перезагрузку).
    */
    ((void (*)())0x0000)(); /* Делаем программную перезагрузку - Arduino */
  }

 [b] if (recByteCount % 1024 == 512 && recPressed == 1) {
    rec.write(buf00, 512);  // save buf01 to card
    recByteSaved += 512;
  }
  if (recByteCount % 1024 == 0 && recPressed == 1) {
    rec.write(buf01, 512);  // save buf02 to card
    recByteSaved += 512;
  }[/b]
}


в какой момнет происходит запись на флшку? У меня получается, что если пауза между Стопом и НачаломЗаписи короткая, то на данные на флэшку не успевают записать. Так и должнобыть?

Добавлено after 3 minutes 43 seconds:
Код немного переделан, я настроил все для одной кнопки. т.е если нажата то идет запись, отпущена - стоп. А что бы определить что нужно сделать стоп я измеряю паузу (пытаюсь измерить) . Если пауза менее 2.5сек,то запись не прекращается. Вот такая задумка. Ну это к тому что я полагаю,что запись за флэшку идет уже после Стопа.

Где-то я тут наверно не правл.

Добавлено after 2 minutes 25 seconds:
if (paused==1) {exit(0);} /* если была пауза выходим из цикла loop */

в этомй строке я хотел бы попасть вверх цикла loop, но, вероятно , чтото идет не так.

Добавлено after 18 minutes 18 seconds:
if (recByteCount % 1024 == 512 && recPressed == 1) {
rec.write(buf00, 512); // save buf01 to card
recByteSaved += 512;
}
if (recByteCount % 1024 == 0 && recPressed == 1) {
rec.write(buf01, 512); // save buf02 to card
recByteSaved += 512;
}


вот этот кусок за пределами if, которые управляют Рек/Стопом. меня смущает. Скорее всего это и есть запись на флэшку

Re: Ардуино - запись звука

Вт май 31, 2022 09:01:18

Объясните такую тему

Я данный язык не знаю… :dont_know: если бы написано было на АВ, тогда бы подсказал, а так увы. :roll:

а по ссылкам там разве не описан алгоритм? Сам не читал… :)

Re: Ардуино - запись звука

Вт май 31, 2022 09:17:05

просто говорят что Ардуино - это для детворы.

Re: Ардуино - запись звука

Вт май 31, 2022 09:26:40

Я иногда использую ардуину как удобную готовую плату… а алгоритм пишу на АВ и заливаю прошивку как в обычный МК через программатор (без использования загрузчика)… так что ардуину используют многие… :)

Re: Ардуино - запись звука

Вт май 31, 2022 09:56:41

я глубоко в тему по ка не влезал. И вообще хотел обойтись без детального анализа того что происходит в коде. Думал ограничиться лишь готовым инструментов, слегка заточив под себя функцию записи.

Re: Ардуино - запись звука

Вт май 31, 2022 10:43:20

без анализа - это наугад меняя код ?

>if (paused==1) {exit(0);} /* если была пауза выходим из цикла loop */
куда выходим ? у нас что то снаружи loop есть ?

выделенное жирным выше это запись на флэшку и должно выполняться в неблокирующем коде (т.е. писать как только буфер заполнится данными), а вы туда влепили блокирующий цикл с delay(), изучите тему использования millis() и как реализуется конечный автомат, без этого в большинстве случаев невозможно написать что то более менее годное в сотни строк, пригодится (можно прерывания от таймера изучить как альтернативный вариант)

просто говорят что Ардуино - это для детворы.

ага, но так же никто не говорит, что Ардуино - это для обработки звука, для меги328 (особенно не выходя за рамки ардуино) это, скажем так, впритык :))

Re: Ардуино - запись звука

Вт май 31, 2022 11:02:54

Morroc писал(а): как реализуется конечный автомат, без этого в большинстве случаев невозможно написать что то более менее годное в сотни строк, пригодится (можно прерывания от таймера изучить как альтернативный вариант)


я сразу понял что без прерываний тут никак. Но думал на халяву проскочить получиттся. Не получилось.

Re: Ардуино - запись звука

Вт май 31, 2022 11:19:30

я написал как без прерываний ) millis() + КА, никаких delay и длинных циклов внутри loop и это не под конкретную ситуацию вариант, а общепринятый для средней сложности задач
Последний раз редактировалось Morroc Вт май 31, 2022 11:21:24, всего редактировалось 1 раз.

Re: Ардуино - запись звука

Вт май 31, 2022 11:21:23

Я, конечно, ретроград, но получить эффективный компактный код можно на асме. И про time_to_market не будем, ладно? Мы ведь любители, а не индусские говнокодеры на зарплате - абы работало хоть как-нибудь, да спихнуть побыстрее.

Re: Ардуино - запись звука

Вт май 31, 2022 11:23:16

Именно потому что мы любители нафига ковыряться в асме если на данный момент его не знаешь ? МК сейчас жирные, а если мало всегда есть еще жирнее, тем более в данном случае затык совершенно не в этом.

Re: Ардуино - запись звука

Вт май 31, 2022 11:27:45

Morroc, тогда объясните в двух словах про сброс буфера на флэшку и операции РЕК/СТОП. Они же влияют на буфер?
Допустим я нажимаю на РЕК - пошла запись, вслед за этим буфер начинает заполнялся и идет по мере необходимости сброс на флэшку. Затем я нажимаю Стоп, операция сброса продолжается, так как режим SPI не шибко быстрый. Но не дождавшись окончания записи, вновь нажимаю РЕК. Что в данном случает будет происходить?

Re: Ардуино - запись звука

Вт май 31, 2022 11:43:43

Morroc, тогда объясните в двух словах про сброс буфера на флэшку и операции РЕК/СТОП. Они же влияют на буфер?

сброс буфера rec.flush, rec.close или при заполнении буфера 512 байт

Допустим я нажимаю на РЕК - пошла запись, вслед за этим буфер начинает заполнялся и идет по мере необходимости сброс на флэшку

да. вы видите в коде где это происходит и почему в loop нельзя делать паузы ?

Затем я нажимаю Стоп, операция сброса продолжается, так как режим SPI не шибко быстрый. Но не дождавшись окончания записи, вновь нажимаю РЕК. Что в данном случает будет происходить?

я думаю вы не успеется таким образом добиться сбоя если алгоритм корректно написан, но на всякий случай можно добавить паузу (не ковырял SdFat, там может и нет ничего фонового на прерываниях и все делается непосредственными вызовами методов, тогда такой проблемы и вовсе нет)
если Стоп не успеет отработаться каким то образом до нажатия Рек, то предыдущий файл будет запорот

просто напишите свою доработку без delay и долгих циклов в loop, например с использованием millis()
Ответить