Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Atmega8+24C256
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
OLEG_BOS
Уважаемые знатоки прошу Вашей помощи. Бьюсь уже три дня и две ночи. sad.gif Перечитал кучу литературы и Data Sheets. Но так и немогу добится стабильной работы. Поэтому и решил обратится к Вам за помощью поскольку впервые начинаю работать с I2C.

Описание схемы: Связка Atmega8+M24LC256. Микросхема ЕЕPROM подключена к выводам TWI Atmega8.
Описание задачи: Читать содержимое ЕЕPROM с адреса 0х0000 по 0х0400.
Описание программы: Используется программа Software I2C (так как с Hardware TWI были еще большие проблеммы) написанная в IAR, с использванием части кода взятого на форуме - БОЛЬШОЕ спасибо Мах и Андрей http://nav2.livejournal.com/130205.html.
Описание проблеммы: Наблюдается крайне неустойчивое чтение M24LC256 (на тактовой частоте 70 КГц). Поначалу еще более менее наблюдается стабильное чтение порядка 10 байт. А далее ....Просто тихий Ужас sad.gif Микросхема просто отказывается читатся sad.gif Было проведенно множественное число экспериментов как с реальным железом, так и с использованием симулятора Proteus (в котором были полученны временные параметры сигналов SDA и SCL а также и всего протокола обмена (вроде все там в норме). Непонятно почему, но на каком то этапе чтения ЕЕPROM видает 0xFF (хотя в зашитом файле этого числа там просто нет !!!) sad.gif . Такое ощущение будто она просто переходит в пасивное состояние и шиной просто не управляет. Повторные последующие рестарты просто ухудшают ситуацию - микросхема не выдает даже первых стабильных 10 Байт.

Вопрос: Неужели все так печально с I2C ? sad.gif Может есть какой то "секрет" по работе с M24LC256 который не описан (или случайно пропущен мною) в Data Sheet ??? Читается ли у кого-либо M24LC256 с первого раза (без рестартов) стабильно как часы ?

Прошу Вашей помощи !!! Заранее багодарен. smile.gif
rezident
А осциллографом сигналы в реальном железе не догадались посмотреть?
Shurmas
подтяжка на линиях есть ?

Адрес тоже нужно установить внешне не полагаясь на внутренние подтяги.
andrvisht
и конденсатор к ногам питания на 100нФ
OLEG_BOS
Цитата(&-rey @ Aug 26 2006, 14:53) *
и конденсатор к ногам питания на 100нФ


to rezident ?: С осцылографом напряг, поэтому и несмог посмотеть. Но и если б и был то толку мне с него -одноканального ? sad.gif ... Ясность в картину происходящего мог бы внести только двухканальный цыфровой анализатор, которого увы нету sad.gif Имеется такой только в симуляторе, на котором, как я и говорил были проведены измерения.

to Shurmas & &-rey. Понятное дело имеются подтягивающие резисторы на 4,7 КОМ к линии SDA и SCL как симуляторе так и в реальном железе. Фильтрующий конденсатор на макетной плате на 0,33 МкФ (многослойная керамика) был заранее установлен рядомже с панелькой на которой стоит M24LC256.

Кстати подобные "наводящие" вопросы я предвидел , просто забыл об этих "само-собой разумеющихся " деталях ранее упромянуть. Незря ж я, наверное, читал литературу и Data Sheets ? Скажу наперед что и программа управления SDA и SCL построена по всем канонам шины I2C (Open Drain):

void scl_set(unsigned char set_c)
{
if(set_c)
{
I2C_DDR&=~(1<<SCL_LN);
I2C_PORT&=~(1<<SCL_LN);
}
else
{
I2C_DDR|=(1<<SCL_LN);
I2C_PORT&=~(1<<SCL_LN);
}
__delay_cycles(I2C_T*F_CLK);
}



У меня вопрос простой: Это у меня так себя ведет M24LC256 ? Ктото еще сталкивался с подобным явлением ? Кто реально работал с серией 24xx ? Есть ли подобные проблемы у других ?

Заранее благодарен.
OLEG_BOS
Да и по поводу адреса: Микросхема M24LC256 адресована с нулевым адресом - выводы A0-A2 соеденены к GND. Поэтому и в программе присутсвуют команды :

i2c_start_soft();
i2c_tx_soft(0xA0);
defunct
Цитата
Понятное дело имеются подтягивающие резисторы на 4,7 КОМ к линии SDA и SCL как симуляторе так и в реальном железе

По даташиту должно быть 1k-1.6k, но это думаю вопрос десятый.

проверенный пример смотрите в этой ветке.
Семён
>>Используется программа Software I2C (так как с Hardware TWI были еще большие проблеммы) >>написанная в IAR, с использванием части кода взятого на форуме - БОЛЬШОЕ спасибо Мах и Андрей
Использовал TWI в Mega8 с памятью 24С64 и 24С128 проблем не было. Делал всё по даташату.
Сергей Борщ
Цитата(OLEG_BOS @ Aug 26 2006, 18:16) *
Скажу наперед что и программа управления SDA и SCL построена по всем канонам шины I2C (Open Drain):
Это очень хорошо и правильно. Приложите весь код одним файлом, гляну.
OLEG_BOS
Тема закрыта. Наконец удалось раздобыть двухканальный цыфровой осцылограф. Недоспав еще одну ночь, наконец разобрался в сути проблемы. Подрихтовав маленечко пограмму - Все заработало. smile.gif Микросхема наконец начала читатся стабильно. smile.gif Основной проблемой было то, что упор я делал на Proteus, надеясь что терминал I2C в нем работает правильно. Но на самом деле не все там "красиво", но все таки Proteus здорово помог мне в настройке временных параметров.
Все удалось проверить подключив Atmega8 к COM порту компа.

Все ответившим спасибо за поддержку. smile.gif

defunct - спасибо за код Hardware TWI, но к сожалению задача требует контроля прихода 8-го такта сигнала SCL перед ACK(NOT ACK). Поэтому все же пришлось использовать Software TWI.
defunct
Цитата(OLEG_BOS @ Aug 29 2006, 11:50) *
defunct - спасибо за код Hardware TWI, но к сожалению задача требует контроля прихода 8-го такта сигнала SCL перед ACK(NOT ACK). Поэтому все же пришлось использовать Software TWI.


?!

Зачем контроллировать "приход 8-го такта сигнала SCL"?Он же контроллером генерируется... И start/stop condition тоже...
OLEG_BOS
Цитата(defunct @ Aug 29 2006, 15:59) *
Цитата(OLEG_BOS @ Aug 29 2006, 11:50) *

defunct - спасибо за код Hardware TWI, но к сожалению задача требует контроля прихода 8-го такта сигнала SCL перед ACK(NOT ACK). Поэтому все же пришлось использовать Software TWI.


?!

Зачем контроллировать "приход 8-го такта сигнала SCL"?Он же контроллером генерируется... И start/stop condition тоже...


Но я же говорю: так требует поставленная задача....Даю намек wink.gif : скажем перевод последовательных данных с шины I2C в их паральный вид с помощью сдвигового регистра.
defunct
Цитата(OLEG_BOS @ Aug 29 2006, 17:41) *
Но я же говорю: так требует поставленная задача....Даю намек wink.gif : скажем перевод последовательных данных с шины I2C в их паральный вид с помощью сдвигового регистра.

Все равно непонятно зачем это может понадобиться.
Особливо учитывая сабж: "Atmega8+24C256".
Пытаетесь убить двух зайцев вычитываете данные из eeprom и сразу запихиваете не только в контроллер но и еще куда-то?

Зы: прочитанные контроллером данные, можно отправить по месту назначения не применяя никаких хакерских методов. ;>

Зыы: на время работы с нестандартным устройством, подключенным к I2C шине, TWI можно отключать. И работать без старт/стоп состояний по требуемому вам протоколу. Драйвер проще получится.
General Dead
А не поделится ли кто нибудь исходником НА АССЕМБЛЕРЕ! для общения с 24cXX по аппаратному I2C.
OLEG_BOS
Цитата(defunct @ Aug 29 2006, 18:00) *
Цитата(OLEG_BOS @ Aug 29 2006, 17:41) *

Но я же говорю: так требует поставленная задача....Даю намек wink.gif : скажем перевод последовательных данных с шины I2C в их паральный вид с помощью сдвигового регистра.

Все равно непонятно зачем это может понадобиться.
Особливо учитывая сабж: "Atmega8+24C256".
Пытаетесь убить двух зайцев вычитываете данные из eeprom и сразу запихиваете не только в контроллер но и еще куда-то?

Зы: прочитанные контроллером данные, можно отправить по месту назначения не применяя никаких хакерских методов. ;>

Зыы: на время работы с нестандартным устройством, подключенным к I2C шине, TWI можно отключать. И работать без старт/стоп состояний по требуемому вам протоколу. Драйвер проще получится.


1. Удивительно, когда непонятны элементарные вещи wink.gif Даю второй намек wink.gif Уважаемый defunct, а Вы представте себе что к выходам сдвигового регистра подключена матрица R-2R smile.gif .... Надеюсь теперь Вам стало понятно для чего это ?

2. Нет в данном случае я не пытаюсь убивать двух зайцев, потому что контроллеру данные из 24C256 нужны как "зайцу стоп сигнал". Его задача очень простая - адресовать данные на шину I2C и в нужный момент выставлять их на регистр.

3. Этот метод я бы назвал не "хакерским" а "KnowHow " в условиях когда к контроллеру и так подключенно много другой переферии (выводы других портов заняты), в память FLASH и так еле помещается управляющая программа, буфер RAM и без этого занят другими данными....И драйвер не совсем уж сложным получается, каких то 1-1,5 Кб. wink.gif
defunct
Цитата(OLEG_BOS @ Aug 30 2006, 10:35) *
1. Удивительно, когда непонятны элементарные вещи wink.gif Даю второй намек wink.gif Уважаемый defunct, а Вы представте себе что к выходам сдвигового регистра подключена матрица R-2R smile.gif .... Надеюсь теперь Вам стало понятно для чего это ?

Мы что играем в шараду? Было бы гораздо лучше если бы вместо намеков, вы бы сразу точно описали задачу и ресурсы отведенные под нее.

Цитата
2. Нет в данном случае я не пытаюсь убивать двух зайцев, потому что контроллеру данные из 24C256 нужны как "зайцу стоп сигнал". Его задача очень простая - адресовать данные на шину I2C и в нужный момент выставлять их на регистр.

Задача может быть изменена:
Контроллер буферизировано читает данные из AT24 быстро, используя TWI шину с режиме прерываний. В свою очередь это снизит загрузку проца, и он сможет заниматься во время чтения данных чем-то другим. По таймеру в realtime выводить на ЦАП данные по отдельным двум линиям. В таком виде задача будет решена классически без всяких возможных подводных камней.


Цитата
3. Этот метод я бы назвал не "хакерским" а "KnowHow " в условиях когда к контроллеру и так подключенно много другой переферии (выводы других портов заняты), в память FLASH и так еле помещается управляющая программа, буфер RAM и без этого занят другими данными....И драйвер не совсем уж сложным получается, каких то 1-1,5 Кб. wink.gif

Дело конечно ваше, но если сделать как было сказано выше, то драйвер работы с i2c и вывода данных в dac займет около 200 байт Flash и около ~20 байт RAM с учетом аппартного I2C и режима прерываний.
OLEG_BOS
Цитата(defunct @ Aug 30 2006, 13:01) *
Цитата(OLEG_BOS @ Aug 30 2006, 10:35) *

1. Удивительно, когда непонятны элементарные вещи wink.gif Даю второй намек wink.gif Уважаемый defunct, а Вы представте себе что к выходам сдвигового регистра подключена матрица R-2R smile.gif .... Надеюсь теперь Вам стало понятно для чего это ?

Мы что играем в шараду? Было бы гораздо лучше если бы вместо намеков, вы бы сразу точно описали задачу и ресурсы отведенные под нее.

Цитата
2. Нет в данном случае я не пытаюсь убивать двух зайцев, потому что контроллеру данные из 24C256 нужны как "зайцу стоп сигнал". Его задача очень простая - адресовать данные на шину I2C и в нужный момент выставлять их на регистр.

Задача может быть изменена:
Контроллер буферизировано читает данные из AT24 быстро, используя TWI шину с режиме прерываний. В свою очередь это снизит загрузку проца, и он сможет заниматься во время чтения данных чем-то другим. По таймеру в realtime выводить на ЦАП данные по отдельным двум линиям. В таком виде задача будет решена классически без всяких возможных подводных камней.


Цитата
3. Этот метод я бы назвал не "хакерским" а "KnowHow " в условиях когда к контроллеру и так подключенно много другой переферии (выводы других портов заняты), в память FLASH и так еле помещается управляющая программа, буфер RAM и без этого занят другими данными....И драйвер не совсем уж сложным получается, каких то 1-1,5 Кб. wink.gif

Дело конечно ваше, но если сделать как было сказано выше, то драйвер работы с i2c и вывода данных в dac займет около 200 байт Flash и около ~20 байт RAM с учетом аппартного I2C и режима прерываний.



Уважаемый defunct, признателен Вам за поддержку и рекомендации smile.gif Но в данном моем случае сделана уже печатная плата именно с такой схемной реализацией задачи, поэтому отступать некуда. Приходится решать ее именно таким способом. В дальнейших разработках попробую воспользоватся Вашими рекомендациями. smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.