Как сделать считывание Eeprom один раз.

Использование внешней и внутренней EEPROM, а так-же SD card
Аватара пользователя
Oleg
Сержант
Сообщения: 198
Зарегистрирован: 17.09.2015{, 13:04}
Репутация: 1
Откуда: Беларусь
Имя: Олег

Как сделать считывание Eeprom один раз.

#1

Сообщение Oleg » 24.02.2017{, 14:39}

Скажите как после пропадания питания и после запуска программы данные из Eeprom читались только один раз.Или сбросить записанные данные. Не получается никак одолеть эту проблему.

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 36
Откуда: Коломна
Имя: Станислав
Контактная информация:

Как сделать считывание Eeprom один раз.

#2

Сообщение Boroda » 24.02.2017{, 14:56}

Заводите переменную bool ReadEPP с начальным значением True. В первой плате делаете чтение из EEPROM в переменные с входами разрешения записи. К этим входам цепляете переменную ReedEPP. После блоков чтения делаете ReadEPP = 0.
Таким образом переменные прочитаются один раз, далее бит разрешения обнулится.



Или на плате с условием. Плата выполнится только один раз.

Вложения
1904459.jpg
5010443.jpg
Последний раз редактировалось Boroda 24.02.2017{, 17:05}, всего редактировалось 1 раз.

Аватара пользователя
Vitez
Сержант
Сообщения: 202
Зарегистрирован: 08.11.2015{, 14:32}
Репутация: 4

Как сделать считывание Eeprom один раз.

#3

Сообщение Vitez » 24.02.2017{, 20:41}

Изображение

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 36
Откуда: Коломна
Имя: Станислав
Контактная информация:

Как сделать считывание Eeprom один раз.

#4

Сообщение Boroda » 24.02.2017{, 21:54}

Vitez,
Ваш код:

Код: Выделить всё

if (1) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;};
if (_trgrt1) {_gtv4 = (EEPROM.readInt(0));}
Мой код:

Код: Выделить всё

if (_gtv3) {_gtv4 = (EEPROM.readInt(0));}
_gtv3 = 0;
Чувствуете разницу?
Последний раз редактировалось Boroda 24.02.2017{, 21:55}, всего редактировалось 1 раз.

Аватара пользователя
Vitez
Сержант
Сообщения: 202
Зарегистрирован: 08.11.2015{, 14:32}
Репутация: 4

Как сделать считывание Eeprom один раз.

#5

Сообщение Vitez » 24.02.2017{, 22:15}

Boroda, Простите меня, белый господин. ))

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 36
Откуда: Коломна
Имя: Станислав
Контактная информация:

Как сделать считывание Eeprom один раз.

#6

Сообщение Boroda » 24.02.2017{, 22:23}

Просто когда у МК остается три байта свободной памяти, а надо засунуть еще кучу всего, вот такие оптимизации очень помогают (можно сократить объем программы на 10-50%). К ардуино это не относится, потому как загрузка 80% памяти уже ведет к глюкам.

Аватара пользователя
Vitez
Сержант
Сообщения: 202
Зарегистрирован: 08.11.2015{, 14:32}
Репутация: 4

Как сделать считывание Eeprom один раз.

#7

Сообщение Vitez » 24.02.2017{, 22:46}

Boroda, 99% процентов пользователей задающих подобные вопросы не создадут проект на 80% памяти. На мой взгляд, предложенная мной реализация проще именно в формате FlProg.

Чувствуете разницу?
Честно? Не очень. Я слабо знаю C++ и оценить преимущество в коде к сожалению не смогу .....
Но тем не менее, спасибо вам на новую структурную реализацию процесса, которую я возьму на учет.

Аватара пользователя
Nikan
Майор
Сообщения: 1129
Зарегистрирован: 29.12.2016{, 00:49}
Репутация: 87
Откуда: москва

Как сделать считывание Eeprom один раз.

#8

Сообщение Nikan » 24.02.2017{, 23:02}

