|
Как записать/считать float в/из EEPROM, ATmega8 |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 25)
|
Oct 26 2010, 15:56
|

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

|
А прочитать как? Код unsigned char read_var[5]; eeprom_read_block(read_var, 0x10, 5); ерунду какую-то выводит
|
|
|
|
|
Oct 26 2010, 16:20
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Вы в функции Код eeprom_write_block( (unsigned char *) &val, sizeof (float)); знаете по какому адресу в eeprom запишется массив байт? Я не знаю. Вы, похоже, тоже. Тогда почему вы чего-то считываете с адреса 0x10?
|
|
|
|
|
Oct 26 2010, 16:23
|

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

|
я писал Код eeprom_write_block( (unsigned char *) &val, 0x10, sizeof (float));
|
|
|
|
|
Oct 26 2010, 20:33
|
Участник

Группа: Участник
Сообщений: 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] (что и есть сутью союза)
|
|
|
|
|
Oct 27 2010, 06:12
|
Профессионал
    
Группа: Свой
Сообщений: 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));
|
|
|
|
|
Oct 27 2010, 08:08
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(sergeeff @ Oct 27 2010, 09:12)  А для чего явное задание адреса цифрами, да еще и без приведения к указателю? Код s s1, s2; s EEMEM s1_ee, s2_ee; eeprom_write_block(&s1, &s1_ee, sizeof(s1)); eeprom_read_block(&s2, &s2_ee, sizeof(s2));
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 27 2010, 08:53
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Я просто хотел показать, как писать/читать структуру в/из eeprom. Ясно, что указатель "куда" в eeprom надо как-то по-приличнее определить, но и Код s EEMEM s1_ee, s2_ee; что-то напутанное собой представляет.
|
|
|
|
|
Oct 27 2010, 09:03
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(sergeeff @ Oct 27 2010, 11:53)  но и Код s EEMEM s1_ee, s2_ee; что-то напутанное собой представляет. Это с непривычки. ведь Код s const s1_const, s2_const; читается вполне ясно.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 27 2010, 17:24
|
Участник

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

|
Цитата(sergeeff @ Oct 27 2010, 17:01)  Нет там никакого оверхеда Конечно нет. И про ОЗУ тут напрасно беспокоятся. Совершенно нормально, что я переношу из ЕЕПРОМ в ОЗУ все оперативные данные, работаю с ними - а при необходимости прячу снова в ЕЕПРОМ. Вытаскивать 1 байт из ЕЕПРОМ во время обработки данны - это чуднО  Цитата(sergeeff @ Oct 27 2010, 17:01)  Беда в том, что это непереносимая конструкция. Почему? Куда непереносимая? Или просто Вы ее не переносите  Цитата(sergeeff @ Oct 27 2010, 17:01)  Вопрос в том, на кой это надо, если безо всяких union работает. Ну, я это использую потому, что при чтении из ЕЕПРОМ и записи туда подсчитываю контрольную сумму. И мне удобно обращаться поэлементно к массиву. Если и при Вашем подходе можно подсчитывать побайтно сумму - то признаю с готовностью, что много лет у меня болталась напрасно усложненная конструкция  Спасибо за подсказку!
|
|
|
|
|
Oct 27 2010, 20:38
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(drvlas @ Oct 27 2010, 20:24)  Почему? Куда непереносимая? Или просто Вы ее не переносите  Например, тут : http://www.cplusplus.com/doc/tutorial/other_data_types/написано: "The exact alignment and order of the members of a union in memory is platform dependant." Или здесь: http://www.drdobbs.com/184403890Цитата Ну, я это использую потому, что при чтении из ЕЕПРОМ и записи туда подсчитываю контрольную сумму. И мне удобно обращаться поэлементно к массиву. Если и при Вашем подходе можно подсчитывать побайтно сумму - то признаю с готовностью, что много лет у меня болталась напрасно усложненная конструкция  Спасибо за подсказку! Вас же, наверное, интересует crc всей структуры? Кто тогда мешает сделать: Код s s1; uint crc_val = crc(&s1, sizeof(s1));
|
|
|
|
|
Oct 27 2010, 21:43
|

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

|
Цитата И про ОЗУ тут напрасно беспокоятся. Совершенно нормально, что я переношу из ЕЕПРОМ в ОЗУ все оперативные данные, работаю с ними Ну я немного погодя додумал, что погорячился. Кстати говоря, никто не мешает натравить на начало структуры поинтер char *ptr и прогнать его по всем байтам. Зачем там массив явно объявлять? Более того, к этому поинтеру можно скобочки нарисовать ptr[] и синтаксически будет выглядеть как массив  Правда, засада может быть если там в структуре для выравнивания дырки имеются. Но, как уже говорилось, нас то интересует crc всей структуры и ничего не мешает посчитать его в месте с теми дырками и с ними же и хранить в EEPROM. Ну а вообще структуру сделать packed чтоб без дырок была.... В общем я тоже не вижу смысла в юнионе. Одни минусы от его использования получаются.
--------------------
The truth is out there...
|
|
|
|
|
Oct 28 2010, 12:05
|
Участник

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

|
Убедили меня  По второму пункту. Ибо, что касается приведенных ссылок Цитата(sergeeff @ Oct 27 2010, 23:38)  Например, тут... написано: "The exact alignment and order of the members of a union in memory is platform dependant." ...то здесь я же говорил: использую массив только при записи-чтении всей структуры в ЕЕПРОМ. И мне в это время до лампочки, какое там выравнивание и размещение. Согласны? Цитата(sergeeff @ Oct 27 2010, 23:38)  Вас же, наверное, интересует crc всей структуры? Кто тогда мешает сделать: Код s s1; uint crc_val = crc(&s1, sizeof(s1)); Ну, так кто ж знал Спасибо, буду знать. Если crc() есть во всех компиляторах, то даже переносимость не ухудшится. Но все же не могу не отметить, что в моем случае (с учетом вышеобозначенного способа использования союза) удобство предложенного уважаемым товарищем ergeeff способа - только в обращении к элементам структуры без лишнего .u
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|