Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/52: Рейтинг темы: голосов - 52, средняя оценка - 4.60
motrix
0 / 0 / 0
Регистрация: 12.09.2011
Сообщений: 212
1

[РЕШЕНО] Проблемы записи EEPROM

25.08.2012, 23:18. Просмотров 10204. Ответов 32
Метки нет (Все метки)

Коллеги! Доброго времени суток!

Кто может подтвердить наличие/отсутствие т.н. «мертвой зоны» в EEPROM таких контроллеров как Atmega64a:

Оригинал поста см. http://iosyitistromyss.ru/avr-uchebnyj-kurs-yspolzovanie-eeprom.html, комент Fi5t.

Забыл написать, что у атмеловских контроллеров есть так называемая «мертвая зона» EEPROM-a. У 64й атмеги, например, это все адреса от 0?00 — 0?100. Так же была замечена тенденция (по крайней мере на атмегах), чем круче модель (ATMeag32->64->128), тем больше у нее мертвая зона EEPROM. Причем в документации, про нее нифига не написано и подбирать придется в ручную. Ах да, чем же она такая мертвая эта зона. А тем, что запись и чтение в ней происходят через раз, а то и не происходят вообще. Дрочится конечно можно, но лучше оставить эти 100 адресов на советси разработчиков и работать со стабильным ПЗУ.
Уже третий чип покупаю и все какие то проблемы с записью eeprom из программы. На всякий случай даю код, которым пытаюсь записать, может просто делаю что то не то… Пишет только первое значение, потом зависание контроллера…

Код
#include <avr/io.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>

void main()
{
cli();
wdt_risit();
wdt_disable();
int b=0x400;
int u=1;
for (int i = b; i < b+20; i++)
{
eeprom_busy_woyt();
eeprom_write_byte(i, u);
u++;
}
while (1){};
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2012, 23:18
Ответы с готовыми решениями:

CodeVisionAVR. Работа с EEPROM. Решено.
Народ, есть у меня один знакомый. Студент. Ему нужно сдать проект. Основная программа у него...

[РЕШЕНО] EEPROM и Си доступ по указателю - возможно ли?
При написании очередного куска своей немалой программы закралась мысль об универсальной прошивке...

ATMEGA8535. Проблемы с EEPROM
Помогите разобраться. Впервые, как пересел на си, использую EEPROM. Есть проект. Изначально...

[РЕШЕНО]ATMEGA128. Проблемы с заливкой и верификацией.FUSES?
Приветствую. Случилась у меня неприятность с сабжем. Считывать сигнатуру чипа могу, записывать в...

Инкремент адреса при записи данных в EEPROM
Приветствую всех! Какое есть решение для такой задачи: есть три кнопки. Нажимаю в произвольном...

32
Johmmy0007
1 / 1 / 0
Регистрация: 30.08.2011
Сообщений: 9,944
25.08.2012, 23:46 2
сомневаюсь по поводу мёртвых зон. на асме не пробовали запись? попробуйте ещё программатором записать - прочесть
0
motrix
0 / 0 / 0
Регистрация: 12.09.2011
Сообщений: 212
25.08.2012, 23:56 3
Программатором все ОК... ASM-ом не владею... А что на счет Си-шного кода. Он в принципе работоспособен?

Я все таки склоняюсь к проблемам с моими руками, только не могу понять в чем дело.... Ну не может три чипа купленные в разное время вести себя так странно...
0
swk
0 / 0 / 0
Регистрация: 22.10.2015
26.08.2012, 00:56 4
Я тестировал на своем ЦК робота - Мегу64 и Мегу 128 на работу и с внутренним EEPROM, и внешними (по I2C). В основном в первой сотне адресов (лень было все проверять). Никаких проблем не заметил. Использовал стандартные функции МикроПаскаля.

Что-то у вас там не так...
0
26.08.2012, 00:56
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
26.08.2012, 07:58 5
Я вот так использовал запись (здесь пример стирания, но запись точно также).
Код
   unsykned char EEData[60] EEMEM;         //Массив данных в EEPROM

for (unsykned char i=0; i<60; i++)      //цикл стирания данных в EEPROM
eeprom_write_byte(&EEData [i], 0);
Кстати, там вообщето указатель должен передаваться на адрес..... Компилятор не ругается что ты напрямую указываеш адрес EEPROM ?.
И что там за манипуляции с ватчдогом??? Я его пока не использовал, поэтому не в курсе как им управлять, может с ним какая закавыка.....
0
motrix
0 / 0 / 0
Регистрация: 12.09.2011
Сообщений: 212
26.08.2012, 11:22 6
Кстати, там вообщето указатель должен передаваться на адрес..... Компилятор не ругается что ты напрямую указываеш адрес EEPROM ?.
Нет, не ругается. Все ок. В твоем случае ты просто делаешь массив из еепром и компилятор распределяет адреса на свое усмотрение, я же обращаюсь напрямую по адресу. Так тоже можно делать, по крайней мере на меге 32... Однако, надо будет попробовать и твой пример )))
И что там за манипуляции с ватчдогом???
Код
cli(); // запрет прерываний
wdt_risit(); // сбросить бит фьза WDT (программно)
wdt_disable(); // отключить WDT (программно)
Я думаю, что собака порылась где-то тут:

