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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> запись большого числа в EEPROM
Integral
сообщение Aug 10 2008, 00:03
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 9-08-08
Пользователь №: 39 519



Народ, подскажыте как записать число больше 256 в 8-ми розрядную EEPROM?

Была идея разбыть число на отдельные цыфры и записать в отдельные ячейки. Считывать также само по отдельному числу и лепить в кучу.... Но я чувствую что есть более простой способ. Например использовать две соседные ячейки как старшые и младшые бити. Мне просто нужно знать с помощью каких функцый можно облегчить себе жызнь.....

использую CodeVisionAVR + mega16.

Заранее благодарю.
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 10 2008, 00:12
Сообщение #2


Гуру
******

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



Вообще-то все люди спокойно делят числа большой разрядности на меньшие (на байты) и пишут их в EEPROM побайтово. Непонятно, почему вы аналогично делать стесняетесь?
Пишете-то программу на Си или на ассемблере?
Go to the top of the page
 
+Quote Post
Integral
сообщение Aug 10 2008, 00:38
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 9-08-08
Пользователь №: 39 519



На Си.

Покажыте пожалуйста на примере как поделить число и записать побайтово....
Go to the top of the page
 
+Quote Post
vovanse
сообщение Aug 10 2008, 02:54
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 185
Регистрация: 14-02-06
Из: Кемерово
Пользователь №: 14 293



Например так:

unsigned long a;
unsigned char a1,a2,a3,a4;

a1= a & 0x000000FF;
a2=(a & 0x0000FF00)>>8;
a3=(a & 0x00FF0000)>>16;
a4=(a & 0xFF000000)>>24;

обратно собрать

a=(unsigned long)a1;
a|=(unsigned long)a2<<8;
a|=(unsigned long)a3<<16;
a|=(unsigned long)a4<<24;
Go to the top of the page
 
+Quote Post
WHALE
сообщение Aug 10 2008, 04:31
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



зачем такие сложности?!
long a=123456;
eeprom long b;
b=a;
компилятор все сделает за вас.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
Integral
сообщение Aug 10 2008, 09:13
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 9-08-08
Пользователь №: 39 519



Цитата(WHALE @ Aug 10 2008, 07:31) *
зачем такие сложности?!
long a=123456;
eeprom long b;
b=a;
компилятор все сделает за вас.


т.е. получается "eeprom long b;" означает создать переменную которая не будет терять свое значение после отключения питания?
Go to the top of the page
 
+Quote Post
Tiny
сообщение Aug 10 2008, 14:48
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 82
Регистрация: 10-07-06
Пользователь №: 18 720



Я в СodeVision использовал встроенные функции

Цитата
CLI();
//прочесть из 0-й ячейку значение А
EEPROM_READ(0x00, А);
SEI();
//Записать в 0-ю ячейку значение А
CLI();
EEPROM_WRITE(0x00, А);
while(EECR & 0x02);//Дождаться окончания записи
asm("nop");//На всякий случай
asm("nop");
SEI();

Расчитываю длину значения в байтах, исходя из этого задаю адрес для записи следующего числа
Go to the top of the page
 
+Quote Post
bezobraznic
сообщение Aug 10 2008, 16:39
Сообщение #8


Частый гость
**

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



Цитата(Integral @ Aug 10 2008, 12:13) *
т.е. получается "eeprom long b;" означает создать переменную которая не будет терять свое значение после отключения питания?



Да!
Go to the top of the page
 
+Quote Post
WHALE
сообщение Aug 10 2008, 19:12
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



Только имейте в виду,что eeprom память имеет свои особенности.Например,если вы будете в цикле или подряд несколько значений записывать в eeprom,не забудьте организовать задержку между записями или проверку бита готовности,а то нарветесь на неожиданные глюки.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
EmbedElektrik
сообщение Aug 10 2008, 20:39
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 121
Регистрация: 30-07-08
Из: Тверь, Россия
Пользователь №: 39 321



а вообще такие дела делают с помощью union. и работать будет в любом компиляторе
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 10 2008, 21:50
Сообщение #11


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(WHALE @ Aug 10 2008, 22:12) *
в eeprom,не забудьте организовать задержку между записями или проверку бита готовности,а то нарветесь на неожиданные глюки

Хм... ээээ... А разве компилятор не обязан заботиться об этом самостоятельно, если разрешает конструкции вида:
(eeprom long)b = a;

Поидее запись должна гарантироваться и так.

Цитата
а вообще такие дела делают с помощью union.

какие дела? и кто делает,
тут про записть в eeprom. как union этому поможет? ;>
Go to the top of the page
 
+Quote Post
Laptop
сообщение Aug 10 2008, 22:38
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 142
Регистрация: 19-11-05
Пользователь №: 11 103



Если работаете со встроенным в микроконтроллер EEPROM, то спокойно объявляйте переменную нужной размерности в сегменте eeprom и все остальное включая проверку флагов и т.д. за вас организует компилятор. Только надо помнить что запись выполняется определенное время и может вызвать неоднозначности в выполнении критичных к времени участках. Просто учитывайте это время при написании программ.
Go to the top of the page
 
+Quote Post
WHALE
сообщение Aug 11 2008, 04:17
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



Цитата(defunct @ Aug 11 2008, 01:50) *
Хм... ээээ... А разве компилятор не обязан заботиться об этом самостоятельно, если разрешает конструкции вида:
(eeprom long)b = a;

увы и ах-разрешает такие записи и нифига не проверяет готовность 07.gif -надо ручками


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Aug 11 2008, 07:41
Сообщение #14


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

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



А доработать что никак нельзя???
Зачем усложнять себе жизнь...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 11 2008, 12:34
Сообщение #15


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(WHALE @ Aug 11 2008, 07:17) *
увы и ах-разрешает такие записи и нифига не проверяет готовность 07.gif -надо ручками

А как он тогда пишет long переменные? (они же 4 байта и проверку перед каждым вручную не вставишь)..
асм листинг можете привести?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 02:19
Рейтинг@Mail.ru


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