[an error occurred while processing this directive] [an error occurred while processing this directive]
Что-то Вы, батенька, намудрили...
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено BLACKEAGLE 15 марта 2002 г. 00:44
В ответ на: Помогите с Атмеловским AT89C51 отправлено Annihilator 14 марта 2002 г. 22:52

Во-первых, Вы где-то потеряли одну F - для АТ89С51 исполнение из внешней памяти программ начинается после перехода РС через FFF, а не FF, т.е. тогда, когда внутренняя Flash исчерпана (в АТ89С51 ее 4К, или FFF+1 байт). Во-вторых, если ЕА=0, то из Flash Вы ничего не исполните - все обращения за кодом будут к внешней памяти программ.

Сделать то, что Вы задумали, элементарно. Просто прицепите ОЗУ через адресный регистр к МК, заведя PSEN на ОЕ ОЗУ. WR МК советую прицепить к WE ОЗУ через кнопку, если намерены использовать это ОЗУ только как загружаемую память программ. Если хотите в этом же ОЗУ иметь и память данных, то объедините PSEN и RD двухвходовым "И" (типа 74НС08), кнопка тут будет неуместна. В любом случае EA вешайте на "1".

Теперь самое ненавязчивое - адресация. Если Вы прицепили ОЗУ изрядного объема (32Кх8 или 64Кх8), то потеря младших 4К Вас не сильно огорчит - именно такого размера Flash в АТ89С51, но если ОЗУ будет 8Кх8, то воспользоваться Вы без геморроя сможете лишь старшей половинкой, т.е. 1000h-1FFFh, а дальше будет упомянутый геморрой - МК выдаст адрес 2000h, а ОЗУ (8Кх8) выдаст ему содержимое ячейци 0000h (почему - догадайтесь сами:). Поэтому советую ставить 32Кх8 или 64Кх8 - к тому же они практически даром могут быть позаимствованы из никому уже не нужных материнских плат 386/486 - на них там кэш сделан.

Теперь пишите загрузчик, заливайте его во Flash, запускайте и набивайте Ваше ОЗУ кодом. По окончании загрузки кода передавайте управление на адрес начала ОЗУ (1000h) и наслаждайтесь.

Сразу подскажу еще один немаловажный момент. Как Вы понимаете, таблица векторов прерываний у х51 должна сидеть на фиксированных адресах в самом начале Flash, следовательно, загружать ее Вы не сможете. Это не беда, особенно, если объем ОЗУ большой. В таблицу обычно первой командой для каждого вектора пишут какой-нибудь JMP (AJMP или LJMP), так вот эти LJMP (AJMP Вам заведомо не хватит) должны указывать УЖЕ на адреса процедур обработки прерываний (ISR), размещенных в ОЗУ. Чтобы не сталкиваться с необходимостью перепрошивать таблицу, назначьте каждой такой процедуре фиксированный адрес в ОЗУ, отведя под каждую, скажем, 256 байт (можно и больше) в верхней области ОЗУ.Тогда, например, для 32Кх8 Ваша карта памяти будет выглядеть так:

0000-0FFF - таблица векторов и загрузчик
1000-6FFF - загружаемая программа
7000-70FF - ISR1
7100-71FF - ISR2
7200-72FF - ISR3
7300-73FF - ISR4
....

Очевидное ограничение - загрузчик не должен пользоваться прерываниями, т.к. во время его работы ISR еще не загружены. Но это не страшно, т.к. вместо прерывания от UART можно пользоваться простым опросом состояния бита RI, если нужен таймер - опросом соответствующего TF.

Удачи!

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru