Как сохранять переменные arduino, при reset

Тема в разделе "Arduino & Shields", создана пользователем Den Kiva, 4 дек 2019 в 21:34.

  1. Den Kiva

    Den Kiva Нерд

    Привет!
    Как сохранять с arduino uno переменные, которые обновляются раз в час ( например ).
    Раз в час в программе обновляется переменная ( число ), которое важно сохранить, если arduino перезагрузиться из за сбоя питания ( например ).
    Как вы решаете такую задачу ! ?
    Можно статью .... или рекомендацию!
     
  2. BAR__MEN

    BAR__MEN Вселенский Няш Администратор

  3. parovoZZ

    parovoZZ Гуру

    Если данные надо хранить только лишь на время сброса, то их можно хранить прямо в ОЗУ. Для этого при объявлении переменной необходимо добавить квалификатор __no_init. Фишка в чем - оперативная память при сбросе не очищается, а сразу после подачи питания в ней может находится мусор. Поэтому компилятор добавляет код инициализации ОЗУ. Но если его попросить этого не делать для определенной области памяти (где лежат наши переменные), то после сброса она очищена не будет. При этом не расходуется ресурс EEPROM/

    Перешёл на МК MSP430FR. Там можно сохранить переменные прямо во flash. Писал об этом здесь
    http://forum.amperka.ru/threads/msp430fr-ежики-или-хомячки.18796/
     
    Tomasina нравится это.
  4. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Напишите плиз пример строки обьявления переменной. Для Ардуины. Полезное дело. Надо запомнить.
    Нашел такое :
    https://atadiat.com/en/e-how-to-preserve-a-variable-in-ram-between-software-resets/
    Но чтоб найти файлы о которых речь - свихнуться можно :
    D:\Documents and Settings\Ariadna\Local Settings\Application Data\Arduino15\packages\arduino\tools\avr-gcc\5.4.0-atmel3.6.1-arduino2\avr\lib\ldscripts
    и
    D:\Documents and Settings\Ariadna\Local Settings\Application Data\Arduino15\packages\arduino\tools\avr-gcc\4.8.1-arduino5\avr\lib\ldscripts
     
    Последнее редактирование: 5 дек 2019 в 01:34
    KindMan и Daniil нравится это.
  5. Vovka

    Vovka Гик

    Ардуиновский загрузчик пишет прошивку во флеш...
     
  6. ИгорьК

    ИгорьК Оракул Модератор

    Таки это обычная ложь?
     
  7. Asper Daffy

    Asper Daffy Иксперд

    Необычная.
     
  8. ИгорьК

    ИгорьК Оракул Модератор

    Ну, во-первых, при сбое питания поможет только сохранение данных в те "хранилища", что могут пережить такое. Я знаю EEPROM у МК и различные микросхемы, что надо присоединить проводами. Есть еще что-то?

    Во-вторых, таки есть это или нет? Хотя ценность оного присутствует лишь в случае принудительной отправки ардуино поспать.
     
    Последнее редактирование: 5 дек 2019 в 09:39
    issaom нравится это.
  9. DetSimen

    DetSimen Спамовредитель Модератор

    Дак она, когда спит, без всяких заклятий ОЗУ хранит, рази нет?
     
  10. ИгорьК

    ИгорьК Оракул Модератор

  11. ИгорьК

    ИгорьК Оракул Модератор

    Не знаю, не укладывал спать. У меня другие железки в эксплуатации.
    Таки я и не лезу в калашный ряд.

    Опять паровозз в нирвану поднялся над нашим туповатым мирком...
     
  12. parovoZZ

    parovoZZ Гуру

    Блин. Мне проще для IAR написать. А для AVRGCC здесь описание секций SRAM
    http://microsin.net/programming/avr/avr-gcc-memory-sections.html

    Во всех AVR - да. Но здесь речь про сохранение значения переменной после сброса. Если сняли напряжение, то этот метод, разумеется, не работает.

    Все загрузчики так делают.
     
  13. parovoZZ

    parovoZZ Гуру

    Вот, например, счетчик сброса
    Код (C++):
     #include <avr/sleep.h>
    #include <avr/wdt.h>

    char my_variable __attribute__ ((section (".noinit")));

    int main (void)

    {

    my_variable++;

    wdt_enable(WDTO_1S);

    set_sleep_mode (SLEEP_MODE_PWR_DOWN);

    sleep_mode ();


    while(1)

    {

    asm("nop");

    }


    return 0;

    }
    В переменной my_variable будет лежать количество ресетов. Важно! Сразу после подачи питания в этой переменной скорее всего будет 0хFF, поэтому необходимо отслеживать бит загрузки МК после подачи питания (вроде PORF называется) и по нему её обнулять. Но это на самостоятельное изучение)))
     
    Tomasina нравится это.
  14. А я тиньку для этого хотел задействовать, SRAM её вроде как Non-volatile
    В квартире для освещения развели проводку на один выключатель, а нужно управлять двумя светильниками.
    Думаю к тиньке два реле подключить и по количеству включений/выключений в течении небольшого таймаута включать первый второй или оба светильника. А в SRAM-е помнить прежнее состояние.
     
  15. ИгорьК

    ИгорьК Оракул Модератор

    Аркадий, где логика?

    Минус тебе в борду, parovoZZ.
     
  16. ИгорьК

    ИгорьК Оракул Модератор

    Для чего? Для восстановления после потери питания?

    Только внешняя микросхема памяти или EEPROM с его ресурсом (кажется) 1000 перезаписей. Точнее смотреть даташит.
     
  17. Чтоб на очередном включении знать сколько светильников было включено прежде, если выключение/включение произошло в течении таймаута, переключаться на другой светильник и запоминать состояние.
    Ограничений на количество циклов записи для SRAM нет, только насколько он Non-volatile я не проверял.
    Код (Text):
    ATtiny25/V / ATtiny45/V / ATtiny85/V
    Features
    • Non-volatile Program and Data Memories
      – 2/4/8K Bytes of In-System Programmable Program Memory Flash
        • Endurance: 10,000 Write/Erase Cycles
      – 128/256/512 Bytes In-System Programmable EEPROM
        • Endurance: 100,000 Write/Erase Cycles
      – 128/256/512 Bytes Internal SRAM
      – Programming Lock for Self-Programming Flash Program and EEPROM Data Security
     
  18. parovoZZ

    parovoZZ Гуру

    SRAM - энергозависимая память. Где написано обратное?

    Пора начать изучать MSP430FR. Где-то меня спрашивал, зачем я это делаю. Вот и ответ выше.))

    Аркадий - это кто?

    У EEPROM - 100 000 записей минимум. У FRAM 10^15. Т.е. вечная.
     
    Последнее редактирование: 5 дек 2019 в 11:37
  19. akl

    akl Гуру

    Если данные получаются только раз в час, то их можно сразу записывать в ЕЕПРОМ, ресурса хватит на 10 лет. Чтобы продлить можно записвывать сразу в несколько ячеек в разных местах памяти, а потом сломавшиеся отбрасывать (есть и более умные способы).

    Если надо именно в момент пропадания питания - можно нагородить систему слежения за питанием (большой кондер + делитель + AnalogReference), если достаточно часто измерять питание, то при просадке вполне успевает все сохранить - я так делал. Но там могут быть проблемы если надо еще что-то измерять относительно питания, т.к. переключение АЦП между питанием и опорным источником без бубна не очень хорошо получается.
     
    issaom нравится это.
  20. parovoZZ

    parovoZZ Гуру

    с бубном, без него, всё равно 10мс. В современных МК чуть быстрее.