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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> IAR AVR 4.10A, как обеспечить доступ к EEPROM
Sergio66
сообщение Mar 17 2005, 15:52
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526



Еще один вопрос - никак не могу найти ни одной библиотечной функции для доступа к EEPROM. Компилятор Embedded C++, библиотека DLIB. Подскажите, плз.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Mar 17 2005, 16:53
Сообщение #2


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Не нужно никакой функции. Просто обьявите переменную в области EEPROM:
Код
__eeprom int MyIntEEPROMVar;
Go to the top of the page
 
+Quote Post
Sergio66
сообщение Mar 17 2005, 16:59
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526



Цитата(Sergio66 @ Mar 17 2005, 18:52)
Еще один вопрос - никак не могу найти ни одной библиотечной функции для доступа к EEPROM. Компилятор Embedded C++, библиотека DLIB.  Подскажите, плз.
*

И что, доступ к ней ничем не будет отличаться от доступа к обычным переменным в SRAM????????
Go to the top of the page
 
+Quote Post
KRS
сообщение Mar 17 2005, 17:01
Сообщение #4


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(Sergio66 @ Mar 17 2005, 19:59)
Цитата(Sergio66 @ Mar 17 2005, 18:52)
Еще один вопрос - никак не могу найти ни одной библиотечной функции для доступа к EEPROM. Компилятор Embedded C++, библиотека DLIB.  Подскажите, плз.
*

И что, доступ к ней ничем не будет отличаться от доступа к обычным переменным в SRAM????????
*



Да для программы на С это прозрачно! просто компилер вызывает функцию записи или чтения проще всего посмотреть листинг. только вот время записи получается большое и это надо учитывать
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Mar 18 2005, 09:22
Сообщение #5


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



!!!
Не следует также забывать, что количество записей в EEPROM не бесконечно.
В этом случае функция больше мобилизировала бы, но зато не так элегантно выглядело бы.
И ещё, в EEPROM нельзя объявлять объекты, имеющие конструктор и деструктор (из C++).
Go to the top of the page
 
+Quote Post
-Tумблер-
сообщение Mar 18 2005, 12:20
Сообщение #6


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

Группа: Свой
Сообщений: 146
Регистрация: 4-11-04
Из: Московская область
Пользователь №: 1 040



Цитата(Sergio66 @ Mar 17 2005, 18:52)
Еще один вопрос - никак не могу найти ни одной библиотечной функции для доступа к EEPROM. Компилятор Embedded C++, библиотека DLIB.  Подскажите, плз.
*


Возьмем да и напишем :

#define EEMWE_BIT (1<<2)
#define EEWE_BIT (1<<1)
#define EERE_BIT (1<<0)

#define _EEPUT_(ADR,VAL) {while (EECR & EEWE_BIT); \
EEAR = (ADR); EEDR = (VAL); _CLI();EECR = EEMWE_BIT; EECR = EEWE_BIT;_SEI();}

#define _EEGET_(VAR, ADR) {while (EECR & EEWE_BIT); \
EEAR = (ADR); EECR = EERE_BIT; while (EECR & EERE_BIT);(VAR) = EEDR;}




smile.gif


--------------------

- ЗАМЕНЯТЬ ДЕТАЛИ НА ХОДУ ВОСПРЕЩАЕТСЯ !!! -
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Mar 18 2005, 15:30
Сообщение #7


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(-Tумблер- @ Mar 18 2005, 15:20)
#define _EEPUT_(ADR,VAL)  {while (EECR & EEWE_BIT); \
EEAR = (ADR); EEDR = (VAL); _CLI();EECR = EEMWE_BIT; EECR = EEWE_BIT;_SEI();}
*

Комбинация _CLI()/_SEI() плоха, т. к. прерывания до этого могут быть запрещены.
EECR |= EEMWE_BIT; EECR |= EEWE_BIT; // скомпилируется намного оптимальнее
Go to the top of the page
 
+Quote Post
KRS
сообщение Mar 18 2005, 15:38
Сообщение #8


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(IgorKossak @ Mar 18 2005, 18:30)
Цитата(-Tумблер- @ Mar 18 2005, 15:20)
#define _EEPUT_(ADR,VAL)  {while (EECR & EEWE_BIT); \
EEAR = (ADR); EEDR = (VAL); _CLI();EECR = EEMWE_BIT; EECR = EEWE_BIT;_SEI();}
*

Комбинация _CLI()/_SEI() плоха, т. к. прерывания до этого могут быть запрещены.
EECR |= EEMWE_BIT; EECR |= EEWE_BIT; // скомпилируется намного оптимальнее
*



Это не поможет! потому что между этими командами не должно быть больше 4 циклов!
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Mar 18 2005, 15:59
Сообщение #9


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(KRS @ Mar 18 2005, 18:38)
Это не поможет! потому что между этими командами не должно быть больше 4 циклов!
*

