Страница 1 из 1

Процедура правильной записи переменной в EEPROM.

Добавлено: 18.07.2016{, 18:46}
Max
Идея и логика такая.
Общее описание. Нужно записать переменные типа int в значения таймера переменных пользовательского блока таймера, т.е. значение времени начала отсчета и конца отсчета. И дабы не зависеть от потери питания,  эти переменные надо занести в EEPROM и при восстановлении питания, соответственно, таймер будет работать дальше считав ранее записанные значения из EEPROM.

Отправляю с телефона команду на установку нужного времени. Далее, получаю переменную типа string от модема SIM800L с командой, далее разбираю строку (в теле сообщения есть код-ключ команды, напр. 1234 и далее время, напр. 09 часов - 123409 для начала отсчета и, например 432122, 22 часа, для конца отсчета). Преобразую в int для занесения в память EEPROM.
Т.к. у меня принимающий (мастер) и получающий (слейв) модули общаются по радиоканалу (NRF24), то отсылаю эту команду дальше по радиоканалу с мастера на слейв, в слейве находится блок таймера+часы и там же и надо сохранить в EEPROM.

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

Добавлено (18.07.2016, 18:46)
---------------------------------------------
Подниму ка темку!

Дополню проектом.

Ни как не получается независимо для каждого значения сохранять переменные...

Процедура правильной записи переменной в EEPROM.

Добавлено: 20.07.2016{, 10:45}
rw6cm
Max писал(а):Ни как не получается независимо для каждого значения сохранять переменные...
Не знаю что не получается, так как воссоздать полную схему не возможно.
Но в том что выложили бардак ))
Инфо на дисплее не влазит, и друг на друге, не пойми что.
какие то не нужные перекодировки.
в общем при нормальной правильной посылке должно все работать.
думаю сообразите.

Процедура правильной записи переменной в EEPROM.

Добавлено: 20.07.2016{, 10:55}
Max
rw6cm писал(а):Инфо на дисплее не влазит, и друг на друге, не пойми что.
Да это просто макет.
На дисплей вывел, для наглядности. Проблема в том, что не получается из строчной переменной (string) записать значение в EEPROM.
Т.е. из строки вылавливается, преобразую в int, но не записывается в память, т.е. не сохраняет. Если, приходят новые данные, то стираются (просто ноль в переменной получается) ранее записанные данные.
Задача то вроде простая, записать нужный участок строки в EEPROM и в последующем что бы там эти данные сохранялись не реагируя на другие полученные данные. Если, надо поменять, то только по коду (допустим строка 123455520) из неё надо сохранить только 20 (то, что в конце) и изменять можно только получив код, например: 123455519. Соответственно 20 меняется на 19...

Да, еще, при работе с EEPROM часто программа вылетает. Ужа в багтрекере Сергей написал. У меня так же...

Процедура правильной записи переменной в EEPROM.

Добавлено: 20.07.2016{, 11:10}
rw6cm
Это понятно, но пока разобрался убил время.
С EEPROM надо аккуратней)), не нужно копировать, если удалили создавайте с новым именем.
От эмулятора по кнопке измененный проект работает, дальше сами.

Процедура правильной записи переменной в EEPROM.

Добавлено: 20.07.2016{, 11:17}
Max
rw6cm писал(а):От эмулятора по кнопке измененный проект работает, дальше сами.
Вечером посмотрю. Спасибо. Если, будут вопросы, то опять задам...

Добавлено (20.07.2016, 11:17)
---------------------------------------------
rw6cm писал(а):если удалили создавайте с новым именем.
Т.е. надо менять имя для переменной внутри EEPROM? И это каждый раз, может не работать?

Процедура правильной записи переменной в EEPROM.

Добавлено: 20.07.2016{, 11:27}
rw6cm
Max писал(а):Т.е. надо менять имя для переменной внутри EEPROM? И это каждый раз, может не работать?
Не было времени разобраться.
Но в вашем проекте мне не удалось в ячейки памяти что либо записать,
Попытался скопировать на новую плату, чтоб разобраться, прога вылетела.
хотел создать заново эти ячейки, опять вылет.
Удалил память сделал по новой с новыми именами все пошло. хз что может быть
Но запись в ячейки пошла после коррекции проекта. в вашем варианте не идет.

Хотя сейчас загрузил по новой ваш проект, отключил плату NRF, вместо нее подкинул эмулятор,
оставил нужную инфо на дисплей, попробовал залить, - заругался на 1wire (в прошлый раз не ругался)
Удалил массив кинул датчику адрес в ручную, - все пошло,  запись заработала и вашем варианте.

Процедура правильной записи переменной в EEPROM.

Добавлено: 21.07.2016{, 18:11}
Max
rw6cm писал(а):в общем при нормальной правильной посылке должно все работать.думаю сообразите.
В принципе работает... Конечно, ваш вариант почти не отличается от моего, разве что конвертация при непосредственной записи в ЕЕПРОМ...
НО, иногда, не смог понять почему, не записывается и затирая старые данные просто нулем... хотя, строка с командой приходит....
через несколько секунд повторно посылаю ту же команду, то записывает... парадокс какой то... нет стабильности и четкости в записи...

Процедура правильной записи переменной в EEPROM.

Добавлено: 21.07.2016{, 18:38}
rw6cm
Max писал(а):нет стабильности и четкости в записи...
Что то в момент записи забирает прерывание на себя.
Попробуйте на момент записи отключать не нужные циклы.

Процедура правильной записи переменной в EEPROM.

Добавлено: 23.07.2016{, 22:11}
Max
rw6cm писал(а):Попробуйте на момент записи отключать не нужные циклы.
Убрал контрольные блоки... Остальное все нужно. Но, так и остались провалы в записи EEPROM...

Буду дальше смотреть.

