Ви не увійшли.
Хотілось знайти готову колекцію готових семплів, з яких вибрати щось підходяще.
Колись, в доінтернетні часи, колекції семплів качали з BBSок, видирали з програм-трекерів, з mod-файлів та з іграшок. Пізніше, памʼятаю, продаватись цілі компакт-диски з колекціями семплів.
Невже в наш час інтернету нема де скачати? Наче ж гугляться, і платні, і безплатні. На торентах ще можуть лежати.
Якщо потрібні семпли якихось музичних інструментів, можна згенерувати зі звукового шрифта (soundfont). Той же timidity++ вміє писати в wav.
Звісно, не завжди можна знайти саме те, що хочеться. Тоді аудіоредактор в руки, і ліпити з того що є.
Ключовий момент - без особливих зусиль. Так то можна упоротися в конвертування, а потім у впихання у флешку. Але це якось не сама основна частина алгоритму.
Тоді не дуже розумію питання. У моно PCM всього два параметра: частота семплінгу та формат семпла. Якщо це не якийсь екзотичний формат, то ресемплиться та конвертується існуючими тулзами, наприклад sox'ом. Якщо екзотичний, то пишеться свій конвертор у потрібний формат.
Ідеї для процедурної генерації на МК можна підглянути в демосцені.
Тут декілька окремих питань: відтворення звуків, колекція семплів, процедурна генерація.
Якщо не розглядати зовнішні синтезатори типу AY-3-8910, то які варіанти крім PCM? А PCM можна відтворювати хоч ШІМ'ом, хоч пасивним R-2R DACом.
Але у флешку atmega328p, наприклад, при 8 біт @ 8 кГц влізе менше 4 секунд. Можна знизити розрядність до 4 біт, тоді в два рази більше. Можна зберігати семпли у зовнішній EEPROM.
Оце подумалось.. Взагалі, хтось бачив десь колекцію семплів, які можна без особливих зусиль запустити на мікроконтроллері?
В чому проблема взяти семпли, які не можна "запустити" на мікроконтролері, і конвертувати в такі, які можна? І що значить "запустити"?
А взагалі хочеться процедурно згенерований звук метронома чи кастаньєт
Берете семпл в PCM, розкладаєте його у спектр. Непотрібні компоненти відкидаєте, потрібні зберігаєте у форматі з точністю, достатньою для відтворення у необхідній якості. На контролері процедурно відтворюєте вейв-форму зі спектру. Тригонометрію можна реалізувати таблицею або CORDIC. Залежить, що за контролер і які в нього є ресурси.
Десяті гармоніки ви навряд чи побачите взагалі будь яким осцилографом
Побачите, тільки ж не окремо від інших, а в комбінації. Що при обмеженій полосі виглядає як гладенька хвилька, при широкій полосі може бути різкою голкою. З будь-яким осцилографом треба тримати в голові, що бачимо тільки те, що в його полосі пропускання, а за межами полоси може бути ще щось.
Я думаю за допомогою ТС4 можна глянути наприклад вихід з DC-DC перетворювача..?
Глянути-то можна, щось однозначно там побачите Питання в тому, що саме хочете побачити, і як детально. Пульсації напруги амплітудою від порядка мілівольт і частотою до декількох мегагерц, скоріш за все, побачите. Але DC-DC, буває, дзвенять гармоніками і на десятках, і на сотнях мегагерц - таке вже не побачите.
але чи ним можна поміряти , те що я вище писав., ?
Дивлячись якої частоти буде ШІМ. Для згаданих застосувань полоси 10 МГц у DSO-T4 має бути достатньо, хіба що який-небудь швидкий SPI не зможете подивитись, чи роботу тактового генератора.
Але зазвичай окремим спеціалізованим пристроєм користуватись зручніше, ніж таким же, але у складі мультифункціонального пристрою. 3-в-1 має сенс, якщо у вас нема окремого генератора сигналів і тестера компонентів, і не збираєтесь їх придбати. Або якщо є необхідність часто носити з собою.
У DSO-T4 та подібних є такий недолік, що повноцінний щуп з компенсаційним конденсатором підключається через перехідник BNC-MCX - громіздко та не дуже зручно.
Походу є AVR (Atmel) studio
Воно ж уже Microchip Studio, і вже не рекомендується для нових розробок Рекомендують користуватись MPLAB X IDE.
Мабуть треба підняти піратський прапор
Бо купляти того монстра щоб пару разів на рік запустити якось не того.
Хіба воно платне в базовій версії? Щось не знайшов, скільки коштує ліцензія.
Мені не подобається, що воно проприєтарне. Microchip Studio взагалі наче тільки під вінду. MPLAB X IDE встановлювати їхнім інсталлером якось не комільфо. А пакет з неофіційного репозиторію хоче Java8 JDK, коли на дворі вже Java24.
Та й не факт, що воно не таке ж глючне як і саморобки.
В реальності - десь один імпульс на 5-7 хвилин їзди. В режимі дощу - в двічі частіше.
Тоді розрахунковий ресурс виходить біля 10'000 мотогодин, тобто трохи більше року. А у вас нема ніякої перевірки цілісності даних та індикації помилки. Помилку можна буде розпізнати тільки коли система почне працювати неправильно.
Крім того, дані можуть записатись некоректно і в будь-який момент при вимкненні живлення під час запису.
Бачу, цей simavr ще навіть ворушиться, є недавні комміти. Але якось на рівні аматорської поробки. Вивод стану пінів у VCD працює, але тільки з GPIO портів. Зміна стану по Compare Match Output, наприклад, ніяк не відображається. Інші альтернативні функції пінів не перевіряв. Схоже, що це "by design". Якщо так, то толку з такого емулятора небагато.
Доречі, є і ще один форк.
Хоча б раз сюди зайти і все. NeedResetCounterOil ніде більше не змінюється
EEPROM.put(10, ImpulseOilMotor);
EEPROMClass::put() ідемпотентна: EEPROM.h:66. Комірка записується тільки якщо нове значення не дорівнює прочитаному. Просто буде постійно читати. Але це теж баг, вважаю.
Може це не від core залежить, а від даних в EEPROM? Спробуйте помістити в кінець setup:
ImpulseOilMotor = maxImpulseOilMotor+1;
І то правда. Шʼєм програматором - в еепромці або FF'ки, або старий контент, в залежності від фʼюзів та опцій програматора. З першим імпульсом FF'ки стають нулями. Шʼєм бутлоадером - micronucleus еепромку не чіпає, а якийсь інший може й стирає. В різних емуляторах також стан еепромки може зберігатись, а може й ні.
Я би очікував більш регулярного паттерну глітчів при суто логічних помилках в коді. Але ж код там такий, що пробуєш його читати - одразу виникає бажання переписати все нафіг. І тоді не вчитуєшся, наївно сподіваючись, що автор знав, що писав
А ШІМ на outMotorOil завдяки ось цим незалежним одна від одної умовам
Є таке. Тільки чому така залежність від версії core, різниця в реалізації millis() не мала би так впливати. Хоча тут спостерігається залежність і від частоти вхідних імпульсів.
Начебто всі записи в eeprom пов"язані з натисканням кнопки. Судячи по назвах змінних
Наче ж при кожному імпульсі подачі виконується EEPROM.put(10, ++ImpulseOilMotor).
Щось цей simutron якийсь дивний.
Та виглядає як творчість шкільного гуртка Ледве допер, що якщо файл прошивки оновився, весь застосунок потрібно перезапускати і відкривати проект заново. Бо він завантажує файл прошивки не кожний раз при старті симуляції, а тільки один раз. І автоматичний запуск симуляції при старті бісить. Таке, можна викидать
Ще один недолік у програмі: постійний перезапис однієї і тієї ж комірки в EEPROM. Даташит обіцяє 100'000 циклів перезапису. При записі раз на 3 секунди менше ніж за 100 мотогодин ресурс вичерпається.
Обідно що глюк з логічними рівнями зламався сам по собі
У мене склалося враження, що відтворюваність залежить від того, чи почистили кеш фреймворку після зміни борди в IDE або встановлення іншого BSP. В лінухах він в ~/.cache/arduino/. У IDE ще є свій RAM-кеш в /tmp/arduino-ide2-<sketch_id>/, який зберігається при перезапуску IDE. Але він щось пустий.
Намагався повторити ситуацію - наче IDE при зміні борди перезбирає ядро заново, тільки вже при повторних білдах бере з кеша:
Compiling core...
Using previously compiled file: .../.cache/arduino/sketches/88E89C526180E920CC9AC97AD811FBB4/core/pins_arduino.c.o
Using precompiled core: .../.cache/arduino/cores/digistump_avr_digispark-tiny_3c94b2ea733e4d576f0033e398c581c3/core.a
а надійніше переписати як state machine.
Потрібно його або переписувати з 0
Якщо мета - отримати працюючу програму, то написати з нуля - це найпростіший варіант
Особисто мені, наприклад, було би цікавіше докопатись до причини: в якому саме рядку digitalWrite() скидає стан піна в 0 через неправильно побудовану умову. А для цього потрібно досягти детермінованої відтворюваності в емуляторі при перезбірці прошивки.
В протеусі аналогічно
Це на PB1 чи на PB2?
Присвюювання змінним типу boolean HIGH або LOW теж якось око ріже.
Теж звернув увагу, дивний "стиль". Хоча з точки зору мови все валідно.
та й (millis() > (durationLongPressMode + btnModeNoLongPressed)) and (LongPressMode == HIGH)
не зовсім з тієї опери
Чому ж, в C++ and, or, not - така ж валідна форма булевих операторів, як і &&, ||, !. Сам іноді використовую таку форму.
Ну так і так millis переповниться через 50 днів.
millis не "переповнюється", для unsigned типів застосовується модулярна арифметика.
Чи для unsigned переповнення при відніманні не undefined behavior?
Для unsigned і при додаванні ніякого undefined behavior нема.
Просто порівнювати потрібно інтервали, а не точки часу.
А якщо вирізати частину, яка рахує кількість спрацювань насосу, це зробить стабільним пристрій?
Так як точної причини глюку ми не знаєм, то перевірити це може тільки той, у кого є пристрій.
Які є кращі ідеї? Є якийсь софтовий таймер, чи підпирати перевірками?
if (millis() - btnModeNoVeryLongPressed > durationVeryLongPressMode)
Доречі, в програмі є й інші баги, не повʼязані з сигналом на піні. Наприклад, конструкції типу
if (millis() > (durationVeryLongPressMode + btnModeNoVeryLongPressed))
на граничних значеннях (на 50-й день роботи ) працюватимуть неправильно.
@JokeR, вам же наче вдавалось відтворити баг? А можете зашарити .lst-файл прошивки, на якій баг стабільно відтворюється? IDE наче створює .lst при експорті бінарика і кладе його поряд.
Тому що в EEPROM.h нічого цікавого немає.
Тепер я зрозумів, чому IDE не показало команди компіляції. Бо ця EEPROM - header only.
Це враппер до avr/eeprom.h, а реалізація роботи з eeprom - упсь, в бінарнику.
Реалізація в avr-libc: libc/misc/eewr_byte.S
Вона в ісходніку виглядає страшно, бо там реалізація для всіх платформ. А в згенерованому коді для attiny85 досить проста:
0000096c <eeprom_write_byte>:
96c: 26 2f mov r18, r22
0000096e <eeprom_write_r18>:
96e: e1 99 sbic 0x1c, 1 ; 28
970: fe cf rjmp .-4 ; 0x96e <eeprom_write_r18>
972: 1c ba out 0x1c, r1 ; 28
974: 9f bb out 0x1f, r25 ; 31
976: 8e bb out 0x1e, r24 ; 30
978: 2d bb out 0x1d, r18 ; 29
97a: 0f b6 in r0, 0x3f ; 63
97c: f8 94 cli
97e: e2 9a sbi 0x1c, 2 ; 28
980: e1 9a sbi 0x1c, 1 ; 28
982: 0f be out 0x3f, r0 ; 63
984: 01 96 adiw r24, 0x01 ; 1
986: 08 95 ret
При використанні функцій з eeprom.h все так само ламається.
А, не знав, що з libc'шними функціями той глюк теж проявляється.
Тоді може це просто сайд-ефект через таймінги, і відповідний delay() замість eeprom_write_byte() так само впливатиме.
А збірка в platformio працює тільки тому що інша версія avr-gcc
https://raw.githubusercontent.com/ArminJo/DigistumpArduino/master/package_digistump_index.json же ж. Без ніяких хитрощів.
А, в 1.7.5 EEPROM уже є в поставці. Тільки IDE навіть з verbose mode не показує як її компілює, тільки Compiling library "EEPROM".
Але автор писав, що доставляв ще якусь додатково. От якщо ліби з однаковими іменами є і в packages/digistump/hardware/avr/1.7.5/libraries/, і в ~/Arduino/libraries, яку з них воно бере? Це тільки з лога збірки можна побачити:
Alternatives for EEPROM.h: [EEPROM@2.0]
ResolveLibrary(EEPROM.h)
-> candidates: [EEPROM@2.0]
...
Using library EEPROM at version 2.0 in folder: ...
І який там Clock обрано в меню, теж може впливати.
Є підозра що емулятор цього не покаже. Якщо косячаться логічні рівні на виході - значить там всередині щось комутується неправильно.
Якщо апаратний баг, то так. Але в datasheet errata нічого такого нема. Тільки для ревізії A "EEPROM read may fail at low supply voltage / low clock frequency".
А у випадку програмного багу як мінімум стан регістрів можна перевірити. Взагалі можна було б і просто асемблерний код проаналізувати, але мені за то не заплатять
До речі, в якійсь з ревізій цих tiny85 щось було з eeprom, саме з записом в 0 адресу, і були рекомендації від аксакалів починати запис з 10..
Наскільки знаю, то якщо бутлоадер теж використовує EEPROM для збереження своїх даних. Micronucleus такого не робить наче.
А так, відчуття якоїсь незавершеності.
У мене це відчуття щодо більшості інструментів для розробки під МК