Выбрать главу

• старший байт адреса выводится на шину данных В0…В7 через порт В (команда out PORTB,ХН);

• после задержки на линии BUF2 устанавливаегся высокий уровень (команда sbi PORTD,BUF2), по которому в регистр DD3 записывается информация, установленная на шине данных;

• после задержки (две команды пор) на линии BUF2 устанавливается низкий уровень (команда cbi PORTD,BUF2), завершая запись в регистр DD3;

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

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

В регистре ввода-вывода PORTC хранится то, что программа вывела в порт, в регистре ввода — вывода PINC — то, что присутствует на контактах порта (так в PORTC можно вывести байт 11111111, контакты микроконтроллера РСО и РС2 соединить с общим проводом, тогда состояние PORTC останется без изменений, состояние PINC станет равным 11111010). Для команд типа out PORTC,tm в окне Ю информация появляется сначала в строке Port С Data (PORTC), а после выполнения следующей команды — в строке Input pins (PINC).

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

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

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

• элемент массива выводится на шину данных через порт В (команда out PORTB,tm);

• после задержки (команды пор) на линии WR устанавливается низкий уровень (команда cbi PORTC,Wr), информация, установленная на шине данных, записывается в ячейку внешней памяти, адрес которой был определен при выполнении подпрограммы SetAddr;

• после задержки (команды пор) на линии WR устанавливается высокий уровень (команда sbi PORTC,Wr), копирование байта данных во внешнюю память завершено;

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

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

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

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

• отразить массив в области внутреннего ОЗУ специально для отладки;

• или после команды ввода в порт информации с шины данных вводить эти данные в порт вручную.

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

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

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

Далее выполняется команда загрузки счетчика циклов, затем цикл, начинающийся меткой Dout1:.

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

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

Подпрограмма копирования данных из внешней памяти во внутреннее ОЗУ DataLd.

В порт DDRB выводится нулевое значение, переводящее порт В на прием информации (все контакты порта В работают как входы).

На линии RD устанавливается низкий уровень (команда cbi PORTC,Rd), поэтому из ячейки внешней памяти, адрес которой сформирован при выполнении подпрограммы SetAddr, на шину данных выводится информационный байт.

После задержки (команды пор) через порт В с шины данных в регистр микроконтроллера tm считывается байт информации (команда in tm, PINB).