|
IAR AVR 4.10A, как обеспечить доступ к EEPROM |
|
|
|
Mar 17 2005, 16:59
|
Местный
  
Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526

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

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

|
Цитата(Sergio66 @ Mar 17 2005, 19:59) Цитата(Sergio66 @ Mar 17 2005, 18:52) Еще один вопрос - никак не могу найти ни одной библиотечной функции для доступа к EEPROM. Компилятор Embedded C++, библиотека DLIB. Подскажите, плз. И что, доступ к ней ничем не будет отличаться от доступа к обычным переменным в SRAM???????? Да для программы на С это прозрачно! просто компилер вызывает функцию записи или чтения проще всего посмотреть листинг. только вот время записи получается большое и это надо учитывать
|
|
|
|
|
Mar 18 2005, 12:20
|

Частый гость
 
Группа: Свой
Сообщений: 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;}
--------------------
- ЗАМЕНЯТЬ ДЕТАЛИ НА ХОДУ ВОСПРЕЩАЕТСЯ !!! -
|
|
|
|
|
Mar 18 2005, 15:38
|

Профессионал
    
Группа: Модераторы
Сообщений: 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 циклов!
|
|
|
|
|
Mar 18 2005, 15:59
|

Шаман
     
Группа: Модераторы
Сообщений: 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
|
|
|
|
|
Mar 18 2005, 16:16
|

Профессионал
    
Группа: Модераторы
Сообщений: 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 ? вы же и хотели их убрать
|
|
|
|
|
Mar 18 2005, 20:03
|
Знающий
   
Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32

|
Цитата(KRS @ Mar 18 2005, 19:16) Откуда взялись в листинге CLI и SEI ? вы же и хотели их убрать Меняем _CLI() на Код char sreg_temp = SREG; _CLI(); а _SEI() на Код SREG = sreg_temp
--------------------
Главная линия этого опуса ясна мне насквозь!
|
|
|
|
|
Mar 21 2005, 07:25
|

Шаман
     
Группа: Модераторы
Сообщений: 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.
|
|
|
|
|
Mar 22 2005, 07:34
|

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

|
Цитата(IgorKossak @ Mar 21 2005, 11:08) Существует бесконечно малое количество причин в применении макроса вместо обьявления переменной в области __eeprom. Могу обьяснить "свою" причину - я не считаю EEPROM памятью вообще. Считаю раз и навсегда "это" - внешним устройством. А для этого гораздо удобнее использовать макрос или функцию (безразлично - дело вкуса или наличия ресурсов). И совершенно неудобно использовать обьявление переменной. Это связано с потенциально высокой уязвимостью этой области памяти, cбои которой стали уже притчей-во-языцах. Гдето в недрах этой конференции я уж писал, как сделать, чтобы было хорошо. И совершенно очевидно, что вероятность сбоя EEPROM-a слишком высока "просто принципиально", что бы можно было использовать ее просто как память, которая "не забывает после выключения".
--------------------
- ЗАМЕНЯТЬ ДЕТАЛИ НА ХОДУ ВОСПРЕЩАЕТСЯ !!! -
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|