Страница 1 из 1
Запись в EEPROM отрицательных значений
Добавлено: 22 мар 2019, 20:48
hsl
Доброго времени суток.
Такая ситуация, использую штатные блоки чтения и записи EEPROM и переменную, у всех установлен тип данных integer.
Из переменной по сигналу значение записывается в EEPROM, затем при старте программы значение из EEPROM читается в переменную.
Если в переменной используются положительные значения все работает правильно. Но если из переменной в EEPROM передается отрицательное значение то в EEPROM оказывается совсем другое значение, например если в переменной -1 то в EEPROM записывается 65535.
Я не совсем понимаю как это вообще возможно, ведь у EEPROM установлен тип данных integer и такое число туда не должно влезать.
Вот этот кусок, здесь на EEPROM уже просто константой подаю -11 и после сигнала записи на выходе этой EEPROM через конвертацию числа в строку получаю 65525
3.jpg
Как такое возможно или, что я делаю не так?
Запись в EEPROM отрицательных значений
Добавлено: 22 мар 2019, 21:29
Sancho
Тип данных - просто сделайте, после чтения, присвойте переменной с типом инт, и её на дисплей.
Отправлено спустя 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);
Запись в EEPROM отрицательных значений
Добавлено: 22 мар 2019, 22:57
hsl
Я правильно понял
5.jpg
была у меня такая мысль, но результат тот же.
Там ведь и так везде тип данных integer.
Искал решение проблемы в интернете и наткнулся вот на такую формулировку
"одни и теже 16 бит памяти если смотреть на них как на int это -11, а если смотреть на них же как на unsigned int то это 65525"
Вроде как вот оно, но только не понятно как это применить то, ведь как я уже писал у всех элементов установлен один и тот же тип данных, это integer
Запись в EEPROM отрицательных значений
Добавлено: 22 мар 2019, 23:12
Fuji1604
Утверждение верное, так и есть. Не в тему, но как показала практика, помимо знакового и беззнакового int, бывает еще и int 16 bit и int 32 bit
Запись в EEPROM отрицательных значений
Добавлено: 22 мар 2019, 23:44
Ingwar
Проверил с записью через переменную, но не в железе.
[spoiler]
2.png
[/spoiler]
[spoiler]
3.png
[/spoiler]
Запись в EEPROM отрицательных значений
Добавлено: 22 мар 2019, 23:54
hsl
Да, в протеусе порой все работает идеально.
Не знаю имеет ли это значение в данном случае, в качестве железа у меня ESP8266-01
Запись в EEPROM отрицательных значений
Добавлено: 23 мар 2019, 08:15
Sancho
[ref]hsl[/ref], Найдите в коде, внизу, строки как я писал выше, и замените последние три строки на
int16_t i = readByteFromEEPROM( addres, bitAddres, chipAddres);
i = i<<8 | readByteFromEEPROM( (addres+1), bitAddres, chipAddres);
return i;
Отправлено спустя 2 минуты 10 секунд:
hsl писал(а): 22 мар 2019, 23:54
в качестве железа у меня ESP8266-01
80 MHz 32-bit процессор

Запись в EEPROM отрицательных значений
Добавлено: 23 мар 2019, 08:22
RedSky
Помню сталкивался с таким. Попробуйте ваши 65 тысяч привести к типу int. Создайте простой блок out = int(in), должно помочь.
Запись в EEPROM отрицательных значений
Добавлено: 23 мар 2019, 08:33
Sancho
[ref]RedSky[/ref], 8266 интерпретирует данные как 32 бита, поэтому так не поможет. наверно.
Запись в EEPROM отрицательных значений
Добавлено: 23 мар 2019, 08:52
RedSky
Ну попробовать можно, может с тогда с long прокатит.
Запись в EEPROM отрицательных значений
Добавлено: 23 мар 2019, 11:15
pan
hsl писал(а): 22 мар 2019, 23:54
знаю имеет ли это значение в данном случае, в качестве железа у меня ESP8266
тогда в данном случае у вас инт это + - 2147483647
Запись в EEPROM отрицательных значений
Добавлено: 23 мар 2019, 17:45
hsl
RedSky писал(а): 23 мар 2019, 08:22
Помню сталкивался с таким. Попробуйте ваши 65 тысяч привести к типу int. Создайте простой блок out = int(in), должно помочь.
Я только пробую работать с FLProg и не совсем понял, что это за простой блок такой, в стандартных не нашел.
А вот такое решение
Sancho писал(а): 23 мар 2019, 08:15
Найдите в коде, внизу, строки как я писал выше, и замените последние три строки на
int16_t i = readByteFromEEPROM( addres, bitAddres, chipAddres);
i = i<<8 | readByteFromEEPROM( (addres+1), bitAddres, chipAddres);
return i;
Помогло, все заработало как надо.
Спасибо за помощь.