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

 
 
> EEPROM, Оптимальная запись/чтение EEPROM
Дим
сообщение Mar 2 2006, 18:07
Сообщение #1





Группа: Новичок
Сообщений: 12
Регистрация: 20-10-05
Пользователь №: 9 894



Товарищи, help.gif! Такая проблемка: при записи в EEPROM на ATMEGE 8515 записывается только первый байт, остальные остаются прежними. Код функции...
.....
void RTEEPROMwrite(int location, unsigned char databyte)
{
unsigned char savedSREG;
EEAR = location; // set address
EEDR = databyte; // set data
savedSREG = SREG; // keep setting so it can be restored
while(EECR & (1<<EEWE));
CLI(); // disable interrupts
EECR |= BIT(EEMWE);// set "write enable" bit
EECR |= BIT(EEWE); // set "write" bit
SREG = savedSREG; // restore SREG
}
В чем может быть проблема?
И еще вопросик...
Bit EERIE: EEPROM Ready Interrupt Enable - бит отвечающий за прерывание, как им пользоваться и как сделать чтение/запись EEPROM по прерыванию? А то эти пустые циклы как-то не хорошо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Дим
сообщение Mar 2 2006, 18:42
Сообщение #2





Группа: Новичок
Сообщений: 12
Регистрация: 20-10-05
Пользователь №: 9 894



Я правильно понял у вас сначала записываются адрес, данные потом EEMWE = 1 и EEWE=1. Дальше ждем пока EEWE не станет равным 0. Далее очищаем EEMWE и т.д.
А может кто знает как можно обойтись без пустого цикла ожидания EEWE? Например сделать на прерывании?

Интересно то, что мой кусок программу записи в еепром в симуляторе AVR Studio 4 работает нормально, а вот на реальном железе нет! cranky.gif

Сообщение отредактировал Дим - Mar 2 2006, 18:49
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 2 2006, 19:45
Сообщение #3


кекс
******

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



Цитата(Дим @ Mar 2 2006, 20:42) *
Я правильно понял у вас сначала записываются адрес, данные потом EEMWE = 1 и EEWE=1. Дальше ждем пока EEWE не станет равным 0. Далее очищаем EEMWE и т.д.
А может кто знает как можно обойтись без пустого цикла ожидания EEWE? Например сделать на прерывании?

Правильно поняли, только вначале идет CLI.
Можно сделать и по прерыванию, только тогда очередь надо будет организовывать.
Вас что смущает ожидание в пару мкс для завершения записи?

Цитата(prottoss @ Mar 2 2006, 20:49) *
Даташиты совсем не читаете, товарисч :-)

Похоже что он читал, только код в даташите во первых с ошибкой, а во вторых несколько своеобразен и не пригоден для корректной работы в обработчике прерывания и вне обработчика прерывания.

Сообщение отредактировал defunct - Mar 2 2006, 19:48
Go to the top of the page
 
+Quote Post
prottoss
сообщение Mar 2 2006, 20:01
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(defunct @ Mar 3 2006, 02:45) *
Похоже что он читал, только код в даташите во первых с ошибкой, а во вторых несколько своеобразен и не пригоден для корректной работы в обработчике прерывания и вне обработчика прерывания.


"Это что же, во все даташитах от АТМЕЛА на АВРки? Объяните, где ошибка в коде?


--------------------
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 2 2006, 20:17
Сообщение #5


кекс
******

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



Цитата(prottoss @ Mar 2 2006, 22:01) *
"Это что же, во все даташитах от АТМЕЛА на АВРки? Объяните, где ошибка в коде?

Да практически во всех... Ошибка в том, что в приведенных функциях не запрещаются прерывания.
Из даташита алгоритм записи EEPROM:

Цитата
1. Wait until EEWE becomes zero.
2. Wait until SPMEN in SPMCR becomes zero.
3. Write new EEPROM address to EEAR (optional).
4. Write new EEPROM data to EEDR (optional).
5. Write a logical one to the EEMWE bit while writing a zero to EEWE in EECR.
6. Within four clock cycles after setting EEMWE, write a logical one to EEWE.

Caution: An interrupt between step 5 and step 6 will make the write cycle fail, since the
EEPROM Master Write Enable will time-out. If an interrupt routine accessing the
EEPROM is interrupting another EEPROM Access, the EEAR or EEDR reGister will be
modified, causing the interrupted EEPROM Access to fail. It is recommended to have the Global Interrupt Flag cleared during all the steps to avoid these problems.


И тем не менее далее в своих примерах игнорируются собственные рекомендации, что приводит к неправильной работе описанных функций.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Mar 2 2006, 20:35
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(defunct @ Mar 3 2006, 03:17) *
Цитата(prottoss @ Mar 2 2006, 22:01) *

"Это что же, во все даташитах от АТМЕЛА на АВРки? Объяните, где ошибка в коде?

Да практически во всех... Ошибка в том, что в приведенных функциях не запрещаются прерывания.
Из даташита алгоритм записи EEPROM:

Цитата
1. Wait until EEWE becomes zero.
2. Wait until SPMEN in SPMCR becomes zero.
3. Write new EEPROM address to EEAR (optional).
4. Write new EEPROM data to EEDR (optional).
5. Write a logical one to the EEMWE bit while writing a zero to EEWE in EECR.
6. Within four clock cycles after setting EEMWE, write a logical one to EEWE.

Caution: An interrupt between step 5 and step 6 will make the write cycle fail, since the
EEPROM Master Write Enable will time-out. If an interrupt routine accessing the
EEPROM is interrupting another EEPROM Access, the EEAR or EEDR reGister will be
modified, causing the interrupted EEPROM Access to fail. It is recommended to have the Global Interrupt Flag cleared during all the steps to avoid these problems.


И тем не менее далее в своих примерах игнорируются собственные рекомендации, что приводит к неправильной работе описанных функций.


А Вы хитрый. ОШИБКЕ ТО В КОДЕ НЕТ, а запрещать прерывания или нет, должен думать сам программист. Если в прерываниях нет обращений к ЕЕПРОМ, то и запрещать прерывания нет смысла. Или если обращения к ЕЕПРОМ ТОЛЬКО В ОДНОМ прерывании опять же нет смысла запрещать остальные прерывания. СМЫСЛ ЕСТЬ только в том случае, если несколько потоков могут читать/писать в/из ЕЕПРОМ. Так что НЕ ПУТАЙТЕ публику, код совершенно рабочий. В вышеприведенном англицком тексте об этом и написанно. Вот Вам вольный перевод:

Предостережение: прерывание между шагом 5 и шагом 6 вызовет сбой цикла записи если програма прерывания будет изменять значения EEAR или EEDR. Рекомендуется очищать глобальный флаг прерывания перед исполнением всех шагов во избежание проблем.

А если прерывния использует системный клок, как же нам тогда к ЕЕПРОМу то обращаться. Мы запретим прерывание, и клок собъется, мы на работу опазлаем...Однако... :-)))

Сообщение отредактировал prottoss - Mar 2 2006, 20:38


--------------------
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Дим   EEPROM   Mar 2 2006, 18:07
- - defunct   У вас ошибка в коде в части с CLI().. вот рабочий ...   Mar 2 2006, 18:17
|- - defunct   Цитата(prottoss @ Mar 2 2006, 22:35) А Вы...   Mar 2 2006, 20:57
|- - prottoss   Цитата(defunct @ Mar 3 2006, 03:57) Цитат...   Mar 2 2006, 21:51
|- - defunct   Цитата(prottoss @ Mar 2 2006, 23:51) А не...   Mar 2 2006, 23:44
- - prottoss   Цитата(Дим @ Mar 3 2006, 01:07) Товарищи,...   Mar 2 2006, 18:49
- - beer_warrior   Господа, а никто не делал библиотечки EEPROM полно...   Mar 2 2006, 20:30
- - beer_warrior   Цитатаwill make the write cycle fail, since the EE...   Mar 2 2006, 21:02
- - defunct   Вот что у меня получилось с прерываниями.. Выигрыш...   Mar 3 2006, 01:23
|- - vet   Цитата(defunct @ Mar 3 2006, 04:23) Вот ч...   Mar 3 2006, 06:22
|- - defunct   Цитата(vet @ Mar 3 2006, 08:22) Цифра ...   Mar 3 2006, 09:03
- - Георгий   А если не заморачиваться и положиться на компилято...   Mar 3 2006, 05:32
- - ArtemK   По поводу буферизированной записи в EEPROM по прер...   Mar 3 2006, 09:25
- - defunct   Цитата(ArtemK @ Mar 3 2006, 11:25) По пов...   Mar 3 2006, 09:38


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

 


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


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