Ви не увійшли.
Сторінки 1
добрий день
стикнувся з такою проблемою. в процесі відладки перевіряв роботу розрахунків, задаючі вручну різні значення змінним. в тих формулах що я перевіряв було ділення, і звичайно інколи відбувалося ділення на нуль, виводились великі значення. я для цього і експерементував щоб виключити такі моменти.
і в якийсь час помітив що деякі показники почали відображати якісь рандомні значення. я спробував відкатати на стару прошивку але глюк не зникав. методом тика я перепробував видаляти частину коду але проблема тільки з одного місця переміщалась в інше.
склалося таке враження що частина коду (чи якісь данні) записались в память і не стираються при прошивкі коду поновому і після сапису загрузчика. і при зміні коду (видаленні чи при добавлянні строк) здається відбувається зміщення. глюк проявляється поіншому і в інших місцях.
проблема зникла тільки після заміни чіпа. хоча код той самий. старий чіп теж вроді робочий.
чи можна якось стерти все як це було з заводу? бо боюсь що при подібних тестах ситуація може повторитися. і взагалі що це може бути, щоб не наступати на тіж граблі? чи я просто якось пошкодив чіп?
Остання редакція Z1M (2026-03-19 10:51:39)
Неактивний
Про яке залізо йде мова? Який мікроконтролер, плата?
в тих формулах що я перевіряв було ділення, і звичайно інколи відбувалося ділення на нуль, виводились великі значення.
Якою мовою написана програма де відбувалось ділення на нуль? В C та C++ ділення на нуль - undefined behavior, може відбутись що завгодно. Щоб "пошкодити чіп" - дуже малоймовірно, але теоретично можливо.
деякі показники почали відображати якісь рандомні значення.
Відображати на чому?
і при зміні коду (видаленні чи при добавлянні строк) здається відбувається зміщення.
Що саме і в чому "зміщується"? Ви зчитували вміст флеш-памʼяті, порівнювали його з тим що записували?
чи можна якось стерти все як це було з заводу?
На більшості платформ - можна, якщо тільки флеш-памʼять не деградувала незворотньо.
і взагалі що це може бути, щоб не наступати на тіж граблі?
Ну, для відповіді на це питання потрібно знати, що саме і на чому ви робили.
Неактивний
атмега8. пишу в ардуино ІДЄ. своя плата. заміряє температуру, струм, напругу. данні записуются в масив. відправка по блютуз на телефон. захотів добавити розрахук опору підключеного нвантаження. прості математичні операції, серед яких є ділення. вручну присвоював перемінним вольтаж і ампераж і дивився чи правильно рахує. звісно інколи вискакували числа по 4 мільярди скоріш за все із за ділення на нуль і я все це виправляв, встановлюючі обмеження щоб розрахунок відбувався тільки якщо змінні більше нуля. і в якийсь момент помітив що значення температури стало від'ємним. став виправляти формули, показники взагалі стали рандомними, потім проявились інші глюки, кожна зміна коду і новий глюк. наприклад вмикався вентилятор чи зумер, відправка в серіал порт становилась не кожну секунду, а 10 раз в секунду, інколи відправка взагалі припинялась. схоже на запис данних за межами масиву. але повторна перепрошивка не допомагала. довго шукав причину и вирішив замінити чіп. і проблема зникла. але єксперементів з розрахунками я на ньому не робив. може із цікавості спробую повторити все те саме щоб зрозуміти, чи це якісь данні записались десь в памяті і не стираються і впливають на код, чи просто співпало і вийшов зладу чип. таке тарпилось вперше
Остання редакція Z1M (2026-03-19 12:40:29)
Неактивний
під зміщенням я маю на увазі що коли добавляю чи видаляю частину кода, змінюється глюк. таке враження що після прошивки залишилися якісь данні які не стерлися і так як код змінив розмір то ті данні впливають на іншу частину коду, що проявляється іншими глюками
Остання редакція Z1M (2026-03-19 12:48:20)
Неактивний
вручну присвоював перемінним вольтаж і ампераж і дивився чи правильно рахує.
Присвоювали прямо в тексті програми? Ви ж розумієте, що при діленні на відому під час компіляції константу і при діленні на отримане під час виконання значення результуючий код і поведінка можуть бути зовсім різними? Практичного сенсу в такому тестуванні немає.
схоже на запис данних за межами масиву.
Так може у вас і відбувається запис за межі масиву? Це також undefined behavior.
Показуйте код.
Увімкніть в IDE відображення попереджень при компіляції та аплоаді: "Show verbose output during: ✓ compile ✓ upload"
Також увімкніть "Compiler warnings: All".
але повторна перепрошивка не допомагала.
Якщо в самій програмі баг, то повторна перепрошивка нічим не допоможе.
чи це якісь данні записались десь в памяті і не стираються і впливають на код, чи просто співпало і вийшов зладу чип.
В IDE увімкнено " ✓ Verify code after upload"? Якщо ні, то теж увімкніть.
При появі незрозумілих глюків корисно підключитись програматором, зчитати флешку та фʼюзи, і проаналізувати їх вміст.
Іноді при залипанні бітів у non-volatile памʼяті допомагає повний chip erase з наступним перезаписом бутлоадера і фʼюзів. Але якщо біти вже почали залипати, то з великою ймовірністю це буде продовжуватись і надалі.
Остання редакція dimich (2026-03-19 13:36:18)
Неактивний
вручну я вказував не всі змінні, що присутні в розрахунках. інші були реальними. сенс в цьому думаю є. так як на практиці всі варіанти тієї чи іншої змінної не так легко отримати
Остання редакція Z1M (2026-03-19 13:57:32)
Неактивний
Сам по себе чип avr довольно таки тугой, ни разу не слышал чтобы была битая флеш или озу (если конечно не питали завышенным напряжением). Где-то вы у себя перемудрили.
Или не проходит стирание чипа, т.к. на новом вся память забита 0xFF и любая прошивка заливается без проблем.
Неактивний
вручну я вказував не всі змінні, що присутні в розрахунках. інші були реальними.
Якщо у вас, наприклад, було щось типу
float v = readVoltage();
float i = readCurrent();
float r = v / i;і ви замінили на
float v = readVoltage();
float i = 0.0001;
float r = v / i;то це може бути зовсім різний код із різною поведінкою при одних і тих же значеннях v та i.
Щоб реалізувати ділення без потенційного UB потрібно знати, які там типи операндів, граничні значення, в яких одиницях величини і т.д.
Взагалі, логіку та обчислення, якщо вони не зовсім елементарні, потрібно відлагоджувати окремо, а не прямо в програмі на залізі.
Сам по себе чип avr довольно таки тугой, ни разу не слышал чтобы была битая флеш или озу
Буває, особливо якщо чіп з аліекспреса ![]()
Спостерігав дещо схожі симптоми (з флешки читається не те що записане) на якомусь із attiny після спроби покрокового виконання в avr-gdb через debugWire. Там gdb перезаписує флеш для кожного брекпоінта, так що не дивно. Вилікувалось за допомогою chip erase. Але це не схоже на випадок у автора.
Остання редакція dimich (2026-03-19 15:18:24)
Неактивний
Буває, особливо якщо чіп з аліекспреса
А, ну это да. Можно и в подвалах подола чипы изготавливать.
Спостерігав дещо схожі симптоми (з флешки читається не те що записане) на якомусь із attiny після спроби покрокового виконання в avr-gdb через debugWire. Там gdb перезаписує флеш для кожного брекпоінта, так що не дивно. Вилікувалось за допомогою chip erase. Але це не схоже на випадок у автора.
Ну такого не делал, учитывая что стирание идет страницами, то хрен знает как этот брейкпоинт расчитывается.
А вот оставить в цикле запись в эпром на пару минут, тем самым превысив кол-во записей (~100000) это запросто.
Остання редакція Kino (2026-03-19 15:26:29)
Неактивний
а от з флеш щось не зрозуміле
Зітріть флешку, зчитайте її. Якщо там не 8 кілобайт FF'ок, то хана флешці. Якщо після стирання все ок, запишіть 8 кілобайт нулів, зчитайте знову. Якщо зчитуються не всі нулі, то теж хана.
Хоча якщо комірки "розхитані", то буває зразу читається нормально, а через тиждень чи місяць уже сиплеться.
Неактивний
Поставив всі галочки і ось така помилка. Без цих галочок просто прошивало. На новому чіпі такого немає
Warning: flash verification mismatch
device 0x09 != input 0x01 at addr 0x0513 (error)
device 0xe8 != input 0xe0 at addr 0x0e93 (error)
device 0xc8 != input 0xc0 at addr 0x1693 (error)
device 0xf8 != input 0xf0 at addr 0x1753 (error)
device 0x9d != input 0x95 at addr 0x1ad3 (error)
Error: flash verification mismatch
Avrdude done. Thank you.
Не удалось программирование: ошибка при загрузке: exit status 1
Остання редакція Z1M (2026-03-20 10:02:35)
Неактивний
Сторінки 1