Відповісти

Введіть повідомлення і натисніть Надіслати
Параметри

Назад

Огляд теми (нові повідомленні вгорі)

dimich
Сьогодні 14:09:58
ard125 пише:

Хоча б раз сюди зайти і все. NeedResetCounterOil ніде більше не змінюється

      EEPROM.put(10, ImpulseOilMotor);

EEPROMClass::put() ідемпотентна: EEPROM.h:66. Комірка записується тільки якщо нове значення не дорівнює прочитаному. Просто буде постійно читати. Але це теж баг, вважаю.

ard125
Сьогодні 13:30:40
dimich пише:

Ще один недолік у програмі: постійний перезапис однієї і тієї ж комірки в EEPROM. Даташит обіцяє 100'000 циклів перезапису. При записі раз на 3 секунди менше ніж за 100 мотогодин ресурс вичерпається.

Думаю набагато раніше. Хоча б раз сюди зайти і все. NeedResetCounterOil ніде більше не змінюється

if (NeedResetCounterOil == HIGH) {
      // Сбрасываем счетчик импульсов в ЕЕПРОМ
      ImpulseOilMotor = 0;
      EEPROM.put(10, ImpulseOilMotor);
}
jokeer
Сьогодні 10:25:17

Що дивно, прообразу цього коду в інтернетах знайти не вдалось. Чи то він запозичений з давно мертвого форуму...
Короче, на місці автора я б його переробив. Запланував би більш зрозумілу індикацію, через 2/3 кольоровий LED. Можливо подумав би про рівень масла. Написав детальне ТЗ. А з нормальним ТЗ написати нормальний код просто wink

dimich
Сьогодні 02:52:10
Honey пише:

Може це не від core залежить, а від даних в EEPROM? Спробуйте помістити в кінець setup:
ImpulseOilMotor = maxImpulseOilMotor+1;

І то правда. Шʼєм програматором - в еепромці або FF'ки, або старий контент, в залежності від фʼюзів та опцій програматора. З першим імпульсом FF'ки стають нулями. Шʼєм бутлоадером - micronucleus еепромку не чіпає, а якийсь інший може й стирає. В різних емуляторах також стан еепромки може зберігатись, а може й ні.

Я би очікував більш регулярного паттерну глітчів при суто логічних помилках в коді. Але ж код там такий, що пробуєш його читати - одразу виникає бажання переписати все нафіг. І тоді не вчитуєшся, наївно сподіваючись, що автор знав, що писав smile

Honey
Вчора 22:27:58
dimich пише:
Honey пише:

А ШІМ на outMotorOil завдяки ось цим незалежним одна від одної умовам

Є таке. Тільки чому така залежність від версії core, різниця в реалізації millis() не мала би так впливати. Хоча тут спостерігається залежність і від частоти вхідних імпульсів.

Може це не від core залежить, а від даних в EEPROM? Спробуйте помістити в кінець setup:
ImpulseOilMotor = maxImpulseOilMotor+1;

dimich
Вчора 22:17:49
Honey пише:

А ШІМ на outMotorOil завдяки ось цим незалежним одна від одної умовам

Є таке. Тільки чому така залежність від версії core, різниця в реалізації millis() не мала би так впливати. Хоча тут спостерігається залежність і від частоти вхідних імпульсів.

jokeer
Вчора 21:47:02

я щось подібне підозрював wink але подивився в скількох місцях смикають за digitalWrite і вирішив що воно цікаво але не настільки щоб копати до кінця.
Ну на блимання можна і забити. А щодо всього іншого.. ніхто не знає, як воно повинно працювати, і ніхто не знає як воно насправді працює.

Honey
Вчора 21:43:57

А ШІМ на outMotorOil завдяки ось цим незалежним одна від одної умовам:

if (millis() - TimeStart > RoadTime * 1024) {
        digitalWrite(outMotorOil, HIGH);
...
if (millis() - TimeStart > RainTime * 1024) {
        digitalWrite(outMotorOil, HIGH);
...

та

if (TriMin < 7000) {
...
    } else {
      digitalWrite(outMotorOil, LOW);
...
ard125
Вчора 21:02:10
Honey пише:

конкуренції кількох незалежних "мигалок":

Так, там з обробкою натискання кнопки повний бардак

Honey
Вчора 20:49:38

Якщо ще розбираєтесь, звідки вилазить ШИМ, то це результат конкуренції кількох незалежних "мигалок":

        // Мигаем с частотой 2 и более Гц
        if ((timeAfterStartVeryLong % 500) < 250)
          digitalWrite(LEDMode, HIGH);
        else
          digitalWrite(LEDMode, LOW);
      // Мигаем с частотой 1 Гц пока не отпустят кнопку
      if ((timeAfterStartVeryLong % 1000) < 500)
        digitalWrite(LEDMode, HIGH);
      else
        digitalWrite(LEDMode, LOW);
      // мигаем светодиодом с частотой 3 Гц
      if ((TriMin % 500) < 250)
        digitalWrite(LEDMode, HIGH);
      else
        digitalWrite(LEDMode, LOW);

і є ще одна в DisplayOilMode()

dimich
Вчора 20:47:45
jokeR пише:

Начебто всі записи в eeprom пов"язані з натисканням кнопки. Судячи по назвах змінних wink

Наче ж при кожному імпульсі подачі виконується EEPROM.put(10, ++ImpulseOilMotor).

jokeR пише:

Щось цей simutron якийсь дивний.

Та виглядає як творчість шкільного гуртка smile Ледве допер, що якщо файл прошивки оновився, весь застосунок потрібно перезапускати і відкривати проект заново. Бо він завантажує файл прошивки не кожний раз при старті симуляції, а тільки один раз. І автоматичний запуск симуляції при старті бісить. Таке, можна викидать  hmm

jokeR
Вчора 20:31:18

Не так все погано. Начебто всі записи в eeprom пов"язані з натисканням кнопки. Судячи по назвах змінних wink

Щось цей simutron якийсь дивний.
2025-06-13_20-28.png
Лінії малюються якось мимо пінів, підключитись куди хочеться не виходить..

dimich
Вчора 19:32:26

Ще один недолік у програмі: постійний перезапис однієї і тієї ж комірки в EEPROM. Даташит обіцяє 100'000 циклів перезапису. При записі раз на 3 секунди менше ніж за 100 мотогодин ресурс вичерпається.

jokeer
Вчора 13:23:59

хм. В platformio хоч є кнопка для очистки кешу. а в Arduino ide я її не побачив smile

dimich
Вчора 13:09:11
jokeer пише:

Обідно що глюк з логічними рівнями зламався сам по собі wink

У мене склалося враження, що відтворюваність залежить від того, чи почистили кеш фреймворку після зміни борди в 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
jokeer пише:

а надійніше переписати як state machine.

ard125 пише:

Потрібно його або переписувати з 0

Якщо мета - отримати працюючу програму, то написати з нуля - це найпростіший варіант smile
Особисто мені, наприклад, було би цікавіше докопатись до причини: в якому саме рядку digitalWrite() скидає стан піна в 0 через неправильно побудовану умову. А для цього потрібно досягти детермінованої відтворюваності в емуляторі при перезбірці прошивки.

Підвал форуму