Есть старый стенд EV8031/AVR. По паспорту в нем должен быть установлен AT89c51, но на деле там стоит AT89s52. В паспорте написано: Код (Text): 4. Технические характеристики. • Используемые однокристальные процессоры AT89C51, AT89C52, AT90S8515 (ATmega8515) (корпус DIP-40); • Память программ – 16 КБайт; • Память данных – 16 КБайт; • Последовательная EEPROM память, 256 байт (AT24C02) в стандартной поставке; и т.д чуть ниже: Программа загрузчик находится в Flash-памяти микроконтроллера AT89C51, она проводит инициализацию последовательного приемопередатчика ОЭВМ (DD1(AT89c51)), проверяет наличие и емкость памяти данных. Память ОЗУ объемом 32К делится на две части по 16К. Одна часть для памяти программ, другая для памяти данных. В режиме загрузки вся память 32К отображается в адресное пространство, как память данных. Но в даташитах о таких объемах памяти не говорится. Из внешней памяти есть микросхема AT24C256(32 Кбайта). Как я понял это об этой памяти говорится. Это получается, что AT89c51 умеет выполнять функции записанные на внешнем EPROM-ме ?
Всё в паспорте написано верно. Загрузчик находиться в ФЛЕШЕ самого МК. Статическая память в объеме 32кБ в этот момент видится МК как память данных. После загрузки идет перевод МК на работу с внешней памятью кода, системный контроллер (проще дешифратор) разбивает адресное пространство ОЗУ пополам. Первые 16кБ - МК видит как память программ, а вторые - как внешшюю память данных. Чего не понятно? http://kntu-tk.narod.ru тут есть модель этого стенда для ПРОТЕУСА. И еще пару примочек. http://opensys.com.ua или дуй сюда. Сайт разработчиков этого стенда. Или заходи в ауд. 305а 3 корпуса Херсонского Национального Технического Университета. Рассажу и покажу, что и как. Удачи.
Спасибо. Я с внешней памятью так не работал, и в гугле ничего толкового не нашёл. Так далеко да топать явно не смогу. И еще один вопросик. На основе него можно сделать, без знания особых тонкостей стенда, эмулятор жесткого диска? Программную модель диска уже делал. Теперь все нужно сделать все на железе.
В принципе сигналов на системном раъеме стенда хватит для реализации эл. интерфейса. Но не знаю как по скорости, хватит или нет.
Появилось пару вопросов. Как я понял под данные отводится адреса в диапазоне 4000-7FFF. Записывать данные в эту память можно только камандой: MOVX @DPTR, A 1)При отладке в Proteus-e во внешню память ничего не записывается. Нужно ли постонно устанавливать какуюнибудь защелку или что-то подобное для записи? 2)При работе с большим массивом использовать ,для аресации, цикл с командой INC DPTR весьма неудобно. А удобней ничего нет? PS: С записью разобрался. На микрухе памяти нужно было дописать BASE=0x1FFF.
Нет. Под данные отводится адреса в диапазоне 0000-7FFF 1) При отладке в Proteus-e во всё адресное пространство внешне памяти пишется. (У меня на машине точно ) 2) Можно таким образом. Адрес генерится как P2:R0. Получается можно адресовать внешнюю память в пределах страницы в 256 байт. P2 - номер страницы, старшый байт адреса; R0 - адрес в пределах страницы, младший байт адреса; mov P2, #80h movx @R0, A Я очень часто юзаю, чтобы сократить прогу. http://opensys.com.ua/autobb/viewforum.php?id=4 тут можно спросить, но только 2 раза в году. (Во время проведения олимпиад)
С записью разобрался. В действительности все пишет))) Но (по крайне мере у меня) в Proteus-е можно память просматривать кусками ко 4кб. Вот и приходится извращаться с BASE.
2S_Alex: Можете продемонстрировать простенький пример(иммено для модели в Протеусе) который: 1)Записывает во внешню память пару любых переменных. 2)После. Создает массив более 4кб во внешней памяти.Забивает его одни числом. Допустим 1. 3)Далее обнуляет весь массив. 4)И в конце считывает переменные, из п.1 Толи у меня с руками не то, то ли модель в Протеусе ведет себя очень странно)))) ЗЫ: Эмулятор жесткого диска фактически готов. PS: Допустим этот кусок кода не пашет(Сделан на основе шаблонов из RadASM). Код (Text): ;File RAMData.Inc XVAR Massiv,4000h XVAR Test1,1h XVAR Test2,1h ............. mov A,#20h mov DPTR,#Test1 movx @DPTR,A mov DPTR,#Test2 movx @DPTR,A mov DPTR,#Massiv mov A,#10h movx @DPTR,A ;теперь Test1 затерт
Затрудняюсь ответить. Нет слов. Протеус гонит. Выполняю пошагово - один результат. Первая 20Н пишутся по адресу 0007Н Потом всё уходит в никуда. Выполняю до точки останова - другой. но по 0000Н Чему верить??? Завтра тестану на реальном стенде.
)))) Нашел пару обьяснений глюка. 1) В Протеусе работу с памятью лучше не отлаживать. В нем память идет по кругу. И длина этого круга 4кб. 2) При отладке в Протеусе, вывод CS на микросхеме памяти нужно подключать на землю(если инвертный). Иначе в пошаговом режиме запись и чтение из памяти будет происходить не корректно.
Возникла проблемка. А как обмениватся данными между компом и стендом? Прошивку залил. Вроде все впорядке. Но как только я подключаюсь к COM порту, стенд тутже сбрасывается. Заливал и стандартные тестовые прошивки(те что с ним шли),в них COM порт используеться. Таже фигня.
Когда открывается порт он бергает линию DTR, а она подключена к сбросу MCU. Открывай порт так чтобы DTR не трогать. И бутет ВАМ счастье.
Вычитал следующие: Код (Text): Выбор канала последовательной передачи осуществляется сигналами CFG0, CFG1 по адресу 9001Н. Установка этих битов в "логический ноль" включает порт 1, на схеме Х11, этот порт имеет неполный набор сигналов (RxD, TxD, RI) и предназначен для записи программы в стенд. Программная установка сигналов CFG0 в "0", а CFG1 в "1" формирует выборку дополнительного канала последовательной передачи данных, разъем Х12. Дополнительный последовательный канал имеет полный набор сигналов интерфейса RS-232C. Это получается для нормальной работы с ком портом нужно использовать X12 ? С первым портом провазился долго. Как не подключаюсь всеравно сбрасывается. Постоянно приходит только ответ "EV8031". И еще. А можно подключать второй ком порт к этому же компу? По идее ничего испортится не должно.
Можно. Вот только к другому ни-ни. Из-за схемотехники БП ПК можно спалить стенд (~110V если компы не заземлены). К полному СОМ порту подключал мобильник и юзал АТ команды, работало. А с 3.14СЮКОМ работаю по урезаному порту (порт для заливки). Когда делаем настройку порта смотрим сюда: Код (Text): ... LOCAL dcb:DCB ... _fbits=0 _fbits=_fbits or TRUE SHL fBinary _fbits=_fbits or TRUE SHL fBinary _fbits=_fbits or FALSE SHL fParity _fbits=_fbits or FALSE SHL fOutxCtsFlow _fbits=_fbits or FALSE SHL fOutxDsrFlow _fbits=_fbits or DTR_CONTROL_DISABLE SHL fDtrControl ;_fbits=_fbits or DTR_CONTROL_ENABLE SHL fDtrControl ;_fbits=_fbits or DTR_CONTROL_HANDSHAKE SHL fDtrControl _fbits=_fbits or FALSE SHL fDsrSensitivity _fbits=_fbits or FALSE SHL fTXContinueOnXoff _fbits=_fbits or FALSE SHL fOutX _fbits=_fbits or FALSE SHL fInX _fbits=_fbits or FALSE SHL fErrorChar _fbits=_fbits or FALSE SHL fNull _fbits=_fbits or RTS_CONTROL_DISABLE SHL fRtsControl ;_fbits=_fbits or RTS_CONTROL_ENABLE SHL fRtsControl ;_fbits=_fbits or RTS_CONTROL_HANDSHAKE SHL fRtsControl _fbits=_fbits or FALSE SHL fAbortOnError mov dcb.fbits,_fbits mov eax, SC_.SC_BAUD mov dcb.BaudRate, eax mov dcb.ByteSize, 8 mov dcb.Parity, NOPARITY mov dcb.StopBits, ONESTOPBIT invoke SetCommState,hCOM, addr dcb ... Должно заработать.
Ура))) Все заработало. Спасибо. Зароботало только на заземленном компе. ЗЫ: Но я нашол выход(если заземления нет), перед подключением к порту нужно зажать кнопку сброса программы.
А как нужно корректо обьявлять большие массивы? использую: XVAR disk, 1FFFh Но на живом стенде это работает не правельно.
На сколько БОЛЬШИЕ??? На стенде установлено только 16кБайт внешней ОЗУ (сегмент: XDATA; макрос XVAR). А XVAR disk, 1FFFh - это уже нет половины ОЗУ. Может у Вас уже перебор? Удачи.
До 10ти кб. Память на стенде свободная есть. Но я заметил удивительную вещь. В одном цикле записываю в весь массив одно число. В другом весь массив считываю и вывожу(после преобразования в ASCII) через COM порт. Все вроде пашет верно. После записываю в этот массив пару значений. Допустим в начало,середину и конец. И снова повторяю вывод всего массива. Тогда можно заметить что массив не изменился. Но если считать записаные ранее значения(смещения ведь на них известны), то они окажутся на месте. В итоге когда я указываю точный адрес элемента он выводится верно. А c использованием простого цикла Код (Text): F1: MOVX A,@DPTR inc DPTR DJNZ R1, F1 DJNZ R0, F1 выводится неверный результат.