Доброго время суток.
Поможите кто может.
Как в CodeVision AVR записывать во внешнюю память и читать по адресу ячейки?
Требуется память на 1024 байт. Чтение должно проходить от первой ячейки (для меги8515 это адрес 0х260) до последней по очереди.
В хелпе нашел только вот это:
/* the integer variable "a" is stored in RAM at address 80h */
int a @0x80;
Все здорово, но немогу же я создать 1024 переменных.
Как создать что-то вроде массива?
Ну номер элемента массива и физический адрес ячейки - это очень разные вещи. Я так понял что вы используете чип Atmega8515, но вы не уточнили каким образом хотите организовать доступ к памяти. Этот контроллер имеет возможность подключения до 64КБ SRAM, причем при соотвтетствующей настройке обращение к внешней ОЗУ происходит на аппаратном уровне(за 4 такта) когда вы обращаетесь за границы внутренней ОЗУ. В этом случае просто объявляете массив нужной размерности и в нужный момент контроллер сам обратится куда надо.
Но ничто не мешает обращаться к внешней ОЗУ чисто программно:
1.подали на память сигнал разрешения чтения
2.вывели в порт адрес ячейки
3.считали содержимое ЯП
Тоже самое при записи.
Gurvinok писал(а):...записывать во внешнюю память...
Если совсем внешнюю, то наверное самим близким для Вас будет что-то типа AT24C08.
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Именно так и подключена память. При попытке создать массив с числом ячеек больше чем память на кристалле, КодВижн жалуется и не дает выхода к ячейкам памяти. Попробую с двумя защелками программно. Мне нужно только читать память и все. Так что по скорости вполне хватит. Но все равно спасибо за ответ.
Интересный случай. Вообще можно поколдовать с инструкциями чтения из SRAM LD/LDD/LDS и загрузки ST/STD/STS, но я даже не знаю как связать в пределах одной функции какой-то регистр с временной переменной. Может кто подскажет как такое провернуть?
Одного чтения наверно будет мало, т.к. перед тем как читать туда надо что-то записать.
Возможно у вас в настройках проекта что-то неправильно выставлено. А какая версия компилятора?
Программно достаточно и одной защелки, посмотрите стандартную схему подключения чипа SRAM к контроллеру.
Я как раз начал по стандартной схеме с одной защелкой. Версия компилятора 2.04.4а. Я читал в хелпе. Можно только адресовать глобальные переменные. А с проектом все хорошо. Просто данные во внешнюю ОЗУ другой контроллер скидывает, а 8515-й только считывает.
В таком случае остается только программная реализация алгоритма чтения данных. Т.к. при аппаратном подключении вы не будете знать в каком состоянии находятся порты передающего и принимающего контроллеров в моменты простоя. А это уже чревато горелыми портами. Поставте со стороны каждого контроллера шинные формирователи с третьем состоянием и управляйте направлением передачи с приемного контроллера.
Про глобальные переменные я тоже подумал, но компилятор их размещает как попало не только в регистровой области а еще и в области SRAM. У ассемблерных команд аргументом должна быть именно ЯП в регистровом файле.
Не знаю именно про CodeVision, но для проэкта должны быть настроики - присутствия внешней памяти. И тогда массив вам дастся.. Во вторых - для вашего случая советую посмотреть определиние типа:
volatile int x[...] @...
И ещё, флаги Атмеги тоже фолжны быть настроены на присутствие внешней памяти, что наверное напрямую зависит от настроек проэкта..
А, и ещё, призабыл как определялось, но отличия возможны при определении переменных (масива) : т.е. адресация или до байта (256) или слова (65536), но это надо проверять.
Поглядел в мануале - для проэкта должна определятся внешняя память !
Я не зря спрашивал о типе памяти. Посмотрите на даташник (стр.25) как у меги8515 организован доступ к внешней памяти. А0-А15 шина адреса при этом А0-А7 это (более правильно AD0-AD7) шина данных сосмещена с шиной адреса (мультиплексирование) т.е. ни о какой последовательной памяти речи быть не может.
Для организации работы с внешней последовательной памятью нужно отправлять адрес ячейки и данные для записи (в упрощенном виде) и никакого массива!!!
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Мне массив и не нужен. Я читал мануал и память подключена как положено. Мне нужно жестко по конкретному адресу обращаться во внешней ОЗУ. Вот товарищ Pe3ucTop очень хорошую идейку подбросил. Главное чтоб этот массив располагался именно во внешней ОЗУ. Будем пытаться, а так подвиги есть с двумя защелками и пару функций чтения записи.
Кстати вопрос правда не по теме. Ктонить знает как установить АВР студио любой версии. Сколько не бился, начиная с 3 по 4.18 версию, почему-то по среди установки вываливает ошибку и ту-ту. Прям засада какая-то.
Danko писал(а):... для Вас будет что-то типа AT24C08.
Gurvinok писал(а):Именно так и подключена память...
Danko писал(а):... т.е. ни о какой последовательной памяти речи быть не может.
Gurvinok писал(а):Я читал мануал и память подключена как положено.
Так все-таки какая у Вас память? И как её звать?
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
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.