Процедура правильной записи переменной в EEPROM.
Процедура правильной записи переменной в EEPROM.
Идея и логика такая.
Общее описание. Нужно записать переменные типа int в значения таймера переменных пользовательского блока таймера, т.е. значение времени начала отсчета и конца отсчета. И дабы не зависеть от потери питания, эти переменные надо занести в EEPROM и при восстановлении питания, соответственно, таймер будет работать дальше считав ранее записанные значения из EEPROM.
Отправляю с телефона команду на установку нужного времени. Далее, получаю переменную типа string от модема SIM800L с командой, далее разбираю строку (в теле сообщения есть код-ключ команды, напр. 1234 и далее время, напр. 09 часов - 123409 для начала отсчета и, например 432122, 22 часа, для конца отсчета). Преобразую в int для занесения в память EEPROM.
Т.к. у меня принимающий (мастер) и получающий (слейв) модули общаются по радиоканалу (NRF24), то отсылаю эту команду дальше по радиоканалу с мастера на слейв, в слейве находится блок таймера+часы и там же и надо сохранить в EEPROM.
Незадача в том, как правильно записать эти переданные значения часов в EEPROM? Еще, при перезагрузке мастера в слейве записываются нули...
Как же сделать так, что бы в EEPROM записывались только нужные данные по команде и другие посторонние данные не записывались?
Добавлено (18.07.2016, 18:46)
---------------------------------------------
Подниму ка темку!
Дополню проектом.
Ни как не получается независимо для каждого значения сохранять переменные...
Общее описание. Нужно записать переменные типа int в значения таймера переменных пользовательского блока таймера, т.е. значение времени начала отсчета и конца отсчета. И дабы не зависеть от потери питания, эти переменные надо занести в EEPROM и при восстановлении питания, соответственно, таймер будет работать дальше считав ранее записанные значения из EEPROM.
Отправляю с телефона команду на установку нужного времени. Далее, получаю переменную типа string от модема SIM800L с командой, далее разбираю строку (в теле сообщения есть код-ключ команды, напр. 1234 и далее время, напр. 09 часов - 123409 для начала отсчета и, например 432122, 22 часа, для конца отсчета). Преобразую в int для занесения в память EEPROM.
Т.к. у меня принимающий (мастер) и получающий (слейв) модули общаются по радиоканалу (NRF24), то отсылаю эту команду дальше по радиоканалу с мастера на слейв, в слейве находится блок таймера+часы и там же и надо сохранить в EEPROM.
Незадача в том, как правильно записать эти переданные значения часов в EEPROM? Еще, при перезагрузке мастера в слейве записываются нули...
Как же сделать так, что бы в EEPROM записывались только нужные данные по команде и другие посторонние данные не записывались?
Добавлено (18.07.2016, 18:46)
---------------------------------------------
Подниму ка темку!
Дополню проектом.
Ни как не получается независимо для каждого значения сохранять переменные...
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось Max 19 июл 2016, 19:19, всего редактировалось 1 раз.
- rw6cm
- Полковник
- Сообщения: 2372
- Зарегистрирован: 06 сен 2015, 20:25
- Имя: Владимир
- Поблагодарили: 41 раз
Процедура правильной записи переменной в EEPROM.
Не знаю что не получается, так как воссоздать полную схему не возможно.Max писал(а):Ни как не получается независимо для каждого значения сохранять переменные...
Но в том что выложили бардак ))
Инфо на дисплее не влазит, и друг на друге, не пойми что.
какие то не нужные перекодировки.
в общем при нормальной правильной посылке должно все работать.
думаю сообразите.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось rw6cm 20 июл 2016, 10:47, всего редактировалось 1 раз.
Win10-64, FLProg (portable)
Процедура правильной записи переменной в EEPROM.
Да это просто макет.rw6cm писал(а):Инфо на дисплее не влазит, и друг на друге, не пойми что.
На дисплей вывел, для наглядности. Проблема в том, что не получается из строчной переменной (string) записать значение в EEPROM.
Т.е. из строки вылавливается, преобразую в int, но не записывается в память, т.е. не сохраняет. Если, приходят новые данные, то стираются (просто ноль в переменной получается) ранее записанные данные.
Задача то вроде простая, записать нужный участок строки в EEPROM и в последующем что бы там эти данные сохранялись не реагируя на другие полученные данные. Если, надо поменять, то только по коду (допустим строка 123455520) из неё надо сохранить только 20 (то, что в конце) и изменять можно только получив код, например: 123455519. Соответственно 20 меняется на 19...
Да, еще, при работе с EEPROM часто программа вылетает. Ужа в багтрекере Сергей написал. У меня так же...
Последний раз редактировалось Max 20 июл 2016, 11:02, всего редактировалось 1 раз.
- rw6cm
- Полковник
- Сообщения: 2372
- Зарегистрирован: 06 сен 2015, 20:25
- Имя: Владимир
- Поблагодарили: 41 раз
Процедура правильной записи переменной в EEPROM.
Это понятно, но пока разобрался убил время.
С EEPROM надо аккуратней)), не нужно копировать, если удалили создавайте с новым именем.
От эмулятора по кнопке измененный проект работает, дальше сами.
С EEPROM надо аккуратней)), не нужно копировать, если удалили создавайте с новым именем.
От эмулятора по кнопке измененный проект работает, дальше сами.
Win10-64, FLProg (portable)
Процедура правильной записи переменной в EEPROM.
Вечером посмотрю. Спасибо. Если, будут вопросы, то опять задам...rw6cm писал(а):От эмулятора по кнопке измененный проект работает, дальше сами.
Добавлено (20.07.2016, 11:17)
---------------------------------------------
Т.е. надо менять имя для переменной внутри EEPROM? И это каждый раз, может не работать?rw6cm писал(а):если удалили создавайте с новым именем.
- rw6cm
- Полковник
- Сообщения: 2372
- Зарегистрирован: 06 сен 2015, 20:25
- Имя: Владимир
- Поблагодарили: 41 раз
Процедура правильной записи переменной в EEPROM.
Не было времени разобраться.Max писал(а):Т.е. надо менять имя для переменной внутри EEPROM? И это каждый раз, может не работать?
Но в вашем проекте мне не удалось в ячейки памяти что либо записать,
Попытался скопировать на новую плату, чтоб разобраться, прога вылетела.
хотел создать заново эти ячейки, опять вылет.
Удалил память сделал по новой с новыми именами все пошло. хз что может быть
Но запись в ячейки пошла после коррекции проекта. в вашем варианте не идет.
Хотя сейчас загрузил по новой ваш проект, отключил плату NRF, вместо нее подкинул эмулятор,
оставил нужную инфо на дисплей, попробовал залить, - заругался на 1wire (в прошлый раз не ругался)
Удалил массив кинул датчику адрес в ручную, - все пошло, запись заработала и вашем варианте.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось rw6cm 20 июл 2016, 12:38, всего редактировалось 1 раз.
Win10-64, FLProg (portable)
Процедура правильной записи переменной в EEPROM.
В принципе работает... Конечно, ваш вариант почти не отличается от моего, разве что конвертация при непосредственной записи в ЕЕПРОМ...rw6cm писал(а):в общем при нормальной правильной посылке должно все работать.думаю сообразите.
НО, иногда, не смог понять почему, не записывается и затирая старые данные просто нулем... хотя, строка с командой приходит....
через несколько секунд повторно посылаю ту же команду, то записывает... парадокс какой то... нет стабильности и четкости в записи...
Последний раз редактировалось Max 21 июл 2016, 18:15, всего редактировалось 1 раз.
- rw6cm
- Полковник
- Сообщения: 2372
- Зарегистрирован: 06 сен 2015, 20:25
- Имя: Владимир
- Поблагодарили: 41 раз
Процедура правильной записи переменной в EEPROM.
Что то в момент записи забирает прерывание на себя.Max писал(а):нет стабильности и четкости в записи...
Попробуйте на момент записи отключать не нужные циклы.
Win10-64, FLProg (portable)
Процедура правильной записи переменной в EEPROM.
Убрал контрольные блоки... Остальное все нужно. Но, так и остались провалы в записи EEPROM...rw6cm писал(а):Попробуйте на момент записи отключать не нужные циклы.
Буду дальше смотреть.
Как будто, то принимает строку нормально один раз, то, другой раз, так же принимает, но не до конвертирует что ли....
Либо, в некоторые моменты цикла строка приходит в "неудобный" момент и запись не получается... Еще, есть некоторые подозрения на блок NRF24, возможно в нем какая то засада, хотя вижу пришедшую строку...
Последний раз редактировалось Max 23 июл 2016, 22:33, всего редактировалось 1 раз.
Процедура правильной записи переменной в EEPROM.
Если много строковых переменных иногда срывается стек. не только EEPROM пишется через раз, но и вывод в UART происходит странно- то строки недоскладывает, то вообще точку выводит
- rw6cm
- Полковник
- Сообщения: 2372
- Зарегистрирован: 06 сен 2015, 20:25
- Имя: Владимир
- Поблагодарили: 41 раз
Процедура правильной записи переменной в EEPROM.
Тяжело гадать, когда нет NRFки под рукой ))Max писал(а):Убрал контрольные блоки... Остальное все нужно. Но, так и остались провалы в записи EEPROM...
Может попробовать сделать запись с задержкой, допустим в пол секунды,
допустим так:
[spoiler=Спойлер][/spoiler]Хорошо бы перед записью отключать NRFку, но походу такой функции в блоке нет.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Win10-64, FLProg (portable)
Процедура правильной записи переменной в EEPROM.
Продолжаю мучить свой проект...
Как выше я писал, недозаписывает, или недоконвертирует, хотя строка с командой с сервера приходит полностью.
Обратил внимание на следующее. Вот отправил команду. Строка пришла на слейв, пришло допустим 123466623 должно было записаться "23" (то, что в конце), а записалось только "2", а "3" не записалось (а иногда записывается нормально!), или записывает просто "0"! Но стоит на слейве нажать кнопку перезагрузки Ардуино, как нужное число записывается нормально (!) (на мастере переменная записывается по команде "запись переменной" и поэтому, как бы висит в эфире пока не придет другая переменная).
Как выше я писал, недозаписывает, или недоконвертирует, хотя строка с командой с сервера приходит полностью.
Обратил внимание на следующее. Вот отправил команду. Строка пришла на слейв, пришло допустим 123466623 должно было записаться "23" (то, что в конце), а записалось только "2", а "3" не записалось (а иногда записывается нормально!), или записывает просто "0"! Но стоит на слейве нажать кнопку перезагрузки Ардуино, как нужное число записывается нормально (!) (на мастере переменная записывается по команде "запись переменной" и поэтому, как бы висит в эфире пока не придет другая переменная).
Пробовал, не проходит. Еще хуже...rw6cm писал(а):Может попробовать сделать запись с задержкой, допустим в пол секунды,допустим так:
Последний раз редактировалось Max 25 июл 2016, 06:27, всего редактировалось 1 раз.
- rw6cm
- Полковник
- Сообщения: 2372
- Зарегистрирован: 06 сен 2015, 20:25
- Имя: Владимир
- Поблагодарили: 41 раз
Процедура правильной записи переменной в EEPROM.
Сделайте еще так:
[spoiler=Спойлер][/spoiler]
[spoiler=Спойлер][/spoiler]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось rw6cm 25 июл 2016, 13:56, всего редактировалось 1 раз.
Win10-64, FLProg (portable)
Процедура правильной записи переменной в EEPROM.
Делал уже так. Как раз так, чаще всего записывает правильно... Но, не всегда.... Уже руки опускаются, хоть на ModBUS переходи.... Но нужно именно беспроводный канал...rw6cm писал(а):Сделайте еще так:
Чертовщина какая то...
Либо, обработать на стороне сервера и послать уже готовое значение в в виде int на слейв...
- rw6cm
- Полковник
- Сообщения: 2372
- Зарегистрирован: 06 сен 2015, 20:25
- Имя: Владимир
- Поблагодарили: 41 раз
Процедура правильной записи переменной в EEPROM.
Попробовать упростить до минимума, без дополнительных переменных.
[spoiler=Спойлер][/spoiler]
Как вариант прикрутить в конце посылки пару не нужных цифр,
и посмотреть как будет.
Со скоростью передачи между NRF думаю экспериментировали.
С технической стороны надеюсь все "чикичики" (Развязка, стабильность питания, короткие провода и т д)
п/с Хотел себе выписать NRF-ки - чувствую можно не спешить
[spoiler=Спойлер][/spoiler]
Как вариант прикрутить в конце посылки пару не нужных цифр,
и посмотреть как будет.
Со скоростью передачи между NRF думаю экспериментировали.
С технической стороны надеюсь все "чикичики" (Развязка, стабильность питания, короткие провода и т д)
п/с Хотел себе выписать NRF-ки - чувствую можно не спешить
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось rw6cm 26 июл 2016, 00:07, всего редактировалось 1 раз.
Win10-64, FLProg (portable)
Процедура правильной записи переменной в EEPROM.
Путем многочисленных экспериментов в живую на железе пришел к следующей конструкции (сторона сервера-отправка на слейв) и добавил дополнительно три произвольных символа в конце строки:
Приемная сторона (слейв) разбор строк и выделение нужного значения:
С чем связано не запись и пропадание значений не понятно. Строка отправлялась и принималась полностью (контроль только визуально, по дисплею). Возможно, происходили какие то корреляции и последние символы приходили или накладывались на цикл работы программы....
Спасибо пользователю rw6cm за участие в прениях.
Мое решение не идеальное и возможно громоздкое, но оно сейчас работает и выполняет нужные функции.
От NRF24 так же не в восторге. Хотелось бы, что бы кто нибудь взялся бы за написание модуля для более серьезного, надежного, дальнобойного блока-трансивера и желательно со встроенной логикой кодировки сигнала.
Эта тема очень востребована, особенно при нежелании и невозможности тянуть провода. Очень интересна была бы возможность ModBUS по воздуху...
Приемная сторона (слейв) разбор строк и выделение нужного значения:
С чем связано не запись и пропадание значений не понятно. Строка отправлялась и принималась полностью (контроль только визуально, по дисплею). Возможно, происходили какие то корреляции и последние символы приходили или накладывались на цикл работы программы....
Спасибо пользователю rw6cm за участие в прениях.
Мое решение не идеальное и возможно громоздкое, но оно сейчас работает и выполняет нужные функции.
От NRF24 так же не в восторге. Хотелось бы, что бы кто нибудь взялся бы за написание модуля для более серьезного, надежного, дальнобойного блока-трансивера и желательно со встроенной логикой кодировки сигнала.
Эта тема очень востребована, особенно при нежелании и невозможности тянуть провода. Очень интересна была бы возможность ModBUS по воздуху...
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось Max 26 июл 2016, 18:41, всего редактировалось 1 раз.
-
- Лейтенант
- Сообщения: 674
- Зарегистрирован: 10 сен 2015, 21:51
- Благодарил (а): 1 раз
- Поблагодарили: 1 раз
Процедура правильной записи переменной в EEPROM.
Перерыл Китайские магазины dx.com и ему подобные на наличие доступных и недорогих модулей.Max писал(а):модуля для более серьезного, надежного, дальнобойного блока-трансивера и желательно со встроенной логикой кодировки сигнала.
Самый дешевый радиомодуль
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)
---------------------------------------------
Хотя кажись CC1101 (HC-11),SI4463 (HC-12) можно создать беспроводный ModBUS у этих модулей есть RX TX.Max писал(а):Очень интересна была бы возможность ModBUS по воздуху...
Последний раз редактировалось CraCk 27 июл 2016, 01:46, всего редактировалось 1 раз.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя