Технический форум по робототехнике.
-= Александр =- » 13 сен 2009, 20:11
Кто-нить имел дело с внешним ОЗУ для AVR? Щас вот колдую в CodeVisionAVR - пока глухо... Разбираюсь чего где не так подклюил... Мож есть какие-то подводные камни?
-= Александр =- » 14 сен 2009, 01:02
Эх, видимо что-то не успевает сработать. Щас написал софтовый обмен с памятью - все ОК, но медленно блин... А как пытаюсь аппаратно - все виснет намертво.

=DeaD= » 14 сен 2009, 01:17
ОЗУ не поспевает за мегой?
blindman » 14 сен 2009, 01:19
ОЗУ какое? Тактовая частота процессора? Возможно, нужно ввести циклы ожидания
-= Александр =- » 14 сен 2009, 02:31
Озу 15наносекунд... Частота 16 МГц.
blindman » 14 сен 2009, 02:34
Должно нормально работать. А покажи схемку? В ПДФ или картинкой. И код, как включаешь внешнюю память
-= Александр =- » 14 сен 2009, 03:48
Вот схема.
Программа стандартная сгенерена CodeVision...
- Код: Выделить всё • Развернуть
// External SRAM page configuration:
// - / 0000h - FFFFh
// Lower page wait state(s): None
// Upper page wait state(s): 2r/w
MCUCR=0x80;
XMCRA=0x02;
Плюс еще в настройках компилера говорю что внешняя память есть.
Но как только прошиваю - все виснет намертво...
А вот это работает нормально:
- Код: Выделить всё • Развернуть
void Write(unsigned int Adress, char Data)
{
#asm("cli")
DIR=0xFF;
AD=*(char*)&Adress;
ADR=*(char*)&Adress+1;
PORTG|=0b100;
PORTG&=~0b100;
AD=Data;
PORTG&=~0b001;
#asm("nop")
PORTG|=0b001;
//AD=0;
//ADR=0;
DIR=0;
#asm("sei")
}
char Read(char Adress)
{
char data;
#asm("cli")
DIR=0xFF;
AD=*(char*)&Adress;
ADR=*(char*)&Adress+1;
PORTG|=0b100;
PORTG&=~0b100;
DIR=0;
PORTG&=~0b010;
#asm("nop")
data=DATAIN;
PORTG|=0b010;
#asm("sei")
return data;
}
Есть подозрение что микросхема-защелка адреса работает не так как надо. Надо HCT573, а у меня стоит 574. Но логика работы у них в таком режиме одинаковая. Завтра попробую 573ю.
- Вложения
-
RAM.pdf
- (19.19 КиБ) Скачиваний: 82
blindman » 14 сен 2009, 04:26
Нифига не одинаковая. 574 защёлкивается по фронту, а 573 - по спаду. AVR выдает адрес при высоком уровне ALE, потом переводит его в низкий. У тебя в регистр записываются данные, которые остались на шине от предыдущей операции, а не адрес. С 574 надо инвертор ставить.
спать надо в полпятого, а не память подключать 
-= Александр =- » 14 сен 2009, 14:00
Вот пятой точкой чуял что они разные. Даже просимулировал этот момнет, а Proteus гад обманул меня - там все одинаково работало...

Пойду искать 573ю...
galex1981 » 14 сен 2009, 14:35
С каждым днем все больше и больше ошибок у Proteus всплывает...
nest » 14 сен 2009, 14:55
а
я вот вообще без защелки обошелся: (картинка кликабельна)
рулил ногами на асме.
ну это если ног хватает.

-= Александр =- » 14 сен 2009, 17:42
Не, программно рулить даже на асме все равно не по-джедайски...

Duhas » 21 сен 2009, 10:41
тэкс, я вот думаю о прикручивании памяти в Хмеге... только вот там ALE инверсные.. а все знакомые мне защелки 373\4 573\4 работают либо по фронту, либо по высокому уровню... а нужно бы по спаду...
blindman » 21 сен 2009, 11:21
573 защёлкивается при низком уровне - как раз, то что нужно.
- Вложения
-

-

Duhas » 21 сен 2009, 12:32
не защелкивается при низком, а разрешает выход.. 2 разных вещи )
2 рисунок 1 таблица LE Latch Enable.. Active HIGH