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

 
 
> IAR и запись в EEPROM, Вопрос по реализации записи в eeprom в IAR
arttab
сообщение May 16 2006, 07:27
Сообщение #1


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

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



В моей проге есть запись по команде в еепром:
1. посылаю команду
2. Байтики принемает уарт и они вне прерывания обрабатываются функцией приемника
3. При получении нужной команды в еепром пишется байт (пишется средствами IAR) и отсылаеются байтики о выполнении. Отсылается не дожидаясь окончания записи (флаг не проверяю).

Задержка между окончанием приема команды на запись до отправки ответа около 7.5 мсек. если не пишу, а отвечаю сразу, то 0,3мсек.
Вопрос: чем вызвана такая большая задержка? Кварц 8 МГц. Время записи одного байта должно быть 1 мсек. МЕГА8

Это не просто любопытство - есть проблемы при записи в еепром в других частях проги. Пытаюсь разобраться.


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
3 страниц V   1 2 3 >  
Start new topic
Ответов (1 - 14)
KRS
сообщение May 16 2006, 07:43
Сообщение #2


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

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



А почему вы думаете что время записи 1 ms?
уже давно у всех новых атмелов еепром тактируется от внутреннего генератора и время записи
примерно 8.5 ms
Go to the top of the page
 
+Quote Post
arttab
сообщение May 16 2006, 08:43
Сообщение #3


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

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Кое что дошло. для МЕГИ8 время записи байта в еепром до 9 мсек. и оно определяется внутреним генератором и свойствами самой еепром.

Вопрос: надо ли запрещать прерывания при записи в еепром или все проходит нормально?


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
BVU
сообщение May 16 2006, 08:57
Сообщение #4


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

Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264



Цитата(arttab @ May 16 2006, 12:43) *
Кое что дошло. для МЕГИ8 время записи байта в еепром до 9 мсек. и оно определяется внутреним генератором и свойствами самой еепром.

Вопрос: надо ли запрещать прерывания при записи в еепром или все проходит нормально?

Для начала посмотрите ассемблерный код Вашей программы на запись в eprom, если там нет команды запрещения прерывания, сделайте самостоятельно запрещение прерывания при записи в eprom в своем коде. Это обязательно!


--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
Go to the top of the page
 
+Quote Post
arttab
сообщение May 16 2006, 09:15
Сообщение #5


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

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Спасибо всем!
IAR сам не запрещает прорывания ни дожидается окончания записи

сделал так:
__disable_interrupt(); //CLI

здесь пишу

while(EECR&(1<<EEWE));
__enable_interrupt();


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
KRS
сообщение May 16 2006, 10:31
Сообщение #6


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

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



Запрещать прерывания нужно только
что бы биты EEMWE и EEWE установились подряд!

Код
__disable_interrupt();

/* Write logical one to EEMWE */
EECR |= (1<<EEMWE);
/* Start eeprom write by setting EEWE */
EECR |= (1<<EEWE);

__enable_interrupt();


а вот пока ждется окончание записи наоборот имеет смысл прервания разрешать! а то все уснет на 9 ms
(если только конечно в перываниях еепром не пишется)
Go to the top of the page
 
+Quote Post
arttab
сообщение May 17 2006, 01:33
Сообщение #7


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

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Спасибо KRS. Замечание ценное, но не для моего случая - сбор инфы идут по прерываниям таймера, а анализ вне прерываний. железяка все равно обломается с измерениями.
Если только с индикацией будет плохо попробую поколдовать.


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение May 17 2006, 12:41
Сообщение #8


Шаман
******

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



Посмотрите также здесь.
Это я когда-то выкладывал исправленный файл иаровского исходника для работы с ЕЕПРОМ.
Go to the top of the page
 
+Quote Post
arttab
сообщение May 18 2006, 02:01
Сообщение #9


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

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Цитата(IgorKossak @ May 17 2006, 19:41) *
Посмотрите также здесь.
Это я когда-то выкладывал исправленный файл иаровского исходника для работы с ЕЕПРОМ.


Этим файлом надо заменить старый в ИАРЕ? как он работает (что исправлено от родного)? Бегло глянул - прерывания не запрещает.


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение May 18 2006, 06:22
Сообщение #10


Шаман
******

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



Цитата(arttab @ May 18 2006, 05:01) *
Этим файлом надо заменить старый в ИАРЕ? как он работает (что исправлено от родного)? Бегло глянул - прерывания не запрещает.

Исправлений как раз много и прерывания запрещает как положено.
А смотреть намного удобнее не бегло, а какой-нибудь утилитой сравнения\слияния (WinMerge, KDiff3, CS Visual Diff, ...).
Go to the top of the page
 
+Quote Post
arttab
сообщение May 18 2006, 08:53
Сообщение #11


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

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Копаться в чужом тексте дело не благодарное. Жаль что нет описания изменений, но все равно спасибо.


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение May 18 2006, 11:31
Сообщение #12


Шаман
******

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



Цитата(arttab @ May 18 2006, 11:53) *
Копаться в чужом тексте дело не благодарное.

Ну я же дал себе труд покопаться в иаровском тексте. И нисколько не жалею. Надо же как-то квалификацию поднимать.
Цитата(arttab @ May 18 2006, 11:53) *
Жаль что нет описания изменений, но все равно спасибо.

А описание можно свести к двум пунктам:
1) любая критическая работа с ЕЕПРОМ (за исключением кристаллов AT86RF401), требующая непрерываемости, обрамлена в обёртку типа:
сохранить SREG
CLI
критическая работа с ЕЕПРОМ
восстановить SREG
2) исправлена ошибка в подпрограмме записи в ЕЕПРОМ 64-битных чисел.
Go to the top of the page
 
+Quote Post
arttab
сообщение May 19 2006, 01:46
Сообщение #13


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

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Спасибо. Парадокс: чтобы сделать хорошо и быстро нужно время на углубление знаний ("Надо же как-то квалификацию поднимать."), а на это нужно время.


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
_Bill
сообщение May 23 2006, 12:16
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(arttab @ May 16 2006, 12:15) *
Спасибо всем!
IAR сам не запрещает прорывания ни дожидается окончания записи

сделал так:
__disable_interrupt(); //CLI

здесь пишу

while(EECR&(1<<EEWE));
__enable_interrupt();

А зачем так сложно? Гораздо проще объявить переменную в EEPROM. Тогда обращения к ней IAR делает автоматически все сам, со всеми прибамбасами.
Go to the top of the page
 
+Quote Post
arttab
сообщение May 24 2006, 02:01
Сообщение #15


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

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Цитата
А зачем так сложно? Гораздо проще объявить переменную в EEPROM. Тогда обращения к ней IAR делает автоматически все сам, со всеми прибамбасами.

Я так тоже думал...
Я обявил масив в еепром и пишу в него так:
void Conf_B_B(unsigned char z, unsigned char y)
{
unsigned char __eeprom* ub;
unsigned char* uc;
unsigned char i=6;

ub = Conf_BR + z;
uc = str + y;
*(ub) = *(uc);

__disable_interrupt(); //CLI
while (i)
{*(ub) = *(uc);
uc++;
ub++;
i--;}

while(EECR&(1<<EEWE));
__enable_interrupt();
}
Пришлось самому прерывания запрещать


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post

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

 


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


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