Как задать стартовое значение переменной?

Megawollt
Offline
Зарегистрирован: 06.12.2015

При запуске программы значение переменной считывается из памяти EEPROM и в процессе регулируется программой, но проблема в том, что переменная типа long и ей нужно задать какое то стартовое значение

Как это можно сделать?

sadman41
Offline
Зарегистрирован: 19.10.2016

long peremennaya=666L;

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А если надо 777? Тогда как?

Megawollt
Offline
Зарегистрирован: 06.12.2015
unsigned long moment = 80000;

void setup(){

moment = EEPROM_ulong_read(1);
}

void loop() {
if(EEPROM_ulong_read(1) != moment){
EEPROM_ulong_write(1, moment);
}
}

Даже если значение задать, то все равно считается из ячейки максимум для long

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Откуда Вам это известно? Никаких отладочных печатей в скетче нет.

Megawollt
Offline
Зарегистрирован: 06.12.2015

Потому что в свежей микросхеме ячейки памяти забиты значениями 255.

Это конечно не весь скетч, просто все остальное к памяти отношения не имеет

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, тогда ладно.

sadman41
Offline
Зарегистрирован: 19.10.2016

ЕвгенийП пишет:

А если надо 777? Тогда как?

Придется второй скетч писать...

sadman41
Offline
Зарегистрирован: 19.10.2016

Megawollt пишет:

Даже если значение задать, то все равно считается из ячейки максимум для long

https://www.arduino.cc/en/Reference/EEPROMGet

b707
Offline
Зарегистрирован: 26.05.2017

Megawollt пишет:
Даже если значение задать, то все равно считается из ячейки максимум для long

кто-нибудь! переведите мне эту фразу... тоже хочу посмеяться

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

кто-нибудь! переведите мне эту фразу... тоже хочу посмеяться

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

sadman41
Offline
Зарегистрирован: 19.10.2016

А... так это что, в сетапе надо EEPROM.put() вызывать что ли...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:

А... так это что, в сетапе надо EEPROM.put() вызывать что ли...

EEPROM.put() выглядит как-то половинчато. Вызывать, так сразу бригаду из "Кащенко"

Megawollt
Offline
Зарегистрирован: 06.12.2015

Спасибо. А EEPROM.put будет же вызываться каждый запуск и записывать туда это же значение. Так?

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

ЕвгенийП пишет:

sadman41 пишет:

А... так это что, в сетапе надо EEPROM.put() вызывать что ли...

EEPROM.put() выглядит как-то половинчато. Вызывать, так сразу бригаду из "Кащенко"

и в loop-е  :)

sadman41
Offline
Зарегистрирован: 19.10.2016

Megawollt пишет:

Спасибо. А EEPROM.put будет же вызываться каждый запуск и записывать туда это же значение. Так?

Ну, а какие варианты еще есть? Напишите отдельный скетч, который проинитит еепром. Или обрабатывайте на старте ситуацию с закороченным пином (нажатой кнопкой) и при этом условии пишите свои дефолты в EEPROM. 

b707
Offline
Зарегистрирован: 26.05.2017

Megawollt - Вам нужен признак того, что в ЕПРОМе есть данные. Например, я записываю в ячейки 0 и 1 значения 0xB7 0x07

Теперь, когла программа стартует - она первым делом лезет в эти ячейки и смотрит, записан ли там мой ник :) Если да - значит в Епроме есть данные и их надо считать. Если нет - значит это свежая ардуина, тогда задаем данные в сетапе и сохраняем их в ЕПРОМ, попутно записывая "B707" в две первые ячейки.

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

Ну, а какие варианты еще есть? Напишите отдельный скетч, который проинитит еепром. Или обрабатывайте на старте ситуацию с закороченным пином (нажатой кнопкой) и при этом условии пишите свои дефолты в EEPROM. 

мне казалось, что вариант с меткой - очевидный...

sadman41
Offline
Зарегистрирован: 19.10.2016

А если она не свежая, а просто чужая....

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

А если она не свежая, а просто чужая....

ну крайне маловероятно, что в чужой ардуине в первых ячейках епрома будет B707

если ты имеешь в виду другой скетч - то метки-то я в каждом скетче ставлю разные, "B707" это я тут для примера только

 

Кроме того, по умолчанию Епром при прошивке чистится.

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

sadman41 пишет:

Ну, а какие варианты еще есть? Напишите отдельный скетч, который проинитит еепром. Или обрабатывайте на старте ситуацию с закороченным пином (нажатой кнопкой) и при этом условии пишите свои дефолты в EEPROM. 

мне казалось, что вариант с меткой - очевидный...

Не спорю. До того момента, когда пользователь запишет что-нибудь неудачное в EEPROM и это будет критичным моментом. Например - флаг использования DHCP на старте. Пропал сервер - всё, ардуина отдыхает. А так пин ей замкнули, она дефолт вписала в EEPROM и все довольны.

P.S. Если пример с DHCP не понравится, то можно дефолтить пароль, к примеру.

5N62V
Offline
Зарегистрирован: 25.02.2016

сегодня пару часов убил не еепром: была прописана ф-ция инициирование еепром в сетапе. Ну думаю, пора закомментить ее вызов, все уже настроено. Закоментил - не работает, раскоментил - работает. Реально два часа убил чтобы допереть, что если камень прописывать USBasp, то он, собака, еепром затирает и чтоб правильно, то надо после флеша прописывать  еепром. Вот ... :)

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Есть специЯльный фьюз для защиты епрома при программировании.......

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А что, если -e не указывать, всё равно стирает епром?

5N62V
Offline
Зарегистрирован: 25.02.2016

ЕвгенийП пишет:

А что, если -e не указывать, всё равно стирает епром?

в том-то и дело! :)