Повторил. Все работает. И вполне устраивает.
Но хотелось бы немножко допилить код. Не буду валить в кучу все свои хотелки.
Поэтому начну с самого необходимого.
Я хочу запихнуть в ардуино на базе Atmega8, поэтому мне нужно сократить код
при компиляции даже выдает вот это, но устройство работает.
и , кстати, почему пишет недостаок памяти если занято всего 38%?
Можно ли нерадикальными способами втиснуть код 8кб? И, тяжко ли переписать этот код скажем, на СИ, отказавшись совсем от Ардуино, может быть использование среды ардуино здесь неоправдано. Или может кто-то видел готовый проект на СИ для avr?
[uquote="olegue",url="/forum/viewtopic.php?p=4238837#p4238837"]кстати, почему пишет недостаок памяти если занято всего 38%?[/uquote]
Вы случаем не по своей картинке читаете?
Это относится не к этой памяти, читайте до конца.
[uquote="codenamehawk",url="/forum/viewtopic.php?p=4238958#p4238958"][uquote="olegue",url="/forum/viewtopic.php?p=4238837#p4238837"]кстати, почему пишет недостаок памяти если занято всего 38%?[/uquote]
Вы случаем не по своей картинке читаете?
Это относится не к этой памяти, читайте до конца.[/uquote]
А к какой?
SRAM занято всего 85%
У меня тоже самое пишет
[uquote="Novice user",url="/forum/viewtopic.php?p=4238977#p4238977"]А к какой?[/uquote]
К другой… К меге328, у которой на борту 32Кб… программа весит (согласно картинке), более 10Кб… ТС хочет её впихнуть в мегу8, у которой на борту 8Кб… вот он и хочет прогу уменьшить чтобы влезла в мегу8. И да все переменные тоже не влезут (без переделки), так как имеют более 1Кб SRAM.
Какая ошибка то ? В первом сообщение нет ошибки.
В 1.0.5 просто не выводилось это предупреждение наверное.
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
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, которые управляют Рек/Стопом. меня смущает. Скорее всего это и есть запись на флэшку
[uquote="olegue",url="/forum/viewtopic.php?p=4239177#p4239177"]Объясните такую тему[/uquote]
Я данный язык не знаю… если бы написано было на АВ, тогда бы подсказал, а так увы.
а по ссылкам там разве не описан алгоритм? Сам не читал…
Я иногда использую ардуину как удобную готовую плату… а алгоритм пишу на АВ и заливаю прошивку как в обычный МК через программатор (без использования загрузчика)… так что ардуину используют многие…
я глубоко в тему по ка не влезал. И вообще хотел обойтись без детального анализа того что происходит в коде. Думал ограничиться лишь готовым инструментов, слегка заточив под себя функцию записи.
>if (paused==1) {exit(0);} /* если была пауза выходим из цикла loop */
куда выходим ? у нас что то снаружи loop есть ?
выделенное жирным выше это запись на флэшку и должно выполняться в неблокирующем коде (т.е. писать как только буфер заполнится данными), а вы туда влепили блокирующий цикл с delay(), изучите тему использования millis() и как реализуется конечный автомат, без этого в большинстве случаев невозможно написать что то более менее годное в сотни строк, пригодится (можно прерывания от таймера изучить как альтернативный вариант)
[uquote="olegue",url="/forum/viewtopic.php?p=4239190#p4239190"]просто говорят что Ардуино - это для детворы.[/uquote]
ага, но так же никто не говорит, что Ардуино - это для обработки звука, для меги328 (особенно не выходя за рамки ардуино) это, скажем так, впритык
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Morroc писал(а): как реализуется конечный автомат, без этого в большинстве случаев невозможно написать что то более менее годное в сотни строк, пригодится (можно прерывания от таймера изучить как альтернативный вариант)
я сразу понял что без прерываний тут никак. Но думал на халяву проскочить получиттся. Не получилось.
я написал как без прерываний ) millis() + КА, никаких delay и длинных циклов внутри loop и это не под конкретную ситуацию вариант, а общепринятый для средней сложности задач
Последний раз редактировалось Morroc Вт май 31, 2022 11:21:24, всего редактировалось 1 раз.
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Я, конечно, ретроград, но получить эффективный компактный код можно на асме. И про time_to_market не будем, ладно? Мы ведь любители, а не индусские говнокодеры на зарплате - абы работало хоть как-нибудь, да спихнуть побыстрее.
Именно потому что мы любители нафига ковыряться в асме если на данный момент его не знаешь ? МК сейчас жирные, а если мало всегда есть еще жирнее, тем более в данном случае затык совершенно не в этом.
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Morroc, тогда объясните в двух словах про сброс буфера на флэшку и операции РЕК/СТОП. Они же влияют на буфер?
Допустим я нажимаю на РЕК - пошла запись, вслед за этим буфер начинает заполнялся и идет по мере необходимости сброс на флэшку. Затем я нажимаю Стоп, операция сброса продолжается, так как режим SPI не шибко быстрый. Но не дождавшись окончания записи, вновь нажимаю РЕК. Что в данном случает будет происходить?
[uquote="olegue",url="/forum/viewtopic.php?p=4239240#p4239240"]Morroc, тогда объясните в двух словах про сброс буфера на флэшку и операции РЕК/СТОП. Они же влияют на буфер?[/uquote]
сброс буфера rec.flush, rec.close или при заполнении буфера 512 байт
[uquote="olegue",url="/forum/viewtopic.php?p=4239240#p4239240"]Допустим я нажимаю на РЕК - пошла запись, вслед за этим буфер начинает заполнялся и идет по мере необходимости сброс на флэшку[/uquote]
да. вы видите в коде где это происходит и почему в loop нельзя делать паузы ?
[uquote="olegue",url="/forum/viewtopic.php?p=4239240#p4239240"]Затем я нажимаю Стоп, операция сброса продолжается, так как режим SPI не шибко быстрый. Но не дождавшись окончания записи, вновь нажимаю РЕК. Что в данном случает будет происходить?[/uquote]
я думаю вы не успеется таким образом добиться сбоя если алгоритм корректно написан, но на всякий случай можно добавить паузу (не ковырял SdFat, там может и нет ничего фонового на прерываниях и все делается непосредственными вызовами методов, тогда такой проблемы и вовсе нет)
если Стоп не успеет отработаться каким то образом до нажатия Рек, то предыдущий файл будет запорот
просто напишите свою доработку без delay и долгих циклов в loop, например с использованием millis()
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /