Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы 27-38.doc
Скачиваний:
58
Добавлен:
23.04.2019
Размер:
69.12 Кб
Скачать

31. Подпрограммы и процедуры. Виды подпрограммы. Вызов подпрограмм. Примеры.

Обращение к подпрограммам на языке Ассемблера организуется путём использования специальных команд CALL и RET

Структура программы (в адресном пространстве процессора)

0800 …

0801 …

0802 …

0803 CALL 0850

0850 08

0851 03

0870 RET

Виды подпрограмм: процедуры и функции (по наличию возвращаемого значения)

Пример программы с использованием подпрограмм:

mvi b, 04

mvi c, 02

CAL Label – первый вызов подпрограммы

mvi b, 0F

mvi c, 05

CAL Label – повторный вызов подпрограммы

Label:add b //

dcr c //

jz end // - подпрограмма

jmp label //

end: RET //

32. Примеры программирования современных микропроцессоров.

Пример №1 - программирования контроллера ATmega16 фирмы ATmel на языке C

OCR1AL = 255; - параметры ШИМ

OCR2 = 255; - параметры ШИМ

while (1) – основной цикл

{if (PINA == 0)

{PORTB.1 = 0;} – управление светодиодом, подключённым к 1ой ножке порта B

else

{ if (PINA == 1)

{ PORTB.1 = 1; } } – управление светодиодом

delay_ms(1); };- задержка

Пример №2 - программирования контроллера на ассемблере (вывод информации на 9сегментный индикатор)

mvi a, 20 out 07 – читать подряд

mvi a, B0 out 06

mvi a, 10 out 07

mvi a, 86 out 06

mvi a, 08 out 07

mvi a, 70 out 06

mvi a, 04 out 07

mvi a, 66 out 06

RST1

33. Программирование ввода-вывода.

IN port - данные из порта с указанным номером считываются в аккумулятор. Циклов 3. Флаги не изменяются.

OUT port - содержимое аккумулятора помещается на шину данных для записи в указанный в команде порт.

Программирование вывода – см. вопрос 32, пример №2

Ввод данных может осуществляться из внешних устройств с использованием портов МК, через специальные интерфейсы, например UART. Ввод аналоговых данных может производиться через АЦП. Программирование ввода данных заключается в получении и обработке данных от внешних источников. Простейший пример программирования ввода данных – запоминание комбинации 0 и 1 на порту МК, реализованном как входной. Одним из важных средств организации ввода данных является механизм прерываний.

Пример программирования ввода/вывода для LPT порта

{mov edx, port mov al, data out dx, al} {mov edx, port in al, dx mov al,data}

35. Примеры программирования ввода-вывода.

См. вопрос 33.

36. Регенерация динамической памяти.

Запоминающая ячейка динамического типа хранит информацию в виде заряда емкости. Ток утечки обратно смещенного p-n перехода составляет не более 10-10 A (0,1 нA), а емкость - 0,1..0,2 пФ, следовательно постоянная времени разряда - более 1 мС. Поэтому через каждые 1..2 мС требуется производить подзаряд емкостей запоминающих элементов - регенерацию динамической памяти.

В динамических ОЗУ чаще используется т.н. "строчная регенерация", при которой в одном цикле регенерируются все элементы, расположенные в одной строке прямоугольной матрицы накопителя. Следует отметить, что любое обращение к запоминающей ячейке (запись или чтение) осуществляет ее регенерацию и одновременно регенерирует все ячейки, расположенные в той же строке накопителя.

Однако, при работе ОЗУ в составе МПС в общем случае нельзя дать гарантию, что в течение 2мС произойдет обращение ко всем строкам накопителя, т.к. поток адресов является случайным. Для обеспечения гарантированной сохранности информации в динамическом ОЗУ при работе МПС вводятся специальные циклы регенерации - обращения к ОЗУ по последовательным адресам строк.

В большинство динамических ОЗУ адрес ячейки подается за два приема : сначала - адрес строки, который запоминается во внутреннем регистре ОЗУ, потом по тем же линиям - адрес столбца. Каждая передаваемая по мультиплексированным линиям часть адреса сопровождается соответствующим управляющим сигналом (RAS, CAS).

Для регенерации накопителя достаточно провести обращение только к последовательным строкам - каждый цикл обращения для регенерации может состоять только из передачи адреса строки. Поэтому для полной регенерации накопителя объемом 16K (матрица 128  128) достаточно 128 тактов. Накопители большего объема реализуют на неквадратных матрицах, чтобы уменьшить число строк и сократить время регенерации. Так, накопитель объемом 64K имеет матрицу 128  512.