Страница 1 из 1
CodeVision AVR работа с внешней памятью
Добавлено: Вс янв 31, 2010 22:37:29
Gurvinok
Доброго время суток.
Поможите кто может.
Как в CodeVision AVR записывать во внешнюю память и читать по адресу ячейки?
Требуется память на 1024 байт. Чтение должно проходить от первой ячейки (для меги8515 это адрес 0х260) до последней по очереди.
В хелпе нашел только вот это:
/* the integer variable "a" is stored in RAM at address 80h */
int a @0x80;
Все здорово, но немогу же я создать 1024 переменных.
Как создать что-то вроде массива?
Добавлено: Пн фев 01, 2010 13:49:20
uk8amk
Ну номер элемента массива и физический адрес ячейки - это очень разные вещи. Я так понял что вы используете чип Atmega8515, но вы не уточнили каким образом хотите организовать доступ к памяти. Этот контроллер имеет возможность подключения до 64КБ SRAM, причем при соотвтетствующей настройке обращение к внешней ОЗУ происходит на аппаратном уровне(за 4 такта) когда вы обращаетесь за границы внутренней ОЗУ. В этом случае просто объявляете массив нужной размерности и в нужный момент контроллер сам обратится куда надо.
Но ничто не мешает обращаться к внешней ОЗУ чисто программно:
1.подали на память сигнал разрешения чтения
2.вывели в порт адрес ячейки
3.считали содержимое ЯП
Тоже самое при записи.
Re: CodeVision AVR работа с внешней памятью
Добавлено: Пн фев 01, 2010 17:12:06
Danko
Gurvinok писал(а):...записывать во внешнюю память...
Если совсем внешнюю, то наверное самим близким для Вас будет что-то типа AT24C08.
Добавлено: Пн фев 01, 2010 18:26:03
Gurvinok
Именно так и подключена память. При попытке создать массив с числом ячеек больше чем память на кристалле, КодВижн жалуется и не дает выхода к ячейкам памяти. Попробую с двумя защелками программно. Мне нужно только читать память и все. Так что по скорости вполне хватит. Но все равно спасибо за ответ.
Добавлено: Пн фев 01, 2010 20:10:26
uk8amk
Интересный случай. Вообще можно поколдовать с инструкциями чтения из SRAM LD/LDD/LDS и загрузки ST/STD/STS, но я даже не знаю как связать в пределах одной функции какой-то регистр с временной переменной. Может кто подскажет как такое провернуть?
Одного чтения наверно будет мало, т.к. перед тем как читать туда надо что-то записать.
Возможно у вас в настройках проекта что-то неправильно выставлено. А какая версия компилятора?
Программно достаточно и одной защелки, посмотрите стандартную схему подключения чипа SRAM к контроллеру.
Добавлено: Пн фев 01, 2010 21:18:26
Gurvinok
Я как раз начал по стандартной схеме с одной защелкой. Версия компилятора 2.04.4а. Я читал в хелпе. Можно только адресовать глобальные переменные. А с проектом все хорошо. Просто данные во внешнюю ОЗУ другой контроллер скидывает, а 8515-й только считывает.
Добавлено: Вт фев 02, 2010 09:49:12
uk8amk
В таком случае остается только программная реализация алгоритма чтения данных. Т.к. при аппаратном подключении вы не будете знать в каком состоянии находятся порты передающего и принимающего контроллеров в моменты простоя. А это уже чревато горелыми портами. Поставте со стороны каждого контроллера шинные формирователи с третьем состоянием и управляйте направлением передачи с приемного контроллера.
Про глобальные переменные я тоже подумал, но компилятор их размещает как попало не только в регистровой области а еще и в области SRAM. У ассемблерных команд аргументом должна быть именно ЯП в регистровом файле.
Добавлено: Вт фев 02, 2010 11:41:57
Pe3ucTop
Не знаю именно про CodeVision, но для проэкта должны быть настроики - присутствия внешней памяти. И тогда массив вам дастся..

Во вторых - для вашего случая советую посмотреть определиние типа:
volatile int x[...] @...
И ещё, флаги Атмеги тоже фолжны быть настроены на присутствие внешней памяти, что наверное напрямую зависит от настроек проэкта..
А, и ещё, призабыл как определялось, но отличия возможны при определении переменных (масива) : т.е. адресация или до байта (256) или слова (65536), но это надо проверять.
Поглядел в мануале - для проэкта должна определятся внешняя память !
Добавлено: Вт фев 02, 2010 13:01:15
Danko
Я не зря спрашивал о типе памяти. Посмотрите на даташник (стр.25) как у меги8515 организован доступ к внешней памяти. А0-А15 шина адреса при этом А0-А7 это (более правильно AD0-AD7) шина данных сосмещена с шиной адреса (мультиплексирование) т.е. ни о какой последовательной памяти речи быть не может.
Для организации работы с внешней последовательной памятью нужно отправлять адрес ячейки и данные для записи (в упрощенном виде) и никакого массива!!!
Добавлено: Вт фев 02, 2010 19:32:27
Gurvinok
Мне массив и не нужен. Я читал мануал и память подключена как положено. Мне нужно жестко по конкретному адресу обращаться во внешней ОЗУ. Вот товарищ Pe3ucTop очень хорошую идейку подбросил. Главное чтоб этот массив располагался именно во внешней ОЗУ. Будем пытаться, а так подвиги есть с двумя защелками и пару функций чтения записи.
Добавлено: Вт фев 02, 2010 19:35:37
Gurvinok
Кстати вопрос правда не по теме. Ктонить знает как установить АВР студио любой версии. Сколько не бился, начиная с 3 по 4.18 версию, почему-то по среди установки вываливает ошибку и ту-ту. Прям засада какая-то.
Добавлено: Вт фев 02, 2010 20:13:44
Danko
Danko писал(а):... для Вас будет что-то типа AT24C08.
Gurvinok писал(а):Именно так и подключена память...
Danko писал(а):... т.е. ни о какой последовательной памяти речи быть не может.
Gurvinok писал(а):Я читал мануал и память подключена как положено.
Так все-таки какая у Вас память? И как её звать?
Добавлено: Вт фев 02, 2010 20:19:57
Gurvinok

Разговор слепого с немым)) У меня параллельная память КР537РУ10 2Кх8 подключенная с регистром защелкой 74НС573.
Добавлено: Вт фев 02, 2010 20:23:19
uk8amk
Gurvinok писал(а): Мне нужно жестко по конкретному адресу обращаться во внешней ОЗУ. .
Вот наковырял в хелпе для первой версии, не знаю насколько это актуально для второй(а она стоит на другом винте и надо долго перезагружаться).
The prototypes for these functions are placed in the file mem.h, located in the ..\INC subdirectory. This file must be #include -ed before using the functions.
void pokeb(unsigned int addr, unsigned char data)
this function writes the byte data to SRAM at address addr.
void pokew(unsigned int addr, unsigned int data)
this function writes the word data to SRAM at address addr.
The LSB is written at address addr and the MSB is written at address addr+1.
unsigned char peekb(unsigned int addr)
this function reads a byte located in SRAM at address addr.
unsigned int peekw (unsigned int addr)
this function reads a word located in SRAM at address addr.
The LSB is read from address addr and the MSB is read from address addr+1.
Добавлено: Вт фев 02, 2010 21:25:33
Gurvinok
Уважаемый uk8amk! Благодарю за помощь! Ща попробую, а то тут с портами чет не получается.