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

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

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

Сообщение hsl »

Доброго времени суток.
Такая ситуация, использую штатные блоки чтения и записи EEPROM и переменную, у всех установлен тип данных integer.
Из переменной по сигналу значение записывается в EEPROM, затем при старте программы значение из EEPROM читается в переменную.
Если в переменной используются положительные значения все работает правильно. Но если из переменной в EEPROM передается отрицательное значение то в EEPROM оказывается совсем другое значение, например если в переменной -1 то в EEPROM записывается 65535.
Я не совсем понимаю как это вообще возможно, ведь у EEPROM установлен тип данных integer и такое число туда не должно влезать.
Вот этот кусок, здесь на EEPROM уже просто константой подаю -11 и после сигнала записи на выходе этой EEPROM через конвертацию числа в строку получаю 65525
3.jpg
Как такое возможно или, что я делаю не так?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

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

Сообщение 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);
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
hsl
Рядовой
Сообщения: 6
Зарегистрирован: 22 мар 2019, 19:16
Имя: Sergej

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

Сообщение hsl »

Я правильно понял
5.jpg
была у меня такая мысль, но результат тот же.
Там ведь и так везде тип данных integer.
Искал решение проблемы в интернете и наткнулся вот на такую формулировку
"одни и теже 16 бит памяти если смотреть на них как на int это -11, а если смотреть на них же как на unsigned int то это 65525"
Вроде как вот оно, но только не понятно как это применить то, ведь как я уже писал у всех элементов установлен один и тот же тип данных, это integer
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Fuji1604
Сержант
Сообщения: 282
Зарегистрирован: 19 янв 2016, 06:09
Откуда: Березники
Имя: Сергей

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

Сообщение Fuji1604 »

Утверждение верное, так и есть. Не в тему, но как показала практика, помимо знакового и беззнакового int, бывает еще и int 16 bit и int 32 bit
когда мастерю обычно подсматриваю,
не рыли ли окоп в том же направлении,
не изобретали ли велосипед с такими-же квадратными как у меня колёсами,
а уже потом - не торопясь, торю свою лыжню
Ingwar
Полковник
Сообщения: 1928
Зарегистрирован: 28 окт 2015, 22:47
Откуда: Ленобласть
Имя: Игорь
Поблагодарили: 2 раза

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

Сообщение Ingwar »

Проверил с записью через переменную, но не в железе.
[spoiler]
2.png
[/spoiler]

[spoiler]
3.png
[/spoiler]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.
hsl
Рядовой
Сообщения: 6
Зарегистрирован: 22 мар 2019, 19:16
Имя: Sergej

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

Сообщение hsl »

Да, в протеусе порой все работает идеально.
Не знаю имеет ли это значение в данном случае, в качестве железа у меня ESP8266-01
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

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

Сообщение 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 процессор :)
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Аватара пользователя
RedSky
Лейтенант
Сообщения: 576
Зарегистрирован: 19 дек 2016, 20:07
Откуда: Днепропетровск
Имя: Алексей
Поблагодарили: 1 раз

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

Сообщение RedSky »

Помню сталкивался с таким. Попробуйте ваши 65 тысяч привести к типу int. Создайте простой блок out = int(in), должно помочь.
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

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

Сообщение Sancho »

[ref]RedSky[/ref], 8266 интерпретирует данные как 32 бита, поэтому так не поможет. наверно.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Аватара пользователя
RedSky
Лейтенант
Сообщения: 576
Зарегистрирован: 19 дек 2016, 20:07
Откуда: Днепропетровск
Имя: Алексей
Поблагодарили: 1 раз

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

Сообщение RedSky »

Ну попробовать можно, может с тогда с long прокатит.
pan
Полковник
Сообщения: 2860
Зарегистрирован: 13 апр 2017, 11:57
Имя: noname

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

Сообщение pan »

hsl писал(а): 22 мар 2019, 23:54 знаю имеет ли это значение в данном случае, в качестве железа у меня ESP8266
тогда в данном случае у вас инт это + - 2147483647
hsl
Рядовой
Сообщения: 6
Зарегистрирован: 22 мар 2019, 19:16
Имя: Sergej

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

Сообщение 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;
Помогло, все заработало как надо.
Спасибо за помощь.
Ответить

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

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей