Уральский государственный технический университет -УПИ Кафедра экспериментальной физики Методические указания к практическим занятиям «Взаимодействие двух стендов SDK1.1 через последовательный интерфейс» курс: Цифровые и микропроцессорные устройства Составил: доцент Хохлов К.О. Екатеринбург 2007 Содержание: Введение .........................................................................................................................................3 1. Блок-схема программы .............................................................................................................4 2. Текст программы. ......................................................................................................................5 2.1 Блок инициализации INIT...................................................................................................5 2.2 Основная часть программы (блок main). ...........................................................................6 Вывод ..............................................................................................................................................8 Приложение....................................................................................................................................9 2 Введение В качестве задания на практическое занятие было предложено написать программу вывода кода нажатой клавиши на одном стенде на жидкокристаллический дисплей (ЖКИ) другого учебного стенда, используя внешний параллельный порт ввода-вывода в качестве последовательного интерфейса. Задача состоит в обеспечении взаимодействия двух микроконтроллеров ADuC812 (ADuC842) учебных стендов SDK1.1 через последовательный интерфейс, а именно, в приеме байта кода нажатой клавиши через внешний параллельный порт и вывод данного байта на ЖКИ. 3 1. Блок-схема программы Начало Блок инициализации init Основной блок main Запрет всех прерываний Считывание с d1 Загрузка бита в регистр Счетчик прерываний Вывод байта на ЖКИ Разрешение прерываний Конец 4 2. Текст программы. Для организации приема байта будем использовать внешний параллельный порт ввода-вывода, точнее его первые два бита d0 и d1. В качестве передачи (приема) сигнала синхронизации будет выступать бит d0, а в качестве самой линии передачи данных бит d1. Нам понадобятся следующие значения: Регистр EXT_LO (младший байт внешнего порта ввода-вывода) имеет адрес 080002h; 2.1 Блок инициализации INIT В этом блоке задаются значения регистров r1 и EXT_LO. init: mov r1,#00h; mov ro,#04h; call putbyte Регистр R1 будет использоваться как счетчик полученных битов и для определения приема байта, изначально регистр обнулим: R1 ← 00000000b (или 00h); Для ввода данных через внешний порт ввода-вывода (используем младший байт) установим бит ENA.0, который имеет адрес 04h, в состояние логического нуля, при этом использовали подпрограмму putbyte. 5 2.2 Основная часть программы (блок main). main: clr load: clr mov call jnb setC: jb jnb clr mov rlc mov inc jb setb call EA; запрет всех прерываний; A; очистили аккумулятор; ro,#02h; загрузили в регистр адрес регистра EXT_LO; inbyte; загрузили байт с внешнего порта в аккумулятор; acc.0, load acc.1,set1; начало цикла определения значения принимаемого бита; acc.1,set0; A; A,B; регистр В используется в качестве промежуточного буфера; A; сдвиг аккумулятора влево через перенос для формирования принимаемого байта; B,A; пересылка в регистр В из аккумулятора; r1; инкремент регистра r1, значение в регистре показывает номер загружаемого бита; r1.3,putchar; при загрузке восьмого бита (т.е. сформированного байта) выполняется вывод полного принятого байта на ЖКИ; EA; разрешение прерываний main; вызов подпрограммы main; setb C; установка бита переноса в логическую единицу «1»; ret set0: clr C; установка бита переноса в логический ноль «0»; ret Подпрограмма putchar выводит на ЖКИ байт, находящийся в аккумуляторе А. set1: putchar: mov push anl push push mov mov movx clr mov mov mov clr movx setb movx clr movx pop pop pop retI A,B; psw psw,#11100111b; 0h; dpp dpp,#08d; r0,#DATA_IND; @r0,A; RW; c,RS; acc.2,c; r0,#C_IND; E; @r0,A; E; @r0,A; E; @r0,A; dpp 0h ; psw 6 Подпрограммы putbyte и inbyte являются вспомогательными, они используются для работы с регистрами и обращению к внешней памяти и внешним устройствам. putbyte: push mov movx pop ret dpp; dpp,#08d; @r0,A; dpp; inbyte: push mov movx pop ret end dpp; dpp,#08d; A,@r0; dpp; Полный текст программы приведен в приложении. 7 Вывод Написана программа приема байта данных через внешний порт ввода-вывода (использовались биты d0 и d1) и отображении этого байта на ЖКИ. В ходе написания программы были закреплены знания по устройству стенда SDK1.1 (микроконтроллеры ADuC841 и ADuC842), а именно: устройство памяти стенда; форматы и способы адресации команд; команды пересылки и побитовой обработки информации; регистры специальных функций и система прерываний; 8 Приложение Программа, которая осуществляет прием байта через внешний порт вводавывода и отображает код нажатой клавиши (на первом стенде) на ЖКИ: .CODE .ORG jmp .ORG init: mov mov mov mov call 0000h; init; 0100h; R1,#00h; B,00h; A,00h; ro,#04h; putbyte main: clr load: clr mov call jnb setC: jb jnb clr mov rlc mov inc jb setb call EA; A; ro,#02h; inbyte acc.0, load acc.1,set1 acc.1,set0 A; A,B; A; B,A; r1; r1.3,putchar EA; main set1: C; set0: setb ret clr ret C; putchar: DATA_IND xdata 01h ; C_IND xdata 06h ; E BIT acc.0 RW BIT acc.1 RS BIT F0 mov A,B; push psw anl psw,#11100111b; push 0h; push dpp mov dpp,#08d; mov r0,#DATA_IND; movx @r0,A; clr RW; mov c,RS; 9 mov mov clr movx setb movx clr movx pop pop pop retI acc.2,c; r0,#C_IND; E; @r0,A; E; @r0,A; E; @r0,A; dpp 0h ; psw putbyte: push mov movx pop ret dpp; dpp,#08d; @r0,A; dpp; inbyte: push mov movx pop ret end dpp; dpp,#08d; A,@r0; dpp; 10