Главная  Радио и связь 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 [ 29 ] 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93

сив, первый байт которого ($22) находится в ячейке с адресом аРаск (ОхООВО).

Нажимаем F11 пять раз, проверяем состояние порта С в окне Ю. Линии РС2, РС1, РСО приобрели состояние 010, таким же будет состояние трех старших линий адреса в схеме (AR2, AR1, ARO), определяющих номер рабочей страницы внешней памяти.

Трижды нажимаем F11, очищаем старший и младший адреса внешней памяти в ячейках RamH, RamL.

Указатель выполнения команд остановился на команде вызова подпрограммы переноса данных во внешнюю память. В окне Memory перейдем в самый конец внутренней памяти, переместив скроллер окна вниз до конца, выполним View/Processor, в открывшемся окне процессора заметим состояние счетчика команд (0x0000ID - это номер команды rcall, которая будет выполняться) и указателя стека (= 0x000025F).

Нажмем F11. Указатель выполнения команд перескочил на команду с меткой St45bt: (окно программы), в счетчике команд - номер команды с этой меткой. Во внутренней памяти по адресу 25F находится двухбайтный номер команды, на которую надо вернуться после выполнения подпрограммы (001Е - именно эта команда следует за командой с номером 00 ID, и именно адрес 001Е загрузится в счетчик команд после выполнения подпрограммы). Указатель стека сместился на две ячейки влево (25D), если внутри нашей подпрограммы будет подпрограмма следующего уровня вложения. В ячейки 25D:25C запишется двухбайтный адрес возврата из этой подпрограммы.

Устанавливаем курсор на команду с меткой mSt45:, нажимаем Ctrl -ь F10. Регистр Z содержит адрес начала массива во внутренней оперативной памяти микроконтроллера. Указатель выполнения команд находится в начале цикла побайтного копирования данных из внутренней оперативной памяти микроконтроллера во внешнюю память. Отличие цикла от уже рассматривавшихся в этой главе циклов - в наличии двух вызовов подпрограмм. Первый из них {rcall SetAddr) записывает младший и старший байты адреса внешней памяти в два буфера (по электрической схеме - в регистры DD3 и DD4). Второй вызов подпрограммы rcall DataSt извлекает из ячейки внутренней оперативной памяти микроконтроллера (внутреннего ОЗУ) байт данных и записывает его в ячейку внешней памяти.

Наблюдая содержимое счетчика команд и указателя стека в окне Processor, а также изменения в окне Memory (последняя строка, начинающаяся адресом 0x025F), нажимаем F11, указатель выполнения команд перемещается на первую команду подпрограммы установки адреса внешней памяти.



3.7.2. Подпрограмма установки адреса SetAddr:

1. Из ячеек RamH, RamL внутреннего ОЗУ в регистры ХН, XL загружаются младший и старший байты адреса внешней памяти (две команды Ids).

2. Младший байт адреса выводится на шину данных В0...В7 (смотрите схему) через порт В (команда out PORTB,XL).

3. После задержки, необходимой для завершения переходньк процессов в схеме (две команщ>1 пор), на линии BUF1 устанавливается ВЫСОКИЙ уровень {KOMcmjisbiWRTD,BUFl), по которому в регистр DD4 записывается информация, установленная на шине данньк.

4. После задержки (две команды пор) на линии BUF1 устанавливается НИЗКИЙуровень(командасй/РО/гГД£№/),записьврегистр завершена.

5. Старший байт адреса выводится на шину данных В0...В7 через порт В (команда out PORTB,XH).

6. После задержки на линии BUF2 устанавливаек-.ч ВЫСОКИЙ уровень (команда sbi PORTD,BUF2), по котором) в регистр DD3 записывается информация, установленная на Ш1и1е данных.

7. После задержки (две команды пор) на линии BUF2 устанавливается НИЗКИЙ уровень (команда сЫ WRTD,BUF2), завершая запись в регистр DD3.

