Стечение обстоятельств

Некоторое время назад я попытался подключить к AVR-ке внешнюю память. Конкретно, соединить ATmega8515 и AS7C256. Увы, в процессе обнаружилось несколько неприятных моментов.

1. AVR не снимает адрес с шины адреса после окончания чтения/записи.
2. AS7C256 не может нормально работать с постоянно активным выводом CE (Chip Enable), далее RAM CS.

Пока я понял это — сгорела пара RAM :) Ибо эффект проявлялся нестабильно. Если после доступа к памяти AVR-ка шла во внутреннюю память, то всё было хорошо. А если останавливалась, то память перегревалась и горела! (Что интересно, datasheet говорит, что AS7C256 кушает в активном режиме 660мВт, но ничего не говорит, что этот самый активный режим лучше не держать долго… по факту у меня срабатывало ограничение на БП в 0.5А).

В результате возникла интересная задача.
Схема была на макетке, из микросхем там стояли только 74HC/74AHC. На них то я и решил сделать костыль. Выбор пал на 74HC74.
sch.png

(Извините за качество картинки ;)

Что и куда подключается?
ACC — это, по сути, объединённые WR + RD. Если быть точным ACC = WR & RD. (Чтение/запись, выходящие из AVR, инверсные, и ACC тоже, поэтому вместо ИЛИ написано И).
!ALE — инвертированный ALE.
RAM CS — единица, если по данному адресу надо пойти в память (можно просто притянуть к единице, можно сконструировать некоторую схему, которая будет резать память на нужные регионы).
!RAM CS — тот сигнал, который подаётся на AS7C256.

Как работает?
Схема состоит их двух триггеров. Правый — основной, левый — вспомогательный.
Правый триггер «передаёт» сигнал RAM CS со входа на выход. Микросхема 74HC74 защёлкивает данные по фронту импульса, в данном случае по фронту инверсного ALE (или по спаду того ALE, что выходит из AVR). Это приводит к «включению» RAM.
По фронту инверсного RD (WR) происходит защёлкивание единицы во вспомогательном триггере, которая приводит к немедленному сбросу основного триггера и «выключению» RAM.
В результате сигнал RAM CS активен с момента спада ALE до момента фронта RD (WR).
Следующий импульс инверсного ALE своим спадом сбросит вспомогательный триггер, в результате сигнал сброса будет снят и с основного триггера, что позволит ему выставить CS по фронту инверсного ALE.

Вот что говорит осциллограф:
cs2x.png

Дорисовал пару линий, чтоб было видней моменты переключения CS:
cs2xc.png

Память больше не перегревается. На сколько стабильно всё работает пока не понятно, ибо саму прошивку ещё пилить и пилить :)

Комментарии (17)

RSS свернуть / развернуть
Всегда считал что статической RAM на основе триггерных ячеек глубоко фиолетово, есть «чип енабле», нет его. Какая разница триггеру? Пробовал на TE12512A-15K (TM TECH), UM61512AK-15 (UMC), влияния на работоспособность и температуру не заметил.
0
Было пару раз с КР537РУ10 в кроватке… переходила в КМОП-тригерный режим после манипуляций шаловливыми пальчиками… дико грелась… после остывания продолжала работать.
Как понимаю из-за статики с рук и отсутствия подтягивающих резисторов
1During VCC power-up, a pull-up resistor to VCC on CE is required to meet ISB
specification
Аналогичному триггерному эффекту подвержены были микросхемы 176-ой серии… в 561-ой поставили защитные диоды (вроде)…
0
Ну, такие мысли мне в голову приходили.
Я поставил на адресную шину пулапы (резисторная сборка на 10к) (старшие адреса, младшие подключены к 74AHC573).
Всё это лежит на антистатическом коврике :)
Не помогло.
Про триггерный режим забыл, спасибо, почитаю!
0
Хм… Стопиццот лет тому назад у меня работала похожая связка. Сейчас уже и не вспомню, но вроде CS тоже всегда на земле была. Может проблема с конфликтом выводов в шине адреса/данных?
0
У меня выводы OE/WE памяти намертво запаяны на RD/WR AVR-ки.
И кроме памяти и AVR-ки больше ничего нет.
Кажется, что конфликтовать оно никак не должно.
0
А в качестве защелки какую логику используете?
0
Какой из защёлок? Если речь про младшую половину адреса, то рекомендуемую атмелом — 74AHC573 (кажется так… точно помню что AHC).
А триггеры — обычные 74HС74.
0
«ACC — это, по сути, объединённые WR + RD»
А для чего их объединять? Мне казалось (давно дело было, но по-моему я так включал), что WR должен подаваться на WE, а RD на OE, может что-то не так делаете? Или я что-то перепутал?
0
ага, не сразу увидел «У меня выводы OE/WE памяти намертво запаяны на RD/WR AVR-ки», т.е. они все-таки раздельные подаются… Полную схему бы подключения — было бы яснее, а может быть и понятнее, почему что-то не так…
0
Пардон, полной схемы пока нет… Там всё слишком запущено!
Но я надеюсь, что причину я нашёл правильную.
0
Я имел в виду только ту часть, где задействованы сигналы ADDR, DATA, ALE, WR, RD и CS. И что за сигнал R на осциллограмме? Абсолютно правильно выше сказал Mihail — такой эффект обычно наблюдается при конфликте на шине адреса/данных.
0
Схема такая:
sch.jpg
Блок с пометкой magic — это декодер адреса. Режет адреса так, чтобы ОЗУ работала в диапазоне от 1КБ до 32КБ (вообще, правильней было бы от 608 байт, но, так оказалось проще).
Я вполне допускаю, что декодер адреса лажает, но, влиять это ни на что не должно. Потому что ATmega выдаёт нормальные сигналы на WR/RD и никогда не перепутает внутреннюю и внешнюю память. А с тем, что с CS могут быть проблемы я как раз и разбирался в тексте выше.
R на осциллограмме это сброс основного триггера (который выставляет CS).
0
Ну и остальные адреса ОЗУ наверное на земле? Ну или хотя бы на +Uпит? Или хотя бы кто-где, но логически определены?
0
Остальные адреса на одноимённых выводах атмеги.
0
Память довольно шустрая, от 35 ns вплоть до 10 ns, в зависимости от циферок на конце наименования. Пока неизвестно какая у Вас, но вполне возможно, что уже влияет печать или провода (не знаю как подключено сейчас). На длинных проводах могут быть заметные гонки сигналов, может быть дело в этом? Конфликт шины может быть из-за преждевременного чтения ОЗУ, я бы попробовал просто прогнать сигнал RD (OE) через пару инверторов, задержав тем самым его на несколько ns и одновременно выровняв с задержкой сигнала CS на дешифраторе.
0
Я, конечно, посмотрю осциллографом… Но смущает два момента:
1. Я не понимаю, что с чем должно конфликтовать.
2. Память греется не в момент доступа к ней, а наоборот, в момент простоя, если не снят CS.
0
Не знаю, чем можно измерить, когда именно происходит нагрев. Можно только косвенно оценить ситуацию, в которой это происходит. А конфликтуют, как правило, данные и младший адрес, например если чтение (открывание выходного буфера ОЗУ) происходит раньше, чем снимается младшая часть адреса на процессоре и он переходит в режим чтения. Тут бы хороший щуп с малой входной емкостью, развертку импульса CS на весь экран, синхронизацию от его спада и все сигналы относительно этого момента и друг-друга хорошенько посмотреть.
Кстати, что у Вас на осциллограммах, два обращения к памяти (наверное запись, потом чтение) ??
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.