
ЭВМ и системы / MP51 / Method / L2_M51
.doc
Лабораторная работа №2
Исследование асинхронного обмена с внешними устройствами.
Внешние прерывания.
1. Краткие сведения.
В процессорах семейства 8051 не предусмотрено таких механизмов управления вводом и выводом информации , как состояния ожидания (WAIT-STATE) или непосредственный доступ к памяти. Это не существенно при работе с устройствами "постоянно готовыми" то есть такими, который могут принимать информацию с портов процессора (или выдавать информацию на них) в произвольный момент времени. Однако если процессор и внешние устройства работают асинхронно необходимо предусматривать средства взаимного оповещения абоненто
в о готовности к обмену.
Возможно использование следующих способов взаимного оповещения
Периодическая проверка готовности данных
Программные петли ожидания готовности данных
Использование прерываний.
В любом случае периферийное устройство для оповещения процессора о своей готовности принять или выдать данные подает на один из внешних контактов процессора активный уровень.
В первом варианте в программу включают несколько команд анализа определенного бита ( или битов ) входных портов. Эти команды распределяют по программе так, чтобы они исполнялись с интервалом не меньшим некоторого заданного, гарантирующего отсутствие пропуска данных. Если на соответствующих входах обнаруживается изменение сигнала, выполняется переход на программу обработки ( или подготовки) новых данных.
Во втором варианте в том месте программы, где требуются новые данные, размещается последовательность команд:
- считывание признака готовности ( например MOV C,bit )
- условный переход на первую из этих команд, если обнаружена неготовность.
Таким способом можно проверять как выделенные биты портов ввода/вывода, так и состояния некоторых внутренних регистров, связанных с асинхронными процессами, например бит переполнения таймера, бит готовности последовательного порта.
Если используется вызов подпрограммы обработки данных по прерываниям, то для оповещения процессора о необходимости выполнить программу подготовки и выдачи данных ( либо приема и обработки новых данных) используются линии INT0 или INT1 ( Второй или третий биты порта P3 соответственно).
Для управления режимом обслуживания прерываний служит прерываниями в микроконтроллере служат регистр масок прерываний IE и регистр приоритетов IP, состояние которого изменяется программно либо целиком, либо за счет селективной установки или сброса отдельных разрядов. Если старший бит регистра IE ( IE.7) установлен в нулевое состояния заблокированы любые прерывания. В противном случае прерывания от конкретного источников запросов разрешены, если установлен в единицу соответствующий разряд регистра
IE и заблокированы, если в этом разряде ноль. Внешние прерывания управляются IE0 для прерывания по входу INT0, и IE2 для прерываний по входу INT1. Прочие прерывания и вопросы управления приоритетами обсуждаются в описании следующей работы. если ITx
Биты IT1 и IT0 ( находящиеся в регистре TCON в позициях TCON.2 и TCON.0 соответственно) задают тип прерываний. Они устанавливаются программно, и =1, то запрос инициируется по спаду сигнала на входе INTx. В противном случае запрос существует пока на входе INTx присутствует низкий уровень. В последнем случае, если на момент окончания обслуживания на входе попрежнему сохраняется низкий уровень, прерывание возникает повторно. В любом случае фронт сигнала INTx устанавливает бит IEx ( IE1 и IE0 находятся TCON
в позициях TCON.3 и TCON.1 соответственно) состояние которого который может опрашиваться программно, например для организации программных циклов ожидания. Бит IЕx автоматически сбрасывается при запуске программы обслуживания связанного с ним прерывания
Если обнаружен запрос INT1 или INT0 ( спад или низкий уровень сигнала в зависимости от настройки), и прерывания от этого входа разрешены, то процессор по окончанию текущего программного цикла записывает в стек адрес следующей команды прерываемой программы, после чего загружает на счетчик адреса команд адрес начала программы обслуживания прерываний. Важно отметить, что в микроконтроллерах семейства 8051 для программ обслуживания зафиксированы постоянные начальные адреса. Так программа, вызываемые по
запросу INT0 должны начинаться с адреса 0003, а вызываемые по INT1 - с адреса 0013Н. Если в системе возможно обслуживание нескольких прерываний, то программы обслуживания должны "обходить" участки программной памяти, зафиксированные как начальные участки программ обслуживания других прерываний ( используется команда JMP). Всякая программа обслуживания прерываний должна оканчиваться командой RETI (возврат из прерываний) Это команда не только восстанавливает из стека состояние счетчика команд, соответ
ствующее моменту начала обслуживания прерываний ( как и команда возврата из подпрограмм RET), но и разрешает прерывания равного и низших приоритетов .
Прерывающая программа и прерываемая обычно используют аккумулятор и регистр слова состояния программы (PSW). Для того, чтобы запомнить PSW на время обслуживания прерываний, следует в начале программы обслуживания исполнить команду сохранения слова состояния программы в стеке микроконтроллера( PUSH PSW). Для засылки в стек аккумулятора специальной команды в системе команд микроконтроллера не предусмотрено. Поэтому аккумулятор следует сохранять в одном из неиспользуемых общих регистров. Вн
утри вызванной подпрограммы рекомендуется установить новый регистровый банк, используя установку или обнуление битов выбора банка ( напр. SETB RS0, CLRB RS1). Тогда головная программа и подпрограмма под одинаковыми логическими именами регистров "подразумевают" различные физические ячейки памяти. Такой подход освобождает программиста от проблем защиты регистровой памяти при обслуживании прерываний.
2. Индивидуальные задания
Разрабатываемая программа должна содержать главную программу, выполняемую при отсутствии запросов на прерывание, и программу обслуживания внешних прерываний.
Главная программа реализует те же функции обработки, которые реализовала программа, отлаженная обучающимся в лабораторной работе №1. Отличие заключается в том, что добавляются операции готовности входных данных. В зависимости от варианта задания для анализа готовности данных следует использовать либо включение оператора проверки в некоторую последовательность безусловно выполняемых операторов (вариант "а") либо использовать программную петлю ожидания. (вариант "б").
В варианте "a" программа строится в форме бесконечно повторяемого цикла, который моделирует последовательность операций, выполняемых независимо от ситуации на периферии ( можно использовать последовательность простых регистровых операций, например CLR A ), между которыми вставлен фрагмент контроля готовности данных и вызов подпрограммы обработки данных
Рекомендуемая структура главной программы для варианта "a':
rep: CLR A операторы, моделирующие фоновую задачу
CLR A
CLR A
MOV C, P2.7 ; в данном примере признак готовности - ноль
JNC pass ; в старшем бите порта P2
CALL SUBR ; SUBR - метка подпрограммы обработки
pass: JMP rep
..
В варианте "б" программа по структуре совпадает с программой реализованной в работе 1 с тем, что перед командой считывания данных с порта следует поместить программную петлю ожидания.
Подвариант задания определяет признак готовности. В подвариантах oтмеченных цифрой "1" готовность определена состоянием старшего бита порта, через который осуществляется обмен. В подвариантах, отмеченных цифрой 2, признаком готовности считается любое изменение данных на входе.
Подпрограмма обслуживания прерываний должна при каждом вызове изменить кодовую комбинацию на одном из портов по алгоритму, приведенному в таблице заданий.
Не забудьте в главной программе предусмотреть операции разрешения используемых внешних прерываний.
№ |
Вариант обмена в uлавной программе |
Операция реализуемая в прерывающей программе
|
1 |
а1 |
Выдается код, содержащий только одну единицу. причем в каждом последующем вызове эта единицасдвигается на один разряд влево |
2 |
а2 |
При первом обращении выдается нулевой код, при каждом последующем - значение, отличающееся от предыдущего на +5 |
3 |
б1 |
В начале выдается код "все единицы"; при каждом следующем обращении разряды 3 и 6 меняются на противоположные, остальные разряды сохраняются |
4 |
б2 |
В начале исполнения выжается нулевой код. При каждом следующем вызове к педыдущему значению прибавляется +3 а результат инвертируется |
5 |
а2 |
В начале выдается код "все нули"; при каждом следующем обращении разряды 3 и 6 меняются на противоположные |
6 |
б1 |
В начале выдается код "все нули"; при каждом следующем обращении к предудушему значению прибавляется +7 и разряды 3 и 6 меняются на
|
3. Порядок выполнения работы.
3.1. Вызвать систему отладки, ввести, откомпилировать и линкировать подготовленную программу в порядке, определенном в предыдущей работе.
3.2. Приготовить файлы моделирования последовательности данных обрабатываемых главной программой и файл моделирования запросов на прерывания. При соcтавлении текста этих файла следует учесть, что в данной работе предусматривается изменение входных данных независимо от микроконтроллера через выбранное в эксперименте модельное время, измеряемое в машинных тактах. Поэтому в тексте описания последовательности данных для главной программой в подвариантов "1" следует после каждых "действительных" данных
записать несколько раз комбинацию FF, с тем чтобы очередное слово для обработки вместе с признаком готовности появилось через время, достаточное для завершения процесса обработки. Время смены кодов должно устанавливаться таким , чтобы признак готовности данных присутствовал не менее, чем время между двумя последовательными опросами порта. Подобно при описании последовательности, поступающей на вход прерываний, следует после формирования каждого "импульса" запроса вставить несколько кодов FF, так чтобы следующий запрос появился не раньше окончания программы обслуживания прерываний.
3.3. Выполнить преобразования файлов моделирования входных воздействий в форму представления, принятую. в моделировщике. Для этого вызвать п. меню "ввод/вывод" и подменю "преобразование входного файла". После объявления имени преобразуемого файла автоматически выполняется преобразование ( создается файл с именем, совпадающий с именем исходного файла данных и расширением "аb" , формат которого соответствует принятому в системе моделирования).
3.4. Запустить программу моделирования ( пункт "Запуск" меню "Симуляция" ). Выбрать версию микроконтроллера ( рекомендуется выбрать вариант В).
3.5. Выполнить загрузку и начальную прокрутку программы в режиме автоматического создания командного файла отладчика. Рекомендуется выполнить пункт 3.12 в следующем порядке:
a. перейти в командное окно симулятора и выбрать пункт "COMMAND FILE" и подпункт "OPEN";
б. на запрос "OPEN FILE NAME" задать имя командного файла, в котором будет сохраняться последовательность действий.
в. выполнить типовую последовательность действий: В данной работе рекомендуется выполнить п.п. 3.6 - 3. 9.
г. закрыть командный файл: перейти в командное окно симулятора и выбрать пункт "COMMAND FILE" и подпункт "close".
3.6. Ввести подготовленную программу в моделировщик. Для этого
а. Последовательно выбрать в командном окне симулятора (перемещая курсор стрелками) пункты "Load" и "programm". Исполнение действия инициируется клавишей "Enter".
б. В строку "Enter file name" вписать имя исполняемой программы (имеет имя, совпадающее с именем исходной программы и расширение ".hex".
3.7. "Подключить источники входных сигналов" к портам микроконтроллера. Для подключения каждого из источников следует:
а. Выбрать пункт " IO" главного меню симулятора
б. выбрать функцию "Open" подменю
в. На запрос "IO input file" Задать имя файла входных данных в строке "Enter file name" ( имя определено в п.3.5)
г. на возникший запрос "reply file after EOF" ( повтор входной последовательности после окончания) выбрать "YES"
д. на запрос "IO output file" нажать "Enter" ( временный отказ)
е. на запрос "IO Trigger" ( cпособ синхронизации) выбрать "Cycles" ( задает изменение входа c через заданное число машинных циклов микроконтроллера) и на последующий запрос "IO RATE" задать период изменения входного кода исходя из параметров, принятых при подготовке этого файла.
ж. на запрос "IO Transfer" определить формат входных данных (выбрать mapByte) и затем задать в качестве адреса для ввода логическое имя того порта, с которого в Вашей программе предполагается считывание данных ( например Р1).
3.8. Задать имя файла для регистрации выходных данных:
а. Выбрать пункт " IO" главного меню симулятора
б. выбрать функцию "Open" подменю
в. на запрос "IO input file" нажать "Enter" ( временный отказ)
г. на запрос "IO output file" Задать имя файла входных данных в строке ""Enter file name" ( имя произвольно, расширение ".ah")
е. на запрос "IO Trigger" ( способ синхронизации) выбрать "Opcode access" ( задает запись состояния выбранного порта в файл вывода после обращения микроконтроллера к порту).
ж. на запрос "IO Transfer" задать в качестве адреса для вывода логическое имя того порта, на который в Вашей программе предполагается вывод данных ( например Р3).
3.9. Установить на программном счетчике ( РС окна отображения) начальный адрес введенной программы. Переход из командного окна симулятора в окно отображения и обратно осуществляется нажатием клавиши "ESC", а перемещение внутри окна отображения - стрелками.
3.10. Выполнить один цикл программы в пошаговом режиме: одна команда исполняется по нажатию клавиши F10. Наблюдать изменения состояния регистров и портов. Убедиться в правильности исполнения алгоритма.
3.11. Если при выполнении п 3.10 обнаружены ошибки повторить пп 3.1 и запустить симулятор под управлением командного файла. для этого:
а. Окне системы отладки "симулятор" выбрать пункт "Командный файл" и ввести его имя ( должно совпадать с определенным в п 3.13.б ).
б. Выполнить запуск симулятора. Все действия по п.п. 3.7-3.10 выполнятся автоматически.
3.12. Продолжить отладку программы в автоматическом режиме с точками останова. При этом клавишами F2 и F4 курсор -указатель точки останова перемещается вдоль окна текста программы вверх или вниз. Точка останова фиксируется нажатием клавиши F3. Выполнить несколько циклов. разместив точку останова на одном из последних операторов в цикле и в каждой из подпрограмм. Наблюдая состояния регистров и портов, убедится в правильности выполнения программы.
3.13. Если обнаружены ошибки выполнить повторно п.п 3.1, 3.11 и. 3.12.
.