Boroda писал(а):_gtv4 = (EEPROM.readInt(0));
void setup()
{
_gtv4 = (EEPROM.readInt(0));
}
void loop()
{
}
вот так было бы совсем правильно

жаль только, что блоку нельзя указать местонахождения
Последний раз редактировалось Nikan 24.02.2017{, 23:03}, всего редактировалось 1 раз.

Аватара пользователя
Oleg
Сержант
Сообщения: 198
Зарегистрирован: 17.09.2015{, 13:04}
Репутация: 1
Откуда: Беларусь
Имя: Олег

Как сделать считывание Eeprom один раз.

#9

Сообщение Oleg » 25.02.2017{, 08:22}

Спасибо. Я это уже пробовал работает. Но мне нужно чуть другое. Есть счетчик который считает нажатие кнопки до двух 1- откр.  2- закр. После пропадания питания соответствующая команда записывается в Eeprom. После восстановления питания читается из Eeprom один раз и выполняется противоположная команда. Дальше команды выполняются из счетчика. Нужно я так понимаю нужно обнулять записанное число в Eeprom. Помогите пожалуйста.

Аватара пользователя
Vitez
Сержант
Сообщения: 202
Зарегистрирован: 08.11.2015{, 14:32}
Репутация: 4

Как сделать считывание Eeprom один раз.

#10

Сообщение Vitez » 25.02.2017{, 09:07}

Oleg, После пропадания питания что либо записать нельзя. Для поддержания актуального состояния,необходимо каждый раз перезаписывать eeprom.

Аватара пользователя
Anydy
Администратор
Сообщения: 3281
Зарегистрирован: 30.12.2017{, 12:10}
Репутация: 278
Имя: Андрей

Как сделать считывание Eeprom один раз.

#11

Сообщение Anydy » 25.02.2017{, 09:43}

Boroda писал(а):Просто когда у МК остается три байта свободной памяти
Спрошу здесь, дабы не плодить темы...
Как оптимизировать библиотеку? Занимает 71% памяти....
Вложения
SIM800_MQTT-mas.zip
(38.95 КБ) 60 скачиваний

Аватара пользователя
Oleg
Сержант
Сообщения: 198
Зарегистрирован: 17.09.2015{, 13:04}
Репутация: 1
Откуда: Беларусь
Имя: Олег

Как сделать считывание Eeprom один раз.

#12

Сообщение Oleg » 25.02.2017{, 12:06}

Я имел ввиду что в eeprom уже до пропадания питания уже записано значение. И команда( т.е. значение взятое из памяти)должна один раз выполниться именно когда было пропадание питания. А если пропадания питания не было то работаем напрямую из счётчика.
Последний раз редактировалось Oleg 25.02.2017{, 16:42}, всего редактировалось 1 раз.

DWD
Лейтенант
Сообщения: 353
Зарегистрирован: 18.10.2015{, 13:51}
Репутация: 5
Откуда: Кривой Рог

Как сделать считывание Eeprom один раз.

#13

Сообщение DWD » 25.02.2017{, 12:30}

Boroda писал(а):К ардуино это не относится, потому как загрузка 80% памяти уже ведет к глюкам.
Это как? Если "нарисованная" программа занимает более 80% памяти МК, то её корректная работа невозможна?

Сейчас постепенно ваяю два проекта и уже получилось 70% занятия памяти в одном и 78% в другом. А реализована пока только добрая половина задуманного.
Что получается, что довёв их до логического конца я не смогу добиться нормальной их работы? Ведь уже явно видно, что память будет занята под завязку. И то, хватило бы...
Последний раз редактировалось DWD 25.02.2017{, 12:32}, всего редактировалось 1 раз.
Изображение

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 36
Откуда: Коломна
Имя: Станислав
Контактная информация:

Как сделать считывание Eeprom один раз.

#14

Сообщение Boroda » 25.02.2017{, 13:33}

