Запись в EEPROM отрицательных значений

Проблемы с записью отрицательныз значений в EEPROM

Вопросы от новичков
Ответить
hsl
Рядовой
Сообщения: 6
Зарегистрирован: 22.03.2019{, 19:16}
Репутация: 0
Имя: Sergej

Запись в EEPROM отрицательных значений

#1

Сообщение hsl » 22.03.2019{, 20:48}

Доброго времени суток.
Такая ситуация, использую штатные блоки чтения и записи EEPROM и переменную, у всех установлен тип данных integer.
Из переменной по сигналу значение записывается в EEPROM, затем при старте программы значение из EEPROM читается в переменную.
Если в переменной используются положительные значения все работает правильно. Но если из переменной в EEPROM передается отрицательное значение то в EEPROM оказывается совсем другое значение, например если в переменной -1 то в EEPROM записывается 65535.
Я не совсем понимаю как это вообще возможно, ведь у EEPROM установлен тип данных integer и такое число туда не должно влезать.
Вот этот кусок, здесь на EEPROM уже просто константой подаю -11 и после сигнала записи на выходе этой EEPROM через конвертацию числа в строку получаю 65525
3.jpg
Как такое возможно или, что я делаю не так?

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Запись в EEPROM отрицательных значений

#2

Сообщение Sancho » 22.03.2019{, 21:21}

Тип данных - просто сделайте, после чтения, присвойте переменной с типом инт, и её на дисплей.

Отправлено спустя 27 секунд:
Завтра посмотрю другие варианты.

Отправлено спустя 7 минут 9 секунд:
Ха, внутри вот так!

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

 int readIntegerFromEEPROM(int addres, byte bitAddres, byte chipAddres)
{
byte hight = readByteFromEEPROM( addres,  bitAddres,  chipAddres);
byte low = readByteFromEEPROM( (addres+1),  bitAddres,  chipAddres);
return  word(hight, low);
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

hsl
Рядовой
Сообщения: 6
Зарегистрирован: 22.03.2019{, 19:16}
Репутация: 0
Имя: Sergej

Запись в EEPROM отрицательных значений

#3

Сообщение hsl » 22.03.2019{, 22:57}

Я правильно понял
5.jpg
была у меня такая мысль, но результат тот же.
Там ведь и так везде тип данных integer.
Искал решение проблемы в интернете и наткнулся вот на такую формулировку
"одни и теже 16 бит памяти если смотреть на них как на int это -11, а если смотреть на них же как на unsigned int то это 65525"
Вроде как вот оно, но только не понятно как это применить то, ведь как я уже писал у всех элементов установлен один и тот же тип данных, это integer

Аватара пользователя
Fuji1604
Сержант
Сообщения: 282
Зарегистрирован: 19.01.2016{, 06:09}
Репутация: 40
Откуда: Березники
Имя: Сергей

Запись в EEPROM отрицательных значений

#4

Сообщение Fuji1604 » 22.03.2019{, 23:12}

Утверждение верное, так и есть. Не в тему, но как показала практика, помимо знакового и беззнакового int, бывает еще и int 16 bit и int 32 bit
когда мастерю обычно подсматриваю,
не рыли ли окоп в том же направлении,
не изобретали ли велосипед с такими-же квадратными как у меня колёсами,
а уже потом - не торопясь, торю свою лыжню

Ingwar
Полковник
Сообщения: 1929
Зарегистрирован: 28.10.2015{, 22:47}
Репутация: 223
Откуда: Ленобласть
Имя: Игорь

Запись в EEPROM отрицательных значений

#5

Сообщение Ingwar » 22.03.2019{, 23:44}

Проверил с записью через переменную, но не в железе.
СпойлерПоказать
2.png
СпойлерПоказать
3.png
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.

hsl
Рядовой
Сообщения: 6
Зарегистрирован: 22.03.2019{, 19:16}
Репутация: 0
Имя: Sergej

Запись в EEPROM отрицательных значений

#6

Сообщение hsl » 22.03.2019{, 23:54}

Да, в протеусе порой все работает идеально.
Не знаю имеет ли это значение в данном случае, в качестве железа у меня ESP8266-01

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Запись в EEPROM отрицательных значений

#7

Сообщение Sancho » 23.03.2019{, 08:13}

hsl, Найдите в коде, внизу, строки как я писал выше, и замените последние три строки на
int16_t i = readByteFromEEPROM( addres, bitAddres, chipAddres);
i = i<<8 | readByteFromEEPROM( (addres+1), bitAddres, chipAddres);
return i;

Отправлено спустя 2 минуты 10 секунд:
hsl писал(а):
22.03.2019{, 23:54}
в качестве железа у меня ESP8266-01
80 MHz 32-bit процессор :)
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

Аватара пользователя
RedSky
Лейтенант
Сообщения: 574
Зарегистрирован: 19.12.2016{, 20:07}
Репутация: 72
Откуда: Днепропетровск
Имя: Алексей

Запись в EEPROM отрицательных значений

#8

Сообщение RedSky » 23.03.2019{, 08:22}

Помню сталкивался с таким. Попробуйте ваши 65 тысяч привести к типу int. Создайте простой блок out = int(in), должно помочь.

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Запись в EEPROM отрицательных значений

#9

Сообщение Sancho » 23.03.2019{, 08:33}

RedSky, 8266 интерпретирует данные как 32 бита, поэтому так не поможет. наверно.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

Аватара пользователя
RedSky
Лейтенант
Сообщения: 574
Зарегистрирован: 19.12.2016{, 20:07}
Репутация: 72
Откуда: Днепропетровск
Имя: Алексей

Запись в EEPROM отрицательных значений

#10

Сообщение RedSky » 23.03.2019{, 08:52}

Ну попробовать можно, может с тогда с long прокатит.

pan
Полковник
Сообщения: 2860
Зарегистрирован: 13.04.2017{, 11:57}
Репутация: 204
Имя: noname

Запись в EEPROM отрицательных значений

#11

Сообщение pan » 23.03.2019{, 11:15}

hsl писал(а):
22.03.2019{, 23:54}
знаю имеет ли это значение в данном случае, в качестве железа у меня ESP8266
тогда в данном случае у вас инт это + - 2147483647

hsl
Рядовой
Сообщения: 6
Зарегистрирован: 22.03.2019{, 19:16}
Репутация: 0
Имя: Sergej

Запись в EEPROM отрицательных значений

#12

Сообщение hsl » 23.03.2019{, 17:45}

RedSky писал(а):
23.03.2019{, 08:22}
Помню сталкивался с таким. Попробуйте ваши 65 тысяч привести к типу int. Создайте простой блок out = int(in), должно помочь.
Я только пробую работать с FLProg и не совсем понял, что это за простой блок такой, в стандартных не нашел.

А вот такое решение
Sancho писал(а):
23.03.2019{, 08:15}

Найдите в коде, внизу, строки как я писал выше, и замените последние три строки на
int16_t i = readByteFromEEPROM( addres, bitAddres, chipAddres);
i = i<<8 | readByteFromEEPROM( (addres+1), bitAddres, chipAddres);
return i;
Помогло, все заработало как надо.
Спасибо за помощь.

Ответить

Вернуться в «Начинающим»