Запись числа Float в eeprom через массив
- Войдите на сайт для отправки комментариев
Сб, 07/12/2019 - 04:26
#include <Wire.h> #include <Eeprom24C01_02.h> #define EEPROM_ADDRESS 0x50 static Eeprom24C01_02 eeprom(EEPROM_ADDRESS); byte REG_Massive[2]; int tmp= -32334; // любое число byte REG_MassiveR[2]; int t; int a0=10; int a1=20; void setup() { // Initialize serial communication. Serial.begin(9600); // Initialize EEPROM library. eeprom.initialize(); } void loop() { REG_Massive[0] = tmp>>8; // разбиваю число на байты и записываю в массив REG_Massive[1] = tmp; Serial.print("REG_Massive[0]======="); Serial.println(REG_Massive[0]); Serial.print("REG_Massive[1]======="); Serial.println(REG_Massive[1]); // Write a byte at address 0 in EEPROM memory. Serial.println("Write byte to EEPROM memory..."); eeprom.writeByte(a0, REG_Massive[0]); //запись 1-го байта delay(50); eeprom.writeByte(a1,REG_Massive[1]); //запись 2-го байта // Write cycle time (tWR). See EEPROM memory datasheet for more details. delay(10); // Read a byte at address 0 in EEPROM memory. Serial.println("Read byte from EEPROM memory..."); REG_MassiveR[0]= eeprom.readByte(a0); // считываю байты и записываю в массив REG_MassiveR[1]= eeprom.readByte(a1); t = REG_MassiveR[0]<<8; t += REG_MassiveR[1]; // преобразую байты из массива в число. // Print read byte. Serial.print("REG_MassiveR[0]======="); Serial.println(REG_MassiveR[0]); Serial.print("REG_MassiveR[1]======="); Serial.println(REG_MassiveR[1]); Serial.println(t); delay(4000); }
Доброго времени суток помогите пожалуйста разбить число типа Float на байты и потом считать их. Возможно ли это сделать на подобии этого примера с Числом int пример рабочий. Но вот с float уже не выходит. Пытался разбить на 4 байта и записать в массив.
REG_Massive[0] = tmp>>24; REG_Massive[1] = tmp>>16; REG_Massive[2] = tmp>>8; REG_Massive[3] = tmp;
Но что то не выходит уже при объявлении tmp во float вместо int выдает ошибку.
Определите указатель на массив байт. А потом присвойте ему адрес float
нахрена такие сложности?
float pi = 3.1415926;
EEPROM.put(Адрес, pi);
float pi2;
EEPROM.get(Адрес, pi2);
Serial.print(pi2);
ну или через массив
чтение оналогична.
нахрена такие сложности?
float pi = 3.1415926;
EEPROM.put(Адрес, pi);
float pi2;
EEPROM.get(Адрес, pi2);
Serial.print(pi2);
Это внешний EEPROM. И в библиотеке Eeprom24C01_02 нету методов put и get
Тогда зачем эта помойнаябиблиотеке нужна
Это внешний EEPROM. И в библиотеке Eeprom24C01_02 нету методов put и get
Да, я невнимательная пьянь. :(
Это внешний EEPROM. И в библиотеке Eeprom24C01_02 нету методов put и get
Добавить методы и сделать также.
ну или через массив
Ну, это тоже лишние сложности. Всё делается также, как и раньше
ну или через массив
Ну, это тоже лишние сложности. Всё делается также, как и раньше
А put рази не запишет в ROM, в этом случае, не сам massiv, а адрес его начала в ОЗУ?
ему же float * передается, без длины. Или я тупой навовсе?
ну или через массив
Ну, это тоже лишние сложности. Всё делается также, как и раньше
3.62 - из другого массива.
Еще небольшой комментарий. Логичнее начинать использование EEPRAM так
Но кривые библиотеки на это не рассчитаны .
ему же float * передается, без длины.
Ему передаётся
float
massiv []
, у которого вполне правильный sizeof. Точняк, спроси у Рабиновича :-)Давай таки проверим. Вот оригинальная put из библиотеки EEPROM
давай напишем точно такую же, но не будем ничего никуда пхать, а просто параметры напечатаем:
Как видишь, и адрес начала, и sizeof - всё на месте. Так с чего ему не работать?
Как видишь, и адрес начала, и sizeof - всё на месте. Так с чего ему не работать?
Нихрена не понимаю. :( Нада, какабычно, напицца.
Нихрена не понимаю. :( Нада, какабычно, напицца.
Из темплейта компилятором будет создана функция для обработки float[3] (а не float*) , таким образом - внутри неё уже будет известен размер структуры данных.
понятно. А для float[5] создасца совсем другой шаблон?
Из этого же шаблона создастся вторая функция, но для float[5]. И третья для float[9]... Поэтому, честно говоря, бездумное применение функции put() мне представляется разбазариванием ресурсов МК.
Из этого же шаблона создастся вторая функция, но для float[5]. И третья для float[9]... Поэтому, честно говоря, бездумное применение функции put() мне представляется разбазариванием ресурсов МК.
А что более простого примера для еепром, который бы не тащил за собой и меню, и кнопку, и lcd нету?
А что выдернуть Вы не сможете. Там же все прозрачно.
У шаблона похожее будет
Выдернул, посмотрел. К сожалению, даже на даже на беглый взгляд, количество ошибок зашкаливает. Я даже не говорю про идейные странности - только про простые программные ляпы. Но, как Вы неоднократно писали мне и другим в той теме, баг-репорты Вас не интересуют, и учить Вас не надо. Это в силе? Или Вы передумали, и Вам интересен баг-репорт?
Зачем. Что бы править надо понимать зачем и почему. Как вы можете править мои баги, если я смутно понимаю как и почему.
Но похоже и автор EEPROM тоже в этом плавал. Иначе того шаблона не существовало. Он лишний.
Ну, как хотите. Если Вам нравится публиковать коды с большим количеством ошибок, и не нравится узнавать об этих ошибках, не могу Вам запретить этого :)
Мне не хочется исправлять не только свои ошибки, но и чужие. Так что обойдусь.
Ну, и ладненько.
Еще небольшой комментарий. Логичнее начинать использование EEPRAM так
Но кривые библиотеки на это не рассчитаны .
Пух, ты чё курил?
Спасибо вам всем большое, но я еле еле разобрался с это библиотекой так как самая простая для меня, то что вы написали думаю конечно правильно, но я не фига не вдупляю))) и коньяк и водка мне не помогут).
В моем примере запись и чтение работают хорошо косяк идет при получении числа из массива. Хотя может и при разбивке уже фигня идет.
Если не сложно тыкните носом в коде где косяк.
монитор выдает
Век живи - век учись, дураком помрешь. А я, дурак, вписывал (температура*10-константа) в байт.
Но все равно - Учится, учится и еще раз учится!
к сожалению не понимаю как, но работает ток 8 строчка readBytes )) Спасибо большое.
Я так понял, ответа на #28 не будет? Ну, да, и хрен с ним. Только, я тебя прошу, будь другом, не превращайся в Великого. Вот этого не надо:
кривые библиотеки на это не рассчитаны .
Кривизна wiring, это его тема, а не твоя.
Век живи - век учись, дураком помрешь. А я, дурак, вписывал (температура*10-константа) в байт.
Но все равно - Учится, учится и еще раз учится!
к сожалению не понимаю как, но работает ток 8 строчка readBytes )) Спасибо большое.
Да, копипастнул я лихо.
Работает так:
1) Функции writeBytes()/readBytes() требуют адрес байтового массива и его размер;
2) Байтовый массив есть последовательность ячеек, а имя его - алиас адреса нулевой (начальной ячейки), т.е. указатель на него;
3) Тип данных long (а так же float) есть байтовый массив, при вычислениях интерпретируемый особый образом;
4) sizeof() возвращает размер заданной переменной в байтах;
Итого: берём адрес (через операцию &) переменной типа long (фактически - байтового массива), затем обманываем функцию (через byte*), заставляя рассматривать данный адрес как указатель на байтовый массив. Таким образом, функция получает адрес начала байтового массива и его размер, а с ними она уже умеет работать. Внутри себя функция бежит по этому массиву и пишет (или читает) его последовательно.
asam дал наводку на это в #1.
В первых версиях библиотеки EEPROM.h методов put()/get() не было использовал такие функции.
Для float все точно так же, только тип данных другой
Kakmyc,
если уж делать без шаблонов, то лучше всё-таки везде писать не 4, а sizeof(long).
Тогда уж sizeof(num).
Может сразу типа этого:
Может сразу типа этого:
Тогда уж сразу шаблон
Можно и шаблон, но с этим, как я вижу, пока проблемы когнитивного характера наблюдаются.