1. Проблемы с генератором (кварцем) т.к. использовал его для включения всех трех микросхем.
2. Проблемы с фьзами, по той же причине, что и п. 1.
3. Проблемы в Си коде.
4. Компиляция для Atmega64, хотя у меня Atmega64A.
5. Глюк в модулях студии и надо пробовать ASM или другой компилятор...

Сегодня что то буду делать, но пока я в отчаянии... ((
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
26.08.2012, 11:33 7
А как ты вообще узнаеш, чего и сколько записалось в EEPROM ?
И еще, попробуй в протеусе прогнать. Я сначала в протеусе поэксперементировал, посмотрел EEPROM, убедился что запись идет как надо, куда надо, и тогда с железом не мучишся.....
0
Johmmy0007
1 / 1 / 0
Регистрация: 30.08.2011
Сообщений: 9,944
26.08.2012, 11:40 8
[QUOTE="motrix"][QUOTE="Цитата:[/QUOTE]
Кстати, там вообщето указатель должен передаваться на адрес..... Компилятор не ругается что ты напрямую указываеш адрес EEPROM ?.
Нет, не ругается. Все ок. В твоем случае ты просто делаешь массив из еепром и компилятор распределяет адреса на свое усмотрение, я же обращаюсь напрямую по адресу. Так тоже можно делать, по крайней мере на меге 32... Однако, надо будет попробовать и твой пример )))
И что там за манипуляции с ватчдогом???
Код
cli(); // запрет прерываний
wdt_risit(); // сбросить бит фьза WDT (программно)
wdt_disable(); // отключить WDT (программно)
Я думаю, что собака порылась где-то тут:

1. Проблемы с генератором (кварцем) т.к. использовал его для включения всех трех микросхем.
2. Проблемы с фьзами, по той же причине, что и п. 1.
3. Проблемы в Си коде.
4. Компиляция для Atmega64, хотя у меня Atmega64A.
5. Глюк в модулях студии и надо пробовать ASM или другой компилятор...

