реклама на сайте
подробности

 
 
> Как записать/считать float в/из EEPROM, ATmega8
LexRoss
сообщение Oct 26 2010, 14:18
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 377
Регистрация: 31-01-09
Пользователь №: 44 202



МК ATmega8, компилятор WinAvr. Нужно записать число float в eeprom. Была идея сначала домножить число на 10, потом искать остаток от деления на 100, и писать по 2 цифры с помощью eeprom_write_byte(). Что-то мне подсказывает, что можно проще rolleyes.gif Может с помощью eeprom_write_block() ? Тогда как?
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
proba
сообщение Oct 26 2010, 14:42
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 358
Регистрация: 29-05-05
Пользователь №: 5 526



напр так:

extern eeprom_write_block(unsigned char *dat, unsigned char count);

void write_float2eep(float val)
{
union{
float fnum;
unsigned char vl[sizeof (float)];
}eep;
eep.fnum = val;
eeprom_write_block(eep.vl,sizeof (float));
}
Go to the top of the page
 
+Quote Post
Палыч
сообщение Oct 26 2010, 14:48
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(proba @ Oct 26 2010, 18:42) *
напр так

А, почему сразу не так:
eeprom_write_block( (unsigned char *) &val, sizeof (float));
Go to the top of the page
 
+Quote Post
LexRoss
сообщение Oct 26 2010, 15:21
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 377
Регистрация: 31-01-09
Пользователь №: 44 202



Цитата(proba @ Oct 26 2010, 18:42) *
напр так:

Непонятно как заполняется массив vl. Объясните, пожалуйста где val делится на байты и записывается в массив.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 26 2010, 15:36
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Зачем что-то делить? Память и так зачастую имеет байтовую организацию.
Просто передаётся указатель на память (на массив из 4 байт - он же float), и телемаркет:-)

Цитата(Палыч @ Oct 26 2010, 18:48) *
А, почему сразу не так:
eeprom_write_block( (unsigned char *) &val, sizeof (float));

eeprom_update_block поинтереснейwink.gif


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
LexRoss
сообщение Oct 26 2010, 15:56
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 377
Регистрация: 31-01-09
Пользователь №: 44 202



А прочитать как?
Код
unsigned char read_var[5];
eeprom_read_block(read_var, 0x10, 5);
ерунду какую-то выводит
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Oct 26 2010, 16:20
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Вы в функции

Код
eeprom_write_block( (unsigned char *) &val, sizeof (float));


знаете по какому адресу в eeprom запишется массив байт?

Я не знаю. Вы, похоже, тоже. Тогда почему вы чего-то считываете с адреса 0x10?
Go to the top of the page
 
+Quote Post
LexRoss
сообщение Oct 26 2010, 16:23
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 377
Регистрация: 31-01-09
Пользователь №: 44 202



я писал
Код
eeprom_write_block( (unsigned char *) &val, 0x10, sizeof (float));
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Oct 26 2010, 16:39
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Ну тогда сделайте так:

Код
float f2;

eeprom_read_block((unsigned char *)&f2, 0x10, sizeof(float));
printf("f2 = %f\n", f2);
Go to the top of the page
 
+Quote Post
LexRoss
сообщение Oct 26 2010, 17:17
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 377
Регистрация: 31-01-09
Пользователь №: 44 202



Работает, спасибо.
Go to the top of the page
 
+Quote Post
drvlas
сообщение Oct 26 2010, 20:33
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 3-09-10
Пользователь №: 59 263



Когда нужно много чего разного в ЕЕПРОМ писать-читать, всегда использую предложенный здесь подход - объявления union.
Например:

#define ucha unsigned char
...
typedef union {
struct {
ucha csL, csH, N1, N2, N3, Coeff, R1[TABLES_SIZE], R2[TABLES_SIZE], R3[TABLES_SIZE];
}s;
ucha mc[SIZEOFEEPROM];
}Type_My_Data_in_EEPROM;

extern Type_My_Data_in_EEPROM u;

Теперь в программе везде обращаюсь к элементам союза так

u.s.N1
u.s.Coeff
u.s.R1[...]

и только в подпрограммах записи-чтения "вспоминаю", что это еще и массив:

for( i = 2; i < SIZEOFEEPROM; i++ )
{
u.mc[i] = EEPROM_read_byte(i);
cs2 += u.mc[i];
}

Т.е. мне пофиг, каковы данные, входящие в союз - там и байты, и флоаты, и массивы... Важно под их размерчик разместить "поверх" еще и массив ucha mc[SIZEOFEEPROM] (что и есть сутью союза)



Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 26 2010, 22:51
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(drvlas @ Oct 27 2010, 02:33) *
Т.е. мне пофиг, каковы данные, входящие в союз
А вы не интересовались оверхедом, возникающим при таком "союзном" доступе к данным?
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Oct 27 2010, 03:16
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



А откуда там оверхэд берется, не подскажете?


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Oct 27 2010, 03:52
Сообщение #14


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Я чё-та не соображу, вы переменную заводите с этим типом(Type_My_Data_in_EEPROM) и она кушает свои честные SIZEOFEEPROM байт оперативки в не зависимости от того, что возможно в конкретный момент времени программе нужны всего пара байт из EEPROM?
Думаю это и есть тот самый оверхед, о котором говорил rezident.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Oct 27 2010, 06:12
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(drvlas @ Oct 26 2010, 23:33) *
Когда нужно много чего разного в ЕЕПРОМ писать-читать, всегда использую предложенный здесь подход - объявления union.


Ну и для чего вся эта лабуда с union, когда можно просто и ясно:

Код
struct {
ucha csL, csH, N1, N2, N3, Coeff, R1[TABLES_SIZE], R2[TABLES_SIZE], R3[TABLES_SIZE];
}s

s s1, s2;

eeprom_write_block((unsigned char *) &s1, 0x0, sizeof(s));
eeprom_read_block ((unsigned char *) &s2, 0x0, sizeof(s));
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 13:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01501 секунд с 7
ELECTRONIX ©2004-2016