сохранение переменных в EEPROM

Тема в разделе "Arduino & Shields", создана пользователем Толик Иванов, 7 дек 2015.

  1. ЩАС

    ЩАС Нуб

    wchar_t - чтобы по можно было писать и на латинском или на русском ))), по поводу циклов for ,как я писал, он для чтения и записи периода и времени работы, период - сколько ждать до включения нагрузки, время работы - сколько нагрузка будет в работе. Соответственно period_time и pumping_time. А так как дорожных покрытий 3, то и для каждого свой период и время . Это всё компилируется и работает, сохраняет после выключения и период и время для каждого типа покрытия. Вопрос в том, как сделать чтобы сохранялось и последнее выбранное дорожное покрытие ? Как это сделать, что добавить, к чему обратиться и как правильно записать и прочитать из EEPROM не залазия уже в занятые байты - вот этого я ни как не могу допетрить ((((( спасибо
     
  2. DetSimen

    DetSimen Guest

    Автор скетча точно знает что куда можно вставить. Спроси у него.
     
    ostrov нравится это.
  3. ЩАС

    ЩАС Нуб

    А
    Автор скетча я , пишу его уже месяц, потихоньку разбираясь в каждом вопросе, но тут упёрся и не могу допетрить ни как, так как пример для сохранения для таймеров взят с простора инета, а именно у гайвера, за что ему огромное спасибо за его проекты и открытые ресурсы. Так же много инфо взято и из этой ветки. И я постоянно нарываюсь на таких как Вы типо Гуру бородатых и зазвездившихся. Мне вот интересно, а у Вас когда вы начинали не возникало ни каких таких вопросов в которых без помощи гуру и разжевывания вы не могли сами разобраться в новой теме ??? Если Вы такие гуру то что Вам стоит новечку объяснить/помочь в трёх строчках ? Я знаю принцип работы EEPROM и всех команд к нему, знаю что int занимает ни байт а два, что для чего и где, но как это срастить в одно для данного примера я не могу понять ((( переплыва кучу вариантов, но блин то время на таймерах меняется после перезагрузки, то вообще всё виснет, а сохранить выбранное покрытие так и получилось, по этому и обратился к Вам, так как уже всю думалку сломал ((( да и в инете нет ни примера на подобие чтобы разобраться что от куда и куда.... да и там где меня носит по работе инет только спутниковый и сильно не посерфишь по просторам, спасибо
     
  4. parovoZZ

    parovoZZ Гуру

    какой ты автор? Копипастер, блин)))
    Лови простые строчки работы с EEPROM.
    Код (C++):
     #include <avr/io.h>

        //... Запись в EEPROM
    void EEPROM_write(unsigned int ucAddress, unsigned char ucData)
    {
        //.. Ждем завершения предыдущей операции с памятью
        while(EECR & (1<<EEPE));

        //.. Установим режим работы - стирание и запись за одну операцию длительностьб 3.4 мс (Atomic Operation)
        EECR = (0<<EEPM1)|(0<<EEPM0);

        //.. Запишем адрес ячейки и данные в регистры
        EEAR = ucAddress;
        EEDR = ucData;

        //.. Установим мастер бит EEMPE  
        EECR |= (1<<EEMPE);

        //.. и произведём запись в EEPROM
        EECR |= (1<<EEPE);
    }


        //... Чтение из EEPROM
    unsigned char EEPROM_read(unsigned int ucAddress)
    {
         //.. Ждем завершения предыдущей операции с памятью
         while(EECR & (1<<EEPE));

         //.. Запишем адрес ячейки
         EEAR = ucAddress;

         //.. Старт чтения EEPROM
         EECR |= (1<<EERE);

         //.. Возвращаем полученные данные
         return EEDR;
    }
     
    Сам бы уже на сайте атмела/микрочипа посмотрел бы апноут на эту тему. Я за 5 минут нашел. Код из него. Вам бы только библиотеки подавай. Без библиотек - всё, нули.
     
  5. b707

    b707 Гуру

    DetSimen мягко намекает, что если б автором был ты - то тебе не составило бы труда записать в ЕЕПРОМ еще один байт для сохранения типа ОДНОГО ИЗ ТРЕХ дорожных покрытий.
    А если ты весь код надергал из инета и в нем нифига не смыслишь - то и помочь тебе нельзя.
    Конечно возникало. И сейчас такое бывает. К примеру, сейчас осваиваю разводку печатных плат. Поставил Eagle и тренируюсь. И постоянно возникают глупые ситуации, когда упираюсь, словно в тупик. Я уверен, что любой опытный человек, да вот тот же DetSimen - мог бы в 2-3х словаз разрешить мои проблемы. Но я не лезу на форум за легкой помощью - а штудирую описание к программе и гугл. Иногда над какой-нибудь ерундой, типа почему у микрухи выводы подсвечены красным - просидишь 2-3 вечера. Но потом найдешь ответ и движешься дальше.
    ИМХО, только так можно чему-то научиться. Форумы - не для глупых вопросов новичков, а для обсуждения действительно интересных тем.
     
    Последнее редактирование: 30 июл 2018
    parovoZZ нравится это.
  6. ЩАС

    ЩАС Нуб

    До
     
  7. ЩАС

    ЩАС Нуб

    Ещё раз добрый день всем , я полностью со всеми вами согласен, копипастер..... возможно, но и написал что и кого взял и не скрываю этого, строки для таймера и сохранения его занимают максим 20 строк, остальные 190 я наваял сам, меню, подменю, вывод всего на экран с мелодией при пуске и т.д и т.п, думаю тут тупой копипаст не поможет..... надо понимать что куда, поэтому я и писал что сижу за ним уже месяц, разбираясь что куда а как, я ни куда не тороплюсь, это очередное хобби для развития 38 летнего мозга .... ну чтобы не засох )))) Был бы всегда инет как у Вас , было бы конечно легче, а так по специфики работы у меня его не бывает месяцами, а если и есть то коротко и спутниковый, поэтому мне удобней сделать это через форум, обратиться к гуру с надеждой на то, что найдётся такой который не забыл - как это быть новичком ( читай - не зазнался ), который может в трёх строчках объяснить, что я пропустил , спасибо
     
  8. parovoZZ

    parovoZZ Гуру

    Скачай лучше литературу в те моменты, когда есть тырнет. А когда за тебя удят рыбу - это разве рыбалка?
     
    Mitrandir нравится это.
  9. ostrov

    ostrov Гуру

    Нафига использовать указатели, если библа EEPROM работает с переменными любого типа, включая структуры? Нафига записывать в EEPROM еще раз константный текст, если можно записать его в RAM, где он уже записан для записи в EEPROM? Как можно не уметь записать одну переменную в EEPROM сделав это через указатели до того несколько раз?
     
  10. ЩАС

    ЩАС Нуб

    Согласен - не рыбалка , накачал кучу литературы и только благодаря ей и имею что имею. Сейчас уже посчитал сколько у меня и какие байты по всему скетчу заняты, т.е грубо говоря с адресом для записи определился , соответственно и нашёл ошибку в моих действиях почему при попытках сохранить менялось и время на таймерах.... теперь пытаюсь разобраться как обратиться и к чему чтобы сохранить именно выбранный тип покрытия, уже нарисовал алгоритм .... но видимо что-то упустил , не пойму как обратиться к wchar_t .... а может не туда вообще копаю ((((
     
  11. ЩАС

    ЩАС Нуб

    Интересно, надо покопать
     
  12. ЩАС

    ЩАС Нуб

    Mr. ostrov - вы меня прям удивили , вроде написано гуру, а с момента моего вопроса от Вас только вопросы, причём такие на которые я отвечал .... и что то я от Вас ГУРУ так и не получил ни одного совета или узконаправленного пинка в нужную мне сторону. Как бы там не было - ВСЕМ спасибо кто принимает любое участие в направлении меня в нужную сторону . Мужики я новичок и какой то месяц назад я не знал вообще ничего по этой тематики .
     
  13. ostrov

    ostrov Гуру

    Не знаю куда пинать ибо вы вообще не в курсе как обращаться с EEPROM, выложили куски какие то кода с опечатками и недовольны. Что требуется от гуру? Написать все с максимальными каментами? Вот вам первый пинок.
     
  14. ЩАС

    ЩАС Нуб

    Спасибо большое, но как я писал ранее с функциями для EEPROM, и за что и как они отвечают я разобрался, со свободными ячейками памяти тоже.... я тупо не могу понять от куда мне вызвать последнее выбранное дорожное покрытие, обращаюсь к wchar_t - компиляция мня шлёт ругаясь что так нельзя )))), думалку уже сломал, чувствую себя полным .... не думал, что так будет сложно даваться овладение новым материалом ((( Пните пожалуйста в нужную сторону
     
  15. ostrov

    ostrov Гуру

    EEPROM.get()
    EEPROM.put()
     
  16. ЩАС

    ЩАС Нуб

    Спасибо большое, но видимо я плохой объясняльщик ((((, как я и писал раннее с функциями для EEPROM я разобрался.... и использую put и get. Вообщем что у меня получилось за ночь :
    Получилось сохранить последнее дорожное покрытие, т.е. записать его:
    EEPROM.put(address, rsMode[rs_Mode]);
    И получить его:
    EEPROM.get(address, rsMode[rs_Mode]);
    Где address = 102 ( в моём случае первые 100 уже зарезервированы по скетчу), rsMode - это static const wchar_t*rsMode - где забиты три типа дорожного покрытия, rs_Mode - это byte. Сохранить то получилось, НООО затирается первое из покрытий, т.е например : у меня идёт Асфальт, Гравий, Мокрый - выбираю Мокрый, перезагружаю контроллер, высвечивается Мокрый, но Асфальт больше выбрать не могу, получается Мокрый, Гравий, Мокрый. А так же он хоть и сохраняет последний выбранный тип покрытия но таймера остаются на своём месте, т.е таймер Асфальт остался , хотя высвечивается, что выбран Мокрый, заранее спасибо за пинок в нужную сторону
     
  17. b707

    b707 Гуру

    Вам трудно помочь, потому что вы не выкладываете код целиком, а по обрывкам совершенно непонятно, что же вы делаете.
    В частности, я абсолютно не понимаю, зачем вы пишете в ЕЕПРОМ rsMode[rs_Mode].
    Если я правильно увидел в кусочках кода - rsMode[] - это массив указателей на строки типа wchar*. У вас три покрытия - "Асфальт", "Гравии" и "Грунт",, имена которых организованных в массив. И вы зачем-то пытаетесь сохранить в памяти название, когда куда как проще сохранить просто индекс массива
    Попробуйте так - EEPROM.put(address, rs_Mode)
     
    parovoZZ нравится это.
  18. ostrov

    ostrov Гуру

    Я вообще не понял зачем массив с именами записывать в EEPROM.
     
    Последнее редактирование: 31 июл 2018
    parovoZZ нравится это.
  19. parovoZZ

    parovoZZ Гуру

    а она для чего? Всё реализуется очень просто и без нее.
     
  20. ostrov

    ostrov Гуру

    Зачем?