Как будто, то принимает строку нормально один раз, то, другой раз, так же принимает, но не до конвертирует что ли....

Либо, в некоторые моменты цикла строка приходит в "неудобный" момент и запись не получается... Еще, есть некоторые подозрения на блок NRF24, возможно в нем какая то засада, хотя вижу пришедшую строку...

Процедура правильной записи переменной в EEPROM.

Добавлено: 24.07.2016{, 08:54}
Skull
Если много строковых переменных иногда срывается стек. не только EEPROM пишется через раз, но и вывод в UART происходит странно- то строки недоскладывает, то вообще точку выводит

Процедура правильной записи переменной в EEPROM.

Добавлено: 24.07.2016{, 13:30}
rw6cm
Max писал(а):Убрал контрольные блоки... Остальное все нужно. Но, так и остались провалы в записи EEPROM...
Тяжело гадать, когда нет NRFки под рукой ))
Может попробовать сделать запись с задержкой, допустим в пол секунды,
допустим так:

СпойлерПоказать
Хорошо бы перед записью отключать NRFку, но походу такой функции в блоке нет.

Процедура правильной записи переменной в EEPROM.

Добавлено: 25.07.2016{, 06:16}
Max
Продолжаю мучить свой проект...
Как выше я писал, недозаписывает, или недоконвертирует, хотя строка с командой с сервера приходит полностью.
Обратил внимание на следующее. Вот отправил команду. Строка пришла на слейв, пришло допустим 123466623 должно было записаться "23" (то, что в конце), а записалось только "2", а "3" не записалось (а иногда записывается нормально!), или записывает просто "0"! Но стоит на слейве нажать кнопку перезагрузки Ардуино, как нужное число записывается нормально (!) (на мастере переменная записывается по команде "запись переменной" и поэтому, как бы висит в эфире пока не придет другая переменная).
rw6cm писал(а):Может попробовать сделать запись с задержкой, допустим в пол секунды,допустим так:
Пробовал, не проходит. Еще хуже...

Процедура правильной записи переменной в EEPROM.

Добавлено: 25.07.2016{, 13:47}
rw6cm
Сделайте еще так:

СпойлерПоказать

Процедура правильной записи переменной в EEPROM.

Добавлено: 25.07.2016{, 17:00}
Max
rw6cm писал(а):Сделайте еще так:
Делал уже так. Как раз так, чаще всего записывает правильно... Но, не всегда.... Уже руки опускаются, хоть на ModBUS переходи.... Но нужно именно беспроводный канал...
Чертовщина какая то...
Либо, обработать на стороне сервера и послать уже готовое значение в в виде int на слейв...

Процедура правильной записи переменной в EEPROM.

Добавлено: 25.07.2016{, 23:55}
rw6cm
Попробовать упростить до минимума, без дополнительных переменных.
СпойлерПоказать
Как вариант прикрутить в конце посылки пару не нужных цифр,
и посмотреть как будет.
Со скоростью передачи между NRF думаю экспериментировали.
С технической стороны надеюсь все "чикичики" (Развязка, стабильность питания, короткие провода и т д)

п/с Хотел себе выписать NRF-ки - чувствую можно не спешить

Процедура правильной записи переменной в EEPROM.

Добавлено: 26.07.2016{, 18:38}
Max
Путем многочисленных экспериментов в живую на железе пришел к следующей конструкции (сторона сервера-отправка на слейв) и добавил дополнительно три произвольных символа в конце строки:


Приемная сторона (слейв) разбор строк и выделение нужного значения:



С чем связано не запись и пропадание значений не понятно. Строка отправлялась и принималась полностью (контроль только визуально, по дисплею). Возможно, происходили какие то корреляции и последние символы приходили или накладывались на цикл работы программы....

Спасибо пользователю rw6cm за участие в прениях.

Мое решение не идеальное и возможно громоздкое, но оно сейчас работает и выполняет нужные функции.

От NRF24 так же не в восторге. Хотелось бы, что бы кто нибудь взялся бы за написание модуля для более серьезного, надежного, дальнобойного блока-трансивера и желательно со встроенной логикой кодировки сигнала.
Эта тема очень востребована, особенно при нежелании и невозможности тянуть провода. Очень интересна была бы возможность ModBUS по воздуху...

Процедура правильной записи переменной в EEPROM.

Добавлено: 27.07.2016{, 02:22}
CraCk
Max писал(а):модуля для более серьезного, надежного, дальнобойного блока-трансивера и желательно со встроенной логикой кодировки сигнала.
Перерыл Китайские магазины dx.com и ему подобные на наличие доступных и недорогих модулей.
Самый дешевый радиомодуль
esp8266 07 - 2$
SI4432 -2,5$ Интерфейс SPI. Дальность до 1,5км.
CC1101 (HC-11) - 3,37$ Интерфейс UART что не очень хорошо. Для беспроводной сети из большого количества клиентов. Также питание от батарейного источника тоже под вопросом, потому что стоит на нем еще и STM контроллер. Только как вариант, менять прошивку на самом STM, когда появиться поддержка в FLprog. Тогда цена получиться как NRF24+arduino
NRF905 - 3,71$ Интерфейс SPI. Поддерживает разные частоты 433/486/915 МГц
RFM69 - 3,92$ Интерфейс SPI
SI4463 (HC-12) - 4,33$ Интерфейс тоже UART. http://cxem.net/review/review26.php
Так что выбор небольшой и цены не очень приятны, для бюджетного использования.

Добавлено (27.07.2016, 02:22)
---------------------------------------------
Max писал(а):Очень интересна была бы возможность ModBUS по воздуху...
Хотя кажись CC1101 (HC-11),SI4463 (HC-12) можно создать беспроводный ModBUS у этих модулей есть RX TX.