И не будет.
Вот что получается:
Код
   146              _EEPUT_(0x2456,0x56);
  \   00000000   99E1                       SBIC    0x1C,0x01
  \   00000002   CFFE                       RJMP    ??init_1
  \   00000004   E506                       LDI     R16,86
  \   00000006   E214                       LDI     R17,36
  \   00000008   BB1F                       OUT     0x1F,R17
  \   0000000A   BB0E                       OUT     0x1E,R16
  \   0000000C   BB0D                       OUT     0x1D,R16
  \   0000000E   94F8                       CLI
  \   00000010   9AE2                       SBI     0x1C,0x02
  \   00000012   9AE1                       SBI     0x1C,0x01
  \   00000014   9478                       SEI
Go to the top of the page
 
+Quote Post
KRS
сообщение Mar 18 2005, 16:16
Сообщение #10


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(IgorKossak @ Mar 18 2005, 18:59)
Цитата(KRS @ Mar 18 2005, 18:38)
Это не поможет! потому что между этими командами не должно быть больше 4 циклов!
*

И не будет.
Вот что получается:
Код
   146              _EEPUT_(0x2456,0x56);
  \   00000000   99E1                       SBIC    0x1C,0x01
  \   00000002   CFFE                       RJMP    ??init_1
  \   00000004   E506                       LDI     R16,86
  \   00000006   E214                       LDI     R17,36
  \   00000008   BB1F                       OUT     0x1F,R17
  \   0000000A   BB0E                       OUT     0x1E,R16
  \   0000000C   BB0D                       OUT     0x1D,R16
  \   0000000E   94F8                       CLI
  \   00000010   9AE2                       SBI     0x1C,0x02
  \   00000012   9AE1                       SBI     0x1C,0x01
  \   00000014   9478                       SEI

*



Откуда взялись в листинге CLI и SEI ?
вы же и хотели их убрать
Go to the top of the page
 
+Quote Post
vet
сообщение Mar 18 2005, 20:03
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Цитата(KRS @ Mar 18 2005, 19:16)
Откуда взялись в листинге CLI и SEI ?
вы же и хотели их убрать
*


Меняем _CLI() на
Код
char sreg_temp = SREG; _CLI();

а _SEI() на
Код
SREG = sreg_temp


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Mar 21 2005, 07:25
Сообщение #12


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(KRS @ Mar 18 2005, 19:16)
...Откуда взялись в листинге CLI и SEI ?
вы же и хотели их убрать
*

Листингом я хотел обратить внимание на преимущества EECR |= EEMWE_BIT; EECR |= EEWE_BIT; против EECR = EEMWE_BIT; EECR = EEWE_BIT; в Вашем примере.
А что касается прерываний, то у меня в рабочих проектах сделано как у vet.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Mar 21 2005, 08:08
Сообщение #13


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Существует бесконечно малое количество причин в применении макроса вместо обьявления переменной в области __eeprom.
Накладные расходы на вызов функции при этом ничтожно малы по сравнению с длительностью записи, использование стека - 1 слово.
Зато компактность программы намного возрастает и, что очень важно, повышается наглядность и безопасность использования типизированных обьектов (ошибки, если они есть, вылазят ещё на этапе компиляции).
Go to the top of the page
 
+Quote Post
-Tумблер-
сообщение Mar 22 2005, 07:34
Сообщение #14


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

Группа: Свой
Сообщений: 146
Регистрация: 4-11-04
Из: Московская область
Пользователь №: 1 040



Цитата(IgorKossak @ Mar 21 2005, 11:08)
Существует бесконечно малое количество причин в применении макроса вместо обьявления переменной в области __eeprom.


Могу обьяснить "свою" причину - я не считаю EEPROM памятью вообще.
Считаю раз и навсегда "это" - внешним устройством.
А для этого гораздо удобнее использовать макрос или функцию
(безразлично - дело вкуса или наличия ресурсов). И совершенно
неудобно использовать обьявление переменной.
Это связано с потенциально высокой уязвимостью этой области
памяти, cбои которой стали уже притчей-во-языцах. Гдето в недрах
этой конференции я уж писал, как сделать, чтобы было хорошо.
И совершенно очевидно, что вероятность сбоя EEPROM-a
слишком высока "просто принципиально", что бы можно было
использовать ее просто как память, которая "не забывает после
выключения".
smile.gif


--------------------

- ЗАМЕНЯТЬ ДЕТАЛИ НА ХОДУ ВОСПРЕЩАЕТСЯ !!! -
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Mar 23 2005, 09:27
Сообщение #15


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Интересное мнение, хотя и не бесспорное.
Из под моего начала вышло более 50000 устройств (с AVR) за последние 5 - 6 лет и ничто не дало мне повод усомниться в EEPROM как именно в памяти. Просто в нашем отделе принято читать и Datasheets и Erratasheets и различные hints и recomendations как программистские, так и конструкторские. И когда мне говорят о проблемах, которые даже "притча во языцех", то я совершенно честно не знаю чем помочь.
Появление квалификатора __eeprom привнесло много удобств и совершенно не добавило проблем, т. к. сейчас библиотечные функции решают то, что раньше решалось вручную.
Тем не менее. Хотелось бы услышать мнения и других пользователей.
Go to the top of the page
 
+Quote Post

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

 


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


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