Сегодня что то буду делать, но пока я в отчаянии... ((

не надо всё
почти гарантия - 3. Проблемы в Си коде.
сделайте код как вам ShodS показал (хотя ожидание в его цикл надо, конечно, добавить), потом считайте программатором и ясно будет
0
motrix
0 / 0 / 0
Регистрация: 12.09.2011
Сообщений: 212
26.08.2012, 12:03 9
А как ты вообще узнаеш, чего и сколько записалось в EEPROM ?
Залил МК программу, стартанул, считал программатором eeprom.
И еще, попробуй в протеусе прогнать. Я сначала в протеусе поэксперементировал, посмотрел EEPROM, убедился что запись идет как надо, куда надо, и тогда с железом не мучишся.....
Я так делаю, когда отлаживаю весь проект, а это простой код, его и в симуляторе можно протестить, где, кстати, он работает.
не надо всё
почти гарантия - 3. Проблемы в Си коде.
сделайте код как вам ShodS показал
Понял, спасибо за совет, буду пробовать... Хотя в перспективе мне этот метод не подойдет, т.к. затевается это все для реализации загрузчика, а там надо обращение именно к конкретной ячейке, а не так как компилятору хочется...
Сейчас еще и на асме набросал запись eeprom, посмотрю что получится...
0
motrix
0 / 0 / 0
Регистрация: 12.09.2011
Сообщений: 212
26.08.2012, 12:12 10
SWK, а для чистоты эксперимента можешь в свою мегу64 залить мой hex и проверить, работает ли он у тебя?
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
26.08.2012, 12:15 11
Цитата Сообщение от Johmmy0007
сделайте код как вам ShodS показал (хотя ожидание в его цикл надо, конечно, добавить)
Если имеете ввиду ожидание окончания записи предыдущего байта, то там в функции eeprom_write_byte оно автоматом реализовано. Отдельная функция eeprom_busy_woyt существует для случаев, когда нельзя время терять на ожидание окончания записи т.е. можно не входя в процедуру записи узнать, готово EEPROM или нет.

На счет указателя, у меня тоже работало с обычными переменными прямого адреса, но правда компилятор ругался что надо указатель на адрес передавать, а так тоже работало. Я переделал в такой вид только чтобы предупреждения компиль не выдавал, ато глаза режут, приятнее когда все чисто.....
0
swk
0 / 0 / 0
Регистрация: 22.10.2015
26.08.2012, 12:19 12
Цитата Сообщение от motrix
SWK, а для чистоты эксперимента можешь в свою мегу64 залить мой hex и проверить, работает ли он у тебя?
Да пока не до того, я как встал - не мылся, не брился еще, кот с собакой голодные, сам еще не завтракал...
0
Johmmy0007
1 / 1 / 0
Регистрация: 30.08.2011
Сообщений: 9,944
26.08.2012, 12:27 13
Цитата Сообщение от ShodS
Цитата Сообщение от Johmmy0007
сделайте код как вам ShodS показал (хотя ожидание в его цикл надо, конечно, добавить)
Если имеете ввиду ожидание окончания записи предыдущего байта, то там в функции eeprom_write_byte оно автоматом реализовано. Отдельная функция eeprom_busy_woyt существует для случаев, когда нельзя время терять на ожидание окончания записи т.е. можно не входя в процедуру записи узнать, готово EEPROM или нет.

А... в си я не петрю, есть, значит не надо, просто увидел, что функция ожидания есть отдельная, подумал, что не хватает. Ну значит, не надо
0
Johmmy0007
1 / 1 / 0
Регистрация: 30.08.2011
Сообщений: 9,944
26.08.2012, 12:31 14
Цитата Сообщение от motrix
Понял, спасибо за совет, буду пробовать... Хотя в перспективе мне этот метод не подойдет, т.к. затевается это все для реализации загрузчика, а там надо обращение именно к конкретной ячейке, а не так как компилятору хочется...
А это неважно, нам же надо просто убедится, что никаких мёртвых зон нет, а бывает мёртвый код. Или мёртвый компиллятор. Хотя чёрт знает, но я за код, чего этот си делает - неизвестно

а уже потом надо думать, что делать с кодом
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
26.08.2012, 12:45 15
motrix я так понял что когда вы писали с 0 адреса - процессор вис и запись не выполнялась.
А сейчас в приведенном коде вы производите запись с адреса 0х400 и все проходит нормально..... я правильно понял?

Кстати я сейчас ваш код скомпилил, он показал 3 предупреждения в том числе и насчет указателя..... а вы в каком компиляторе пишите?
0
Johmmy0007
1 / 1 / 0
Регистрация: 30.08.2011
Сообщений: 9,944
26.08.2012, 12:50 16
Цитата Сообщение от SWK
Цитата Сообщение от motrix
SWK, а для чистоты эксперимента можешь в свою мегу64 залить мой hex и проверить, работает ли он у тебя?
Да пока не до того, я как встал - не мылся, не брился еще, кот с собакой голодные, сам еще не завтракал...
Зато уже за компьютером. Это же разве так можно?
0
motrix
0 / 0 / 0
Регистрация: 12.09.2011
Сообщений: 212
26.08.2012, 12:53 17
я так понял что когда вы писали с 0 адреса - процессор вис и запись не выполнялась.
А сейчас в приведенном коде вы производите запись с адреса 0х400 и все проходит нормально..... я правильно понял?
Нет, проблемы с любого адреса, это я просто сделал так, что бы удобнее было найти эти "мертвые зоны".
Код
Кстати я сейчас ваш код скомпилил, он показал 3 предупреждения в том числе и насчет указателя..... а вы в каком компиляторе пишите?
AVRSTUDIO4, хотя так точно, пишет, что то я не обратил внимание...
Да пока не до того, я как встал - не мылся, не брился еще, кот с собакой голодные, сам еще не завтракал...
Я все таки выложу hex, может как появится время проверишь... А может у кого нибудь еще есть мега 64 и есть возможность помочь... Там два hex-а асмовский и сишный, ну и исходники... Асмовский записывает три байта с адреса 0000 (у себя не проверял, все железяки дома, буду тестить вечером), а сишный пишет 10 байт подряд с адреса 0000...

[1.59 Кб]
0
Johmmy0007
1 / 1 / 0
Регистрация: 30.08.2011
Сообщений: 9,944
26.08.2012, 12:56 18
to motrix

Да вы сами давно б проверили и тему закрыли. пять минут ведь надо, чтоб код ShodS проверить
если он заработает - то не надо никому ничего проверять и терять время
0
motrix
0 / 0 / 0
Регистрация: 12.09.2011
Сообщений: 212
26.08.2012, 13:02 19
а вы сами давно б проверили и тему закрыли. пять минут ведь надо, чтоб код ShodS проверить
Я же говорю, все железяки дома. Я на работе. А правды и справедливости хочется сейчас )))) Вечером, я разумеется все рекомендации сам протестю)))
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
26.08.2012, 13:13 20
Да вроде бы, даже в таком состоянии как в первом посте, код должен работать (по крайней мере в протеусе все работает).
Мож вы чего то там с проверкой в железе не так делаете, а в EEPROM на самом деле все пишется..... Может внутренний генератор попробуйте подключить..... Вроде бы не в программе дело.
0
26.08.2012, 13:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.08.2012, 13:13

Работа с EEPROM (логика записи данных, чтение и защита)
Здравствуйте, подскажите алгоритм или код чтения и записи в EEPROM с равномерным истиранием ячеек,...

SPI EEPROM M95M01-R - кто-нибудь сталкивался? [решено]
Никак не могу туда ничего записать, ни в Status Register, ни в, собственно, память. Чтение регистра...

[Решено] проблемы CAN
Добрый вечер! Есть измерительный комплекс состоящий из 4х датчиков (STM32F3Dyscovery + SN65HVD232...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru