|
Подключение внешней памяти через мультиплексированную шину, ATMEGA128 чтение, запись из внешней памяти |
|
|
|
Dec 27 2005, 00:45
|

учащийся
    
Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249

|
Цитата(defunct @ Dec 27 2005, 02:00)  Цитата(_artem_ @ Dec 26 2005, 02:10)  defunct , ram kotorij ti upomyanul - on nizkoskorostnoj . Na 16 MHz ne ponyanet bez wait steyta. Lucse ispolzovat fast asynchronous sram's szaderzkoj do 20 nanosec. Primeri podobnyx chipov mozno nayti v STK501 guide gde recommenduyutsya tipy sram'ov dlja zapajki .
20нс абсолютно не нужно. Не настолько быстр AVR как этого хотелось бы. Приведенная мной 70нс память, работает без дополнительных waitstate и на 14.7456 Mhz, и на 16 Mhz. AVR считывает ячейку памяти (без waitstate) за три такта, длительность такта будет равна 62.5 нс при Fosc = 16Mhz, соответственно длительность строба RD/WR равна 2*62.5нс = 125 нс, что вполне удовлетворяет требованиям памяти (у приведенных микросхем памяти длительность цикла чтения/записи - 70нс). Рисунок 13 дата шит атмега 128 - первые два такта используются для установления адреса в латч триггер . Сам сигнал /write (с которого отсчет на выборку ячейки идет) на память начинается вровень с третьим тактом вместе (даже на рисунке видно небольшое запаздывание по отношению к тактовой частоте). В итоге мы получаем не три такта на выборку адреса а один, что в конечном итоге меньше 62.5 наносек на максимальной частоте. (without delay state) Почему то атмел рекомендует 20 нанoсекундные чипы, хотя можно в принципе и 55 наносек поставить. Но вот интересный материал правда на японском http://elm-chan.org/docs/avr/jitter.html. Там видно что тактовая может прыгать на атмегах. Читал что этот эффект используется в мсп430 для того чтобы уменьшить спектр излучения микросхемой эм энергии в соответствии со своими америкосовскими нормами (насчет норм могу и ошибаться). Если атмел тоже это специально сделал в тактовой то наверняка возможна ситуация со временем обрашения меньше чем даже 60 наносек.
--------------------
Зачем лаять на караван , когда на него можно плюнуть?
|
|
|
|
|
Dec 27 2005, 01:30
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(_artem_ @ Dec 27 2005, 02:45)  Рисунок 13 дата шит атмега 128 - первые два такта используются для установления адреса в латч триггер . Сам сигнал /write (с которого отсчет на выборку ячейки идет) на память начинается вровень с третьим тактом вместе (даже на рисунке видно небольшое запаздывание по отношению к тактовой частоте). В итоге мы получаем не три такта на выборку адреса а один, что в конечном итоге меньше 62.5 наносек на максимальной частоте. (without delay state) Эх, сорри, облажался я..  Да вы правы, строб идет не 2 такта, а один.. итого 62.5нс на выборку на 16Mhz. И действительно на 16Mhz память может не успевать. На практике же у нас редко m128 работает на 16mhz (пару раз испытали - память работала устойчиво, разумеется понимаю, что пара раз - не показатель). В основном тактируем мегу 14.7456Mhz, глюков указанной памяти не замечено. (waitstate не ставим). тактируем либо кристалом с запрограммированными фузами CKOUT/CKOPT, либо от внешнего генератора, поэтому тактовая частота у нас не прыгает.. Цитата(_artem_ @ Dec 27 2005, 02:45)  Если атмел тоже это специально сделал в тактовой то наверняка возможна ситуация со временем обрашения меньше чем даже 60 наносек. Врятли, скорее наоборот - в большую сторону.
|
|
|
|
|
Dec 27 2005, 08:27
|
Участник

Группа: Участник
Сообщений: 47
Регистрация: 12-05-05
Пользователь №: 4 940

|
Цитата(defunct @ Dec 27 2005, 03:28)  Цитата(nagserg @ Dec 26 2005, 12:49)  Каким образом привязать адрес этой структуры к "Определенному адресу" char* vp = (char *)Определенный Адрес;
Считаю, что лучше не привязывать эту структуру к определенному адресу, т.к. при обращении к каждому биту будет произведено повторное чтение.. Если у Вас используется DMA то это приведет к неправильной работе.. Думаю, правильней будет вначале прочитать, а потом уже проверять/устанавливать отдельные биты: Код typedef union { unsigned char byte; struct { unsigned char b0 : 1; unsigned char b1 : 1; unsigned char b2 : 1; unsigned char b3 : 1; unsigned char b4 : 1; unsigned char b5 : 1; unsigned char b6 : 1; unsigned char b7 : 1; } bit_field; } dummy_union;
void test(void) { char* vp = (char *)0x300; // адрес 300h dummy_union a; // ваша структура a.byte = *vp; // считываем данные с адреса 300h if (a.bit_field.b0) {}; // проверяем отдельные биты.. /*.....................................*/ /*.. выполняем какие-то действия над битами ..*/ /*.....................................*/ *vp = a.byte; // записываем изменения.. } Я DMA не использую пока и всё-таки каким образом можно привязать структуру к определенному адресу? или не совсем понятно: Цитата(BVU @ Dec 22 2005, 14:58)  Посмотрите блок схему подключения USB ISP1581 к микроконтроллеру. http://www.gaw.ru/html.cgi/txt/publ/interface/usb.htmи соотнесите адресное пространство внешней памяти своего микроконтроллера с имеющимися адресами в USB ISP1581. Писать и читать ячейки данной памяти (USB ISP1581), точно так же как и память внутреннюю. Можете объявить ее, как массив или присвоить начальной области значение указателя. А наверняка там имеются и регистры управления, для инициализации устройства. Лучше всего организовать структуру в которой бы описывалась внутренняя организация регистров и ячеек памяти для данных. Для компилятора надо указывать тип данных, как внешняя память. Можно поподробнее, работаю в CodeVision
|
|
|
|
|
Dec 27 2005, 11:50
|
Участник

Группа: Участник
Сообщений: 47
Регистрация: 12-05-05
Пользователь №: 4 940

|
Цитата(defunct @ Dec 27 2005, 11:50)  ps: а чем не устраивает чтение-модификация-запись в предыдущем примере? У меня есть пример на Keil, скачал с какого-то Китайского сайта, так там вот такое обращение к регистрам: if(USB_Int_Flag.BITS.SUSP) { ....... D14_Cntrl_Reg.D14_MODE.BITS.GOSUSP = 1; } или D14_Cntrl_Reg.D14_ADDRESS.VALUE = 0x80; вот как применить подобное - не понимаю. Вот например файл описания регистров
Прикрепленные файлы
D14.zip ( 2.43 килобайт )
Кол-во скачиваний: 29
|
|
|
|
|
Dec 28 2005, 07:55
|

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

|
nagserg, когда Вы хотите использовать обращение к внешней памяти, необходимо четко представлять по каким логическим и физическим адресам в Вашей системе они распологаются. Для этого у ATmega128 существует 'Карта памяти данных', которая в свою очередь может быть настроена для использования как конфигурации 'A' или 'B' где начало внешнего СОЗУ немного отличаются. Далее у Вас (схемотехника) должны быть подключены одноименные выводы микроконтроллера и внешнего устройства. Все это следует из той ссылки которую я Вам давал в прошлый раз: http://www.gaw.ru/html.cgi/txt/doc/micros/avr/arh128/2.htmпосмотрите внимательно как можно использовать внешнюю память в разделе 'Использование всех ячеек внешней памяти размером менее 64 кбайт', там очень хорошо изложен принцип привязки физических и логических адресов. Так же там есть примеры кода на ASM и 'C'. Рекомендую так же ссылку с нашего форума: http://electronix.ru/forum/index.php?showt...ется+с+адреса+0Попробуйте также найти книгу: 'Применение мк-ров AVR: схемы, алгоритмы, программы', ирма:Додэка-XXI, Год выпуска: 2004. там все это разбирается на примере ATmega8515. Так же посмотрите ссылку: http://bvn123.boom.ru/Controller.htmlУдачи, BVU
--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|