DWD, тут на форуме народ обсуждал это. И говорилось именно про 80% и более. Я так понимаю, что это связано с переменными типа Стринг и внутренними массивами Си компилятора. При определенных условиях памяти не хватает и появляются глюки.

Аватара пользователя
Oleg
Сержант
Сообщения: 198
Зарегистрирован: 17.09.2015{, 13:04}
Репутация: 1
Откуда: Беларусь
Имя: Олег

Как сделать считывание Eeprom один раз.

#15

Сообщение Oleg » 25.02.2017{, 16:38}

Так как насчет меня. Вопрос к господину Boroda. Помогите по моему вопросу.Пожалуйста.

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 36
Откуда: Коломна
Имя: Станислав
Контактная информация:

Как сделать считывание Eeprom один раз.

#16

Сообщение Boroda » 25.02.2017{, 17:18}

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

Аватара пользователя
Oleg
Сержант
Сообщения: 198
Зарегистрирован: 17.09.2015{, 13:04}
Репутация: 1
Откуда: Беларусь
Имя: Олег

Как сделать считывание Eeprom один раз.

#17

Сообщение Oleg » 25.02.2017{, 21:31}

Вот прилагаю прог. Это программа управления на ардуино вместо сгоревшей платы от роллетных ворот. Есть пульт с двумя кнопками пуск и стоп. Один раз нажимаешь открытие, второй раз закрытие. Отдельная кнопка стоп. Пройденный путь считается от датчика Холла. Проблема в записи при отключении питания . Как сделать чтобы при аварийном пропадании питания записывались команда и путь. А при восстановлении питания отрабатывалась один раз противоположная команда. А потом все стиралось. Если ворота были закрыты и пропало питание, а потом появилось то просто открытие. В заводской плате было так. Я ни как не пойму как это сделать.Помогите пожалуйста.
Вложения
15.02.flp
(827.65 КБ) 68 скачиваний

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 36
Откуда: Коломна
Имя: Станислав
Контактная информация:

Как сделать считывание Eeprom один раз.

#18

Сообщение Boroda » 25.02.2017{, 22:35}

Oleg, а это вообще работает? У Вас вся схема в обратных связях...

Добавлено (25.02.2017, 22:35)
---------------------------------------------
Вы через полгода откроете свой проект и ничего тут не поймете...

Гость

Как сделать считывание Eeprom один раз.

#19

Сообщение Гость » 25.02.2017{, 22:59}

А причем тут проект?

Нужно в контроллер ввести импульс который будет появляться перед тем как пропадет питание , с него то и дадите команду на запись в память.
Можно сделать так. Если питание к примеру 9 вольт, то ставим последовательно два одинаковых резистора 1-10К и посредине будет 4.5 вольт направляем это напряжение в аналоговый вход ардуины и в проекте ставим блок сравнения ,если число на АЦП будет меньше чем при 9 вольтах , то даем импульс на запись .
Или может по другому было сделано?

Добавлено (25.02.2017, 22:59)
---------------------------------------------
Если Вы измеряете  питание на ардуине 5 В , то записывать не будет , т.к  вместе с питанием ардуины снижается и опорное напряжение , поэтому 3 вольта на ардуине будет 1023 всё равно....
Можно сделать независимое опорное напряжение на большом кондёре ,тогда все получится с 5 вольтами.
Последний раз редактировалось Anydy 25.02.2017{, 23:02}, всего редактировалось 1 раз.

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 36
Откуда: Коломна
Имя: Станислав
Контактная информация:

Как сделать считывание Eeprom один раз.

#20

Сообщение Boroda » 25.02.2017{, 23:02}

sser, а Вы проект откройте и все Lxx преобразуйте в линии. И введите импульс... на запись...

Добавлено (25.02.2017, 23:02)
---------------------------------------------
Я уже больше часа растаскиваю блоки на своем 19" монике и никак не разберусь в этих хитросплетениях.

Ответить

Вернуться в «Устройства памяти»