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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Вопрос по работе с EEPROM в WinAVR, срочно нужна помощь
777777
сообщение Sep 30 2010, 07:05
Сообщение #16


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

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(aesok @ Sep 30 2010, 10:50) *
Такие сложности нужны для того, чтобы функция EEPROM_write делала только то что от нее требуется - записывала байт в EEPROM, и не делела то чего не должна, тоесть чтобы она не разрешала прерывания.

Так вот для этого и используются псевдофункции cli() и sei(). А зачем при этом еще и сохранять SREG - для меня загадка smile.gif

Цитата(aesok @ Sep 30 2010, 10:50) *
Спасибо большое, я об этом уже 3 года как не знаю, побегу сейчас на рабору перекомпилирую проект, может заработаент!!!

Ответ не тебе, а топикстартеру, а то что он трехлетней давности - что ж, не заметил...

Сообщение отредактировал 777777 - Sep 30 2010, 07:06
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Sep 30 2010, 07:19
Сообщение #17


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



Цитата(Mikron @ Sep 30 2010, 10:58) *
alexeyv, спасибо, но в даташите я не нашел
нужно ли как-то еще настраивать контроллер на запись/чтение
или достаточно использовать только библиотечные функции?

1. Перед использованием необходимо подключить заголовочный файл
#include <avr/eeprom.h>
Настраивать ничего не надо
Посмотрите файл <avr/eeprom.h>, там вы найдете еще несколько необходимых функций и макросов для работы с EEPROM

2. Если в EEPROM хранятся данные которые не надо терять при каждом программировании МК, то необходимо выставить FUSE-бит EESAVE

3. Т.к. запись происходит медленно и ресурс EEPROM ограничен, то запись необходимо производить как можно реже и в местах где быстродействие вашего алгоритма не критично (например, в прерываниях не рекомендуется). При перезаписи значений используйте функции eeprom_update_ХХХ

4. У некоторых МК встречал баг - при записи в EEPROM по адресу 0х00 процессор перестает работать. Так что не используйте этот адрес




to 777777
Цитата
А зачем при этом еще и сохранять SREG - для меня загадка


Сохранение/восстановление SREG - для использования функции в критических местах/секциях (например, в прерываниях), чтобы корректно восстановить флаг глобального разрешения прерываний (т.к. функция его меняет). То есть если они были разрешены, то после выполнения функции останутся разрешены, а если запрещены - то останутся запрещены

Сообщение отредактировал alexeyv - Sep 30 2010, 07:19
Go to the top of the page
 
+Quote Post
aesok
сообщение Sep 30 2010, 07:27
Сообщение #18


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(777777 @ Sep 30 2010, 11:05) *
Так вот для этого и используются псевдофункции cli() и sei(). А зачем при этом еще и сохранять SREG - для меня загадка smile.gif


Код
cli ();
....
sei();


В этом примере код вначале запрещает прерываня, потом выполняет критичискую секцию затем разрешает преравания. Этот код кроме своей прямой функции выполняет еще одну паразитную, он ВСЕГДА разрешает преравания. Особенно опасно если он используеться в библиотечной функии, код которой програмисту не виден. Почему например при вызове функции EEPROM_write дожны разрешиться преравания? Ведь из имени этой функции следуеть что они пишет в EEPROM, про разрешения прерываний ни слова.


Код
u08 savedSREG;
savedSREG = SREG // keep setting so it can be restored
cli ();
...
SREG = savedSREG; // restore SREG


Этот код не изменяет состояния флага разрешения прерывиний. и никакого паразитного влияния на состояние флага не оказывает.

Анатолий.
Go to the top of the page
 
+Quote Post

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

 


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


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