8. Команда adiw увеличивает содержимое пары регистров XH:XL, теперь в них хранится адрес следующей ячейки внешней памяти, запись в нее будет произведена в следующем цикле установки адреса.

Проведите пошаговую отладку подпрограммы установки адреса, наблюдая за тем, какие данные выводятся в порты. Сопоставьте эти данные с состояниями, которые должны устанавливаться на соответствующих линиях электрической схемы. При выполнении команды выхода из подпрограммы {ret) наблюдайте за изменением состояний счетчика команд и указателя стека. Постарайтесь понять, где хранился адрес возврата из подпрограммы, на какой адрес возврата установлен указатель стека теперь.

Замечание. В регистре ввода/вывода PORTC хранится то, что программа вывела в порт, в регистре ввода-вывода PINC - то, что присутствует на контактах порта (так, в PORTC можно вывести байт И11П11, контакты микроконтроллера РСО и РС2 соединить с общим проводом, тогда состояние PORTC останется без изменений, состояние PINC станет равным 11И1010). Для команд типа out PORTC,tm в окне Ю информация появляется сначала в строке PORTC, а после выполнения следующей команды - в строке PINC.

Перед входом в цикл, начинающийся меткой mSt45:, в регистр Z был занесен адрес начала массива во внутреннем ОЗУ микроконтроллера.



3.7.3. Подпрограмма копирования байта из внутреннего ОЗУ DataSt

1. Первая команда подпрограммы (ldtm,Z+) копирует первый байт массива из ячейки, адрес которой хранится в регистре Z, в регистр tm, затем адрес, хранящийся в регистре Z, увеличивается на единицу. Теперь Z указывает на следующий элемент массива.

2. Элемент массива выводится на шину данных через порт В (команда out PORTBjm).

3. После задержки (команды пор) на линии WR устанавливается НИЗКИЙ уровень командой сЫ PORTC, Wr. Информация, установленная на шине данных, записывается в ячейку внешней памяти, адрес которой бьш установлен при выполнении подпрограммы SetAddr

4. После задержки (команды пор) на линии WR устанавливается ВЫСОКИЙ уровень командой sbi PORTC, Wn Копирование байта данных во внешнюю память завершено.

5. Выполняется возврат из подпрограммы.

Выполните один раз пошаговую отладку подпрограммы DataSt. Отладка цикла, в котором находится эта подпрограмма, не представляет интереса.

Отследить состояние внешней памяти с занесенным в нее массивом мы не сможем, так как наш вариант подключения внешней памяти к микроконтроллеру не предусмотрен стимулятором AVR Studio.

По этой же причине мы не сможем полностью провести отладку копирования массива из внешней памяти во внутреннее ОЗУ микроконтроллера. Однако можно воспользоваться приемами, которые предлагались в предшествующем примере: отразить массив в области внутреннего ОЗУ специально для отладки или после команды ввода в порт информации с пшны данных вводить эти данные в порт вручную.

Воспользуемся вторым приемом при отладке подпрограммы копирования данных из внешней памяти во внутреннее ОЗУ микроконтроллера DataLD.

Переместите курсор на команду rcall DoutPrp и нажмите Ctrl + F10.

Первая пара команд подпрограммы загружает в регистр Z адрес новой области внутреннего ОЗУ микроконтроллера для массива, копируемого из внешней памяти. Далее выполняется команда загрузки счетчика циклов, затем цикл, начинающийся меткой Doutl:.

Цикл не отличается от ранее рассматривавшихся циклов. Подпрограмма SetAddr рассматривалась ранее. Поэтому, доходя до команды вызова этой подпрограммы, нажимайте клавишу ЕЮ, чтобы выполнить подпрограмму за один шаг.

В результате выполнения подпрограммы SetAddr адрес сформирован на линиях адреса внешней памяти.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 [ 29 ] 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93


0.0086