Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Kononov_zachet.doc
Скачиваний:
92
Добавлен:
26.03.2015
Размер:
2 Мб
Скачать
☆

Программные симуляторы.

Симулятор - программное средство, способное имитировать работу микроконтроллера и его памяти. Как правило, симулятор содержит в своем составе:

  • Отладчик;

  • Модель ЦПУ и памяти.

Более продвинутые симуляторы содержат в своем составе модели встроенных периферийных устройств, таких, как таймеры, порты, АЦП, системы прерываний.

Симулятор должен уметь загружать файлы программ во всех популярных форматах, максимально полно отображать информацию о состоянии ресурсов симулируемого микроконтроллера, а также предоставлять возможности по симуляции выполнения загруженной программы в различных режимах. В процессе отладки модель «выполняет» программу, и на экране компьютера отображается текущее состояние модели.

Платы развития, или как принято их называть в зарубежной литературе - оценочные платы (Evaluation Boards), являются своеобразными конструкторами для макетирования прикладных систем.В последнее время, при выпуске новой модели кристалла микроконтроллера, фирма-производитель обязательно выпускает и соответствующую плату развития. Обычно это печатная плата с установленным на ней микроконтроллером, плюс вся необходимая ему стандартная обвязка. На этой плате также устанавливают схемы связи с внешним компьютером. Как правило, там же имеется свободное поле для монтажа прикладных схем пользователя. Иногда имеется уже готовая разводка для установки дополнительных устройств, рекомендуемых фирмой. Например, ПЗУ, ОЗУ, ЖКИ-дисплей, клавиатура, АЦП и др. Кроме учебных или макетных целей, такие доработанные пользователем платы стало выгодно (экономия времени) использовать в качестве одноплатных контроллеров, встраиваемых в мало серийную продукцию (5..20 шт.).

Отладочный монитор - специальная программа, загружаемая в память отлаживаемой системы. Она вынуждает процессор пользователя производить, кроме прикладной задачи, еще и отладочные функции:

  • Загрузку прикладных кодов пользователя в свободную от монитора память;

  • Установку точек останова;

  • Запуск и останов загруженной программы в реальном времени;

  • Проход программы пользователя по шагам (часть функций трассировщика);

  • Просмотр, редактирование содержимого памяти и управляющих регистров.

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

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

Вопрос #33 – “ Типовая структура управляющей микро-ЭВМ”

В состав простейшей микро-ЭВМ входят: процессор, ОЗУ, ПЗУ, порты ввода/вывода, дешифраторы, осуществляющие выбор запоминающего устройства и порта ввода/вывода. Архитектура простейшей микро-ЭВМ:

Общая магистраль представлена совокупностью трех специализированных шин: данных, адреса и управления. Шина данных (ШД) –двунаправленная шина для обрабатываемых данных и машинных кодов команд (между устройствами ЭВМ). Однонаправленная шина адреса (ША) несет адрес ячейки памяти или порта ввода/вывода, который взаимодействует с микропроцессором. Шина управления - сигналы управления, обеспечивающие взаимодействие блоков микро–ЭВМ. Сигнал RESET – приводит микро-ЭВМ в исходное стартовое состояние. Центральный процессор (ЦП) микро-ЭВМ это микропроцессор (МП). Этот модуль содержит также: разного рода вспомогательные устройства, обеспечивающие работу микропроцессора и его связь с магистралью. Центральный процессор, ОЗУ, ПЗУ и порты имеют выходы данных с тремя состояниями или открытым коллектором, поэтому могут отключаться от шины данных. Дешифратор выбора ЗУ генерирует сигнал выбора соответствующего блока памяти (), анализируя старшие биты адреса ячейки памяти, выставленного микропроцессором на шине адреса. Дешифратор выбора порта генерирует сигнал выбора соответствующего порта (), анализируя адрес порта, выставленный микропроцессором на шине адреса. Представленная схема не предусматривает прямого обмена между портами и памятью (прямой доступ к памяти - ПДП), а также возможности прерывать выполнение основной программы для обслуживания внешних запросов, для этого требуется контроллер ПДП и контроллер прерываний.

Задача #1– “Подсчет числа импульсов”

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

 

Для простоты реализации программы считаем, что общее количество деталей не превышает 99 :

По окончании выполнения процедуры в аккумуляторе фиксируется число деталей, представленное в двоично-десятичном коде.

В аккумуляторе фиксируется чело деталей, представленное в двоичном коде (максимальное количество деталей 255) .

;версия для МК51

MOV TMOD,#01000000B ;настройка счетчика 1

MOV TH1,#0 ;сброс счетчика деталей

WAITO: JB P3.4,WAITO ;ожидание включения конвейера

SETB TCON.6 ;пуск счетчика 1

WAIT1: JNB P3.4,WAIT1 ;ожидание выключения конвейера

CLR TCON.6 ;останов счетчика 1

MOV A,TH1 ;(аккумулятор) <---число деталей

EXIT: ... ;выход из процедуры

 

Подсчет числа импульсов за заданный промежуток времени. При решении задачи преобразования число-импульсного кода в двоичный код, а также в ряде других задач может возникнуть необходимость подсчета числа импульсов за заданный интервал времени. Эта процедура может быть реализована тремя различными способами:

  • программной реализацией временного интервала и программным подсчетом числа импульсов на входе МК;

  • программной реализацией временного интервала и аппаратурным подсчетом числа импульсов (на внутреннем таймере/счетчике) ;

  • аппаратурной реализацией временного интервала и программным подсчетом числа импульсов.

Для МК51, имеющего в своем составе два таймера/счетчика, возможен четвертый способ: аппаратурная реализация временного интервала с аппаратурным подсчетом числа импульсов.

Четвертый (полностью аппаратурный) способ подсчета числа импульсов требует использования двух аппаратурных счетчиков и поэтому возможен лишь для МК51. На Т/С1 можно выполнять подсчет числа импульсов, а на Т/С0 отсчет заданного интервала. Датчик импульсов должен быть подключен к входу Т1 :

;версия для МК51

TIME EQU NOT(10000)+1 ;определение константы TIME для отсчета

;интервала 10 мс

MOV TMOD, #01010001B ;настройка т/с, 16 бит. 1 - счетчик

;0 - таймер

CLR A ;сброс аккумулятора

MOV TH1, A ;сброс т/с1

MOV TL1, A

MOV TH0, #HIGH(TIME) ;загрузка в т/с0

MOV TL0, #LOW(TIME) ;константы TIME

ORL TCON, #50H ;пуск т/с1 и т/с0

WAIT: JBC TCON.5, EXIT ;проверка переполнения т/с0

SJMP WAIT ;цикл,если TF=0

EXIT: MOV B, TH1 ;(В) (А) <---число импульсов за 10 мс

MOV A, TL1

... ;выход из процедуры

; Программа счетчик импульсов

DSEG

counter EQU 30h

CSEG

org 200

clr P1.1

mov counter,#0h

C1: jnb P1.1, C1

inc counter

mov A, counter

jnz C2

inc (counter+1)

C2: jb P1.1, C2

jmp C1

END;

Задача #2 – “Программная генерация ШИМ”

; Период = 250 мкс

; Длительность = 100 мкс

; Выходной сигнал подается на P1.0

MOV TMOD, #0 ; Т/С0 и Т/С1 – 8-и разрядные таймеры

START: MOV TH0, #(NOT(250)+1) ; Период отслеживает Т/С0

MOV TH1, #(NOT(100)+1) ; Длительность Т/С1

SETB P1.0 ; Начало сигнала

MOV TCON, #1010000B ; Старт таймеров

TAU: JNB TCON.7, TAU ; Ожидаем переполнение Т/С1

CLR P1.0 ; Спад сигнала

T: JNB TCON.5, T ; Ожидаем переполнение Т/С0

XRL TCON, TCON ; Остановка таймеров

SJMP START ; Генерируем новый импульс

Задача #3 – “Измерение длительности импульсов без прерываний”

; Подсчет длительности импульса в P1.0 (длительность импульса не превышает 125 мс)

XRL TH0, TH0 ; Очистка регистра TH0

XRL TL0, TL0 ; Очистка регистра TL0

XRL P0, P0 ; Очистка выходного порта

MOV TMOD, #1 ; Таймер / счетчик 0 – 16-и разрядный таймер

IMP_BEGIN: JNB P1.0, IMP_BEGIN ; Ожидание появления импульса

SETB TCON.4 ; Активация таймера

IMP_END: JB P1.0, IMP_ END ; Ожидание окончания импульса

CLR TCON.4 ; Остановка таймера

; В паре регистров TH0: TL0 сохранена длительность импульса

Задача #5 – “ Программная генерация ЧИМ ”

Порт P0 - порт задания длительности Т(периода следования). P1.1 формирует сигнал. Длительность самого импульса - TAY = 50мкс.

MOV TMOD, #0 //установка режима работы таймеров: T/C0 и T/C1 как 8-рязрядные таймеры

START: MOV THO, #NOT((50)+1) //запись в доп.коде TAY

MOV TH1, P0 //запись в доп.коде T

SETB R1.1 //установка бита P1.1 в 1

MOV TCON, #1010000B //запуск таймеров

WAIT1: JNB TCON.5, WAIT1 //отсчет 50мкс

CLR P1.1 //сброс бита P1.1 в 0

WAIT2: JNB TCON.7, WAIT2 //отсчет T

XRL TCON, TCON //очистка TCON

SJMP START //переход в начало

Задача #6 – “Измерение длительности импульсов без прерываний”

MOV IE, #128 // отменяем все прерывания

MOV TMOD, #1 //Т0 – как 16-разрядный таймер

XRL TH0, TH0 // сбрасываем значение старшего байта Т0

XRL TL0, TL0 // сбрасываем значение младшего байта Т0

WAIT_1: JNB P0.0, WAIT_1; // ждем начала импульса

MOV TCON, #16 // запускаем таймер

WAIT_0: JNB P1.0, END; // ждем конца импульса

JNB TCON.5, WAIT_0: // проверяем флаг переполнения

CLR TCON.5 // сбрасываем флаг переполнения

SJMP END; // считаем, что импульс не пришел и передача закончена

END: XRL TCON, TCON // остановили таймер

Задача #8 – “Измерение периода следования импульсов с прерываниями”

11h = 00010001b – конец импульса

21h = 00100001b – начало импульса

DSEG

P_W EQU 30h

CAPTRE EQU 32h // сохранить первое значение времени

FLAG BIT 00h // привязывает следующую команду жестко к памяти

CSEG

ORG 0000h

AJMP MAIN

ORG 0033h

AJMP PCA_IR0

ORG 0100h

MAIN: // настройка и запуск

MOV CMOD, #00h; // WDTE =0 clock=fosc\12

MOV CL, #00h; // обнуляем регистр режима и счетчик

MOV CH, #00h;

MOV CCAPM0, #21h; // настроить модуль 0, разрешение прерывания (2 бита в 1: 0010 0001 – позитив + фиксация событий)

CLR FLAG;

SETB IE.6; // разрешить прерывание от PCA массива

SETB IE.7; // отключить блокировку прерываний

SETB CCON.6; // установить CR

ORG 0200h

НАЧАЛО

PCA_ISR:

CLR CCF0; // Флаг прерывания модуля 0. Сбрасывается программно.

JBC FLAG, SECOND; // Переходим на метку если бит установлен и сбрасываем его.

FIRST:

MOV CAPTURE, CCAP0L; // запись в CAPTURE значения времени из CCAP0L

MOV (CAPTURE+1), CCAP0H; // запись по адресу CAPTURE+1 значения CCAP0H (фиксируем время наступления)

SETB FLAG; // Flag = 1

RETI; // разрешение прерывания этого уровня

SECOND:

PUSH PSW;… // выталкивает из стека последнюю затолкнутую переменную ( сохранить признаки

PUSH ACC; // и значения результата)

CLR C; // очистка бита переноса

MOV A, CCAP0L; // запись в ACC значения времени из CCAP0L

SUBB A, CAPTURE; // Вычитание из A – CAPTURE -C Вычитаем младшие байты времени поступления двух событий

MOV P_W, A (Pulse_WIDTH)

MOV A, CCAP0H

SUBB A, (CAPTURE+1) // аналогично старшие байты

MOV (P_W +1), A

POP ACC; // закидывает значение в стек // чтоб не испортить текущих значений

POP PSW;

MOV CCAPM0, #21h; // (начало импульса); (

CLR FLAG;

RETI;

Задача #10 – “Измерение частоты следования импульсов без прерываний”

; Программа измерения частоты импульсов

; Считает число импульсов, пришедшее за 65535 мкс

DSEG

counter EQU 30h

CSEG

org 200

mov TMOD, #10101B ; 16 разрядный таймер Т1, 16 разрядный счетчик Т0 от внешнего сигнала

mov TH0, #0 ; Обнуление регистров T/C1 и T/C0

mov TL0,#0

mov TL1,#0

mov TH1,#0

setb TCON.4 ; Запуск обоих Т/С

setb TCON.6 ;

C1: jnb TCON.7 ,C1 ; Пока не переполнится таймер Т1

clr TF1

mov A,TH0

rrc A

mov (counter+1), A

mov A,TL0

rrc A

mov counter, A

END;

Задача #11 – “Измерение частоты следования импульсов с прерываниями”

; Программа измерения частоты импульсов

; Считает число импульсов, пришедшее за 65535 мкс

DSEG

counter EQU 30h

CSEG

org 200

mov TMOD, #10101B ; 16 разрядный таймер Т1, 16 разрядный счетчик Т0 от внешнего сигнала

mov TH0, #0 ; Обнуление регистров T/C1 и T/C0

mov TL0,#0

mov TL1,#0

mov TH1,#0

setb TCON.4 ; Запуск обоих Т/С

setb TCON.6 ;

C1: jnb TCON.7 ,C1 ; Пока не переполнится таймер Т1

clr TF1

mov A,TH0

rrc A

mov (counter+1), A

mov A,TL0

rrc A

mov counter, A

END;

Задача #12– “Синхронизация программ”

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

Синхронизация выполняется командой с двумя операндами, вторым из которых является рабочий объект. В команде устанавливается индикатор w. В исходном состоянии рабочий объект имеет тег wr. По сути дела к команде с синхронизацией обращаются дважды. Трасса, которая первая обращается к такой команде , записывает в рабочую ячейку результат. Запись разрешена, поскольку тег равен wr. После записи работа трассы завершается фиктивной командой stop. Тег рабочей ячейки становится равным rd. Трасса, выполняющая эту команду второй, завершает ее выполнение, поскольку присутствуют оба операнда. Операнд, полученный первым, очевидно, может быть прочтен, поскольку его тег – rd. Порядок операндов определяется кодом последней выполненной команды. Если это команда разветвления, то переданный ей операнд – второй. После выполнения команды синхронизации тег рабочей ячейки переходит в исходное состояние – wr. Рассмотрим пример. Допустим, что подвыражения в выражении

(M+N)*(P-10)

вычисляются разными трассами. Пусть первый процессор начинает считать с точки First, а второй с точки Second.

First rdv a no M

add a no N

fork a no Mlt

Second rdv a no P

sub l S 10

Mlt mult w no Wa

Задача #13 – “Аналого-цифровое преобразование с двойным интегрированием без прерываний”

BEGIN: MOV TH0, #0

MOV TL0, #0

MOV TMOD, #9h ; Установка бита GATE, режим работы 16 разрядный счетчик

SETB P1.0 ; Подача опорного напряжения

C1: JB P3.2, C1 ; Ждем отрицательного уровня

CLR P1.0 ; подача Uвх

SETB TCON.4 ; Запуск таймера 0

C2: JNB TCON.5, C2 ; Ждем пока пройдет интервал времени Т1 (переполнится таймер)

SETB P1.0 ; Подача опорного напряжения, начало обратного интегрирования

C3: JB P3.2, C3 ; Ожидание момента T2

CLR TCON.4 ; Останов таймера 0

CLR TCON.5 ; Сброс флага TF0

MOV B, TH0

MOV ACC, TL0 ; Сохранение результата преобразования

END;

Задача #14 – “Аналого-цифровое преобразование с двойным интегрированием с прерываниями”

; R0.0 – Флаг начала вычисления (1 – вычисления продолжаются)

ORG 0BH ; Начало обработчика прерывания Timer0

CALL TM0 ; Вызов подпрограммы обработки прерывания Timer0

RETI ; Возврат из прерывания

ORG 33H ; Начало программы

BEGIN: MOV TH0, #0

MOV TL0, #0

MOV TMOD, #9h ; Установка бита GATE, режим работы 16 разрядный счетчик

SETB ET0 ; Разрешение прерывания от Таймера0

SETB P1.0 ; Подача опорного напряжения

C1: JB P3.2, C1 ; Ждем отрицательного уровня

CLR P1.0 ; подача Uвх

SETB R0.0 ; Устанавливаем флаг начала вычисления

SETB TCON.4 ; Запуск таймера 0

L1: JB R0.0, L1 ; Ожидаем окончания вычислений

END;

…

TM0: NOP ; Начало подпрограммы обработки прерывания Timer0

CLR TF0 ; Очистка источника прерывания (сброс флага TF0)

CLR TCON.4 ; Останов таймера 0

SETB P1.0 ; Подача опорного напряжения, начало обратного интегрирования

C2: JB P3.2, C2 ; Ожидание момента T2

MOV B, TH0

MOV ACC, TL0 ; Сохранение результата преобразования

RET ; Выход из подпрограммы

Задача #15 – “Борьба с "дребезгом" контактов”

Задача #16 – “Борьба с "дребезгом" контактов”

Дребезг представляет собой многократное замыкание и размыкание цепи. В результате на вход микропроцессорного устройства поступает не единичный перепад напряжения, а целая пачка импульсов. Предположим, что сигнал приходит на бит 0 порта P1. А продолжительность "дребезга" меньше 200 мкс.

T1: JNB P1.0, T1 //ждем прихода импульса

CALL WAIT //делаем первую задержку

T2: JB P1.0, T2 // ждем окончания импульса

CALL WAIT //делаем вторую задержку

SJMP T1 // вначало программы

WAIT: MOV R2, #200 //инициализируем счетчик на 200 повторений

T3: DJNZ R2, T3 //повторяем пока R2 не станет равно 0

RET

Задача #19 – “Аналого-цифровое преобразование следящего типа.”

begin: mov R3,#10 ; искомая цифровая величина

loop: jb P2.0, decr

inc R3 ; увеличивается число, Uцап тоже увеличивается

mov P1, R3

jmp loop

decr: dec R3 ; c уменьшением R3 уменьшается Uцап

mov P1, R3

jmp loop

END;

Задача #20 – “Генерация ШИМ”

Генерации ШИМ импульсов с использованием модуля PCA.

Любой из пяти модулей может быть использован как генератор импульсов заданной скважности. Частота генерируемых импульсов непосредственно зависит от частоты сигналов на счетном входе РСА таймера-счетчика. При внешнем резонаторе 16МГц, максимальная возможная частота генерируемых импульсов будет 15.6КГц. В этом режиме происходит сравнение регистра CL (младший байт РСА таймера-счетчика) с регистром CCAPnL (см. рисунок).

Когда CL < CCAPnL на внешнем контакте будет сигнал низкого уровня, при CL>=CCAPnL на выходе будет сигнал высокого уровня. Значение в CCAPnL задает скважность импульсов. Для того. чтобы во время изменения значения CCAPnL на выходе не возникло помех, нужно новое значение записывать в регистр ССАРnН. Затем это значение аппаратно загрузится в CCAPnL при переходе CL из значения 0FFH в 00Н, что будет соответствовать началу следующего периода. Изменяя значение в ССАРпН от 0 до 255 можно задавать скважность от 100% до 0.4%.

 

Текст программы:

MOV CMOD, #03h ; Частота работы PCA f/4

MOV CL, #00h ; Обнуляем счетчик

MOV CH, #00h

MOV CCAP0H, #7Dh ; Значение этого регистра задает скважность

MOV CCAP0L, #7Dh ; Значение этого регистра перезагружается из CCAP0H

MOV CCAPM0, #42h ; Использование PCA 0 в качестве ШИМ генератора

MOV CR, #01h ; Запуск таймера PCA массива

LOOP:

RJMP LOOP ; Бесконечный цикл

Задача #22 – “Генерация последовательностей импульсов”

; Программа генерации последовательности импульсов

; Формирует сигналы на P1.0

DSEG

counter EQU 40 ; обозначает начало массива

CSEG

begin:

mov R4,#4

mov counter,#2Fh

mov (counter+1),#70h

mov (counter+2),#30h

mov (counter+3),#0F0h

mov (counter+4),#5Fh

org 200

loop:

lcall impulse

djnz R4, loop

jmp begin

impulse:

push ACC

push PSW

mov A, #counter

add A, R4

mov R0, A

mov A,@R0

mov R3,A

setb P1.0

C1: djnz R3,C1

clr P1.0

pop PSW

pop ACC

ret

END;

Задача #23– “Обслуживание WDT на примере i80C51FX ”

На вход блока АЦП микроконтроллера можно подать до 8 аналоговых сигналов. Время преобразования для 1 входа составляет 26 мкс на тактовой частоте 12 МГц. В данном программном модуле проверяется аналоговый вход 0, результат выводится в младшие 4 разряда дискретного порта P5. Таймер 1 используется для организации сброса сторожевого таймера.

Процедура тестирования заключается в следующих действиях:

установка на входе Uref микроконтроллера необходимого значения опорного напряжения для блока АЦП

установка на входе ACH0 микроконтроллера необходимого уровня входного сигнала

измерение значений логического сигнала на выходах P5.0-P5.3

;только опрос АЦП

?C0009 CLR A

MOV ADCON,A

ORL ADCON,#010H

?C0011: MOV A,ADCON

CJNE A,#030H,?C0011

?C0012

MOV R4,ADRES0

MOV A,R4

MOV R0,#04H

?C0015:

MOV C,ACC.7

RRC A

DJNZ R0,?C0015

MOV R4,A

LCALL L?0016

SJMP ?C0009

Включение сторожевого таймера.

Вход: AH FDh

AL 01h

DX FFFFh

Выход Нет

на asm

MOV AX, 0FD01h

MOV DX, 0FFFFh

INT 17h

Выключение сторожевого таймера.

Вход AH FDh

AL 03h

DX FFFFh

Выход Нет

на asm

MOV AX, 0FD03h

MOV DX, 0FFFFh

INT 17h

Сброс сторожевого таймера

Вход: AH FDh

AL 02h

DX FFFFh

Выход Нет

на asm

MOV AX, 0FD02h

MOV DX, 0FFFFh

INT 17h

Доп. вопрос #1 – “Механизм прерываний”

  • Прерывания по уровню (организация, обработка, применение) и прерывания по срезу (организация, обработка, применение):

Внешним прерываниям можно задать характер установкой соответствующих битов:

  • TCON.0 - Бит, определяющий вид прерывания INT0 (0 - прерывание по уровню; 1 - прерывание по фронту);

  • TCON.2 - Бит, определяющий вид прерывания INT1 (0 - прерывание по уровню; 1 - прерывание по фронту);

Факт внешнего прерывания фиксируется в соответствующем бите:

  • TCON.1 – Бит, фиксирующий факт прерывания INT0;

  • TCON.3 – Бит, фиксирующий факт прерывания INT1;

Обработчики прерываний INT0 и INT1 должны располагаться по адресам 0003H и 0013H соответственно. Для обнаружения прерывания уровень сигнала должен держаться, по меньшей мере, 1 цикл. Задержка между моментом возникновения прерывания и запуском обработчика может составлять 3 – 9 циклов. Прерывание по уровню используется, если к одному входу подключено несколько источников прерываний. Прерывание по срезу происходит при перепаде из 1 в 0, выход из запроса происходит аппаратно.

  • Прерывания по уровню (организация, обработка, применение):

Каждое из внешних прерываний ~INT0, ~INT1 может быть активизировано по уровню ("0") , что определяется состоянием битов IT0 и IT1 регистра TCON. При поступлении запроса внешнего прерывания ~INTx устанавливается флаг 1Ех регистра TCON. Установка флагов 1Ех в регистре TCON вызывает соответствующее прерывание. Очистка флага 1Ех производится следующим образом: при прерывании по уровню флаг очищается при снятии запроса внешнего прерывания, то есть в 1Ех отслеживается состояние вывода ~INTx.

Чтобы внешнее прерывание по уровню было распознано, необходимо, чтобы низкий уровень на выводе ~INTx удерживался в течение не менее 12 периодов сигнала тактовой частоты ОМЭВМ. Это объясняется тем, что проверка выводов ОМЭВМ ~INT0, ~INT1 выполняется внутренними аппаратными средствами ОМЭВМ один раз в каждом машинном цикле. Если внешнее прерывание активизируется по уровню, запрос должен удерживаться до начала обслуживающей подпрограммы и сниматься до завершения этой подпрограммы для предотвращения повторного обслуживания.

2: Если значение бита IT0 (для вывода INT0) или IT (для вывода INT0) равно 0, то соответствующий запрос на прерывание возникает при нулевом уровне сигнала на данном входе (прерывание по уровню). Если запрограммировано прерывание по уровню, то состояние флага запрос соответствует уровню сигнала на его внешнем выводе. Для обнаружения запроса требуемые уровни сигналов должны присутствовать на входе в течение как минимум одного машинного цикла. Подпрограмма обработки любого прерывания должна заканчиваться командой RETI.

Применяется, если необходимо обеспечить прерывание от нескольких источников. Процессор по средством программы обращается к устройству и снимает запрос.

  • Прерывания по срезу (организация, обработка, применение)

Прерывание происходит при перепаде из 1 в 0 на входах 8051. Выход из запроса происходит аппаратно (флаги сбрасываются аппаратно). Для организации необходимо в NCON установить биты IT0 и IE1 соответственно. Запрос сбрасывается аппаратно, а устанавливается и программно и аппаратно.

  • Немаскируемые прерывания:

Прерывания, которые нельзя отключить (Reset). Регистр IE полон, прерывания от WDT.

  • Внепрограммная обработка прерываний:

Осуществляется посредством PTS. Обработка прерывания происходит параллельно с выполнением программы. Сервер периферийного обмена (PTS) является микропрограммным аппаратным обработчиком прерываний. Он может использоваться вместо стандартных подпрограмм обработки прерываний для любых маскируемых прерываний. PTS обслуживает прерывания с небольшой задержкой; он не модифицирует стек или PSW, что позволяет нормально продолжить выполнение прерванной программы. По этим причинам PTS может обслуживать прерывание за время, необходимое для выполнения одиночной команды. PTS работает в пяти специальных микропрограммных режимах, которые позволяют PTS выполнять отдельные задачи гораздо быстрее, чем подпрограммы обслуживания прерывания. Смотрите описание режимов PTS в приложении C. Каждое прерывание PTS требует блока данных, называемого блоком управления PTS (PTSCB). Если имеет место прерывание PTS, то декодировщик приоритетов выбирает соответствующий вектор и вызывает PTSCB. PTSCB определяет режим, общее число передач (при необходимости), общее число циклов, которые будут выполнятся, пока PTS не потребует дополнительного обслужтиания, и источник и/или приёмник данных при передаче (при необходимости). Каждое прерывание PTS генерирует один цикл PTS. В микроконтроллерах некоторых типов кроме программного контроллера прерываний имеется микропрограммный контроллер прерываний (PTS). Любой запрос прерывания, кроме нескольких особых запросов, может быть направлен для обслуживания или в PIC или в PTS. Обслуживание запроса прерывания с использованием PTS заключается в выполнении типовой микропрограммы, при этом выполнение операций по микропрограмме совмещается во времени с выполнением команд текущей программы. Микропрограммы PTS охватывают, в основном, пересылки данных. Прерывания, обслуживаемые PTS, отрабатываются быстрее, чем те, которые обслуживаются обычным способом. Однако, программировать PTS непросто, а отлаживать еще сложнее..

  • Способы уменьшения числа прерываний при обмене данными:

Необходимо запросы на прерывания организовывать в очередь (использовать FIFO - систему) или использовать контроллер прямого доступа. Также можно сообщения о прерываниях делать более длинными (увеличивать их информативность).

  • Механизм приоритетов:

Каждому типу прерывания может быть программно присвоен высокий или низкий приоритетный уровень путем установки соответствующего бита в регистре IP (Interrupt Priority):

  • IP.7, IP.6, IP.5 - reserved, зарезервированы для дальнейшего использования;

  • IP.4 - Priority of Serial Port Interrupt (PS), приоритет последовательного порта;

  • IP.3 - Priority of Timer 1 Interrupt (PT1), приоритет Т/С1;

  • IP.2 - Priority of External Interrupt 1 (PX1), приоритет внешнего прерывания INT1;

  • IP.1 - Priority of Timer 0 Interrupt (PT0), приоритет Т/С0;

  • IP.0 - Priority of External Interrupt 0 (PX0), приоритет внешнего прерывания INT 0 .

Низкоприоритетное прерывание может прерываться высокоприоритетным, но никогда не прерывается запросом того же уровня приоритета. Поэтому, если одновременно возникают два прерывания с различным уровнем приоритета, то сначала выполняется высокоприоритетное. Если же подобная ситуация складывается для прерываний с одинаковым уровнем приоритета, то последовательность их обработки определяется специальной последовательностью опроса флагов прерываний (Interrupt Polling Sequence). В процессе работы "фиксация" всех флагов прерываний происходит в состоянии S5 каждого машинного цикла, а опрос - во время следующего машинного цикла. Порядок обхода прерываний одного уровня: INT0, таймер 0, INT1, таймер 1, последовательный порт.

ИЛИ

Существуют высокие и низкие уровни прерывания, определяемые по состоянию битов регистра IP.0-IP.4 (1 – высокий, 0 - низкий). При одновременном появлении нескольких запросов одного уровня очередность обслуживания определяется с помощью внутренней процедуры поллинга (последователь­ного опроса), который производится в порядке фиксированного старшинства источников внутри одного уровня приоритета. Этот порядок следующий: Приоритеты прерываний при поллинге

Источник

Приоритет внутри

уровня

Вход INT0#

Высший

Таймер 0

Вход INT1#

Таймер 1

Последовательный порт

Низший

Доп. вопрос #2 – “Таймеры”

  • Т0 как таймер:

TMOD.2 = 0 - режим таймера, содержимое регистра таймера счетчика инкрементируется в непрерывном цикле

  • Т1 как счетчик:

TMOD.6 = 1 – режим счетчика; TMOD.5 и TMOD.4 задают режим работы (00 – 13 разрядный счетчик, 01 – 16 разрядный счетчик, 10 – 8 разрядный счетчик, 11 – TL0 – 8-и разрядный таймер или счетчик, TL1 – 8-и разрядный таймер). В режиме счетчика производится подсчет сигналов на входе Т1 (P3.5).

  • Т1 как устройство синхронизации UART:

В режимах UART 1 или 2 (SM0:SM1:SM2 = 0:1:0/1 или SM0:SM1:SM2 = 1:1:0/1) частота обмена задается через T/C1 и равна:

2SMOD *FOV /32, где FOV – частота переполнения таймера 1 и равна: FOV = FOSC/(12* [256 – (TH1)]), где FOSC – частота осцелятора, а (TH1) – десятичный код содержимого регистра TH1. Т/С1 используется для приемника только если T2CON.5 = 0. Т/С1 используется для передатчика только если T2CON.4 = 0. Наиболее типично использование его в режиме таймера с автоперезагрузкой (старшая тетрада TMOD = 0010В).

SCON=0xd8; //reg. UART - 3, razr. priema., 9-i bit=1

TMOD=0x21; //T1 - reg.2, T0 - reg.1

TCON=0;

PCON=0x80; //skorost` *2

TL1=TH1=0xff; //115200

TR1=1; //run timer UART

IP=0;

IE=0x90; //Global, UART

  • Т1 как вход запроса на прерывание:

В TH1 и TH0 записывается FF, далее содержимое счетчика увеличится на 1, если в предыдущем цикле был считан сигнал высокого уровня, а в следующем низкого, после чего будет выставлен запрос на прерывание.

  • Т2 как таймер:

В режиме таймера Т2СОN.1 = 0. При переполнении Т/С2 устанавливается бит TF2 в T2CON и возникает прерывание если это разрешено.

  • Т2 как счетчик:

В режиме счетчика (Т2СОN.1 = 1) регистр инкрементируется в ответ на перепад из 1 в 0 в P1.0. При переполнении Т/С2 устанавливается бит TF2 в T2CON и возникает прерывание если это разрешено.

  • Т2 как делитель генератор сигналов:

  • Т2 как устройство синхронизации UART:

Т/С2 используется для приемника только если T2CON.5 = 1. Т/С2 используется для передатчика только если T2CON.4 = 1. Режим генератора приемопередатчика активируется так: RCLK:TCLK = 0 и 1 или 1 и 0 или 1 и 1; TR2 = 1.

T2MOD = 0x00;

PCON = 0x80; //бит SMOD. Удвоение скорости обмена UART

SCON = 0xd8; //настройка UART. Режим 3 - 9-бит, разрешение приема, 9-й бит=1

TH2 = RCAP2H = 0xff; //загрузка Т2 исходя из выбранной скорости обмена-115200

TL2 = RCAP2L = 0xfa; //

T2CON = 0x30; //настройка Т2. Т2-задающий генератор UART

TI=RI = 0; //cброс флагов прерывания UART

TR2 = 1;

//настройка прерываний

IE = 0x90; //Общее, UART

Обмен до 230Кбит/сек. Когда T2 работает в качестве синхронизатора UART, то fвч/2. По переполнению счетчика T2 значения его записываются в RCAP2. fUART=fВЧ/(32(65536 - <RCAP2>)). Вывод P1 при этом можно использовать для прерывания (T2EX).

  • Т2 как вход запроса на прерывание:

При переполнении регистра таймера/счетчика устанавливается флаг T2CON.TF2, который затем может использоваться для вызова прерывания. Кроме того, если установлен флаг T2CON.EXF2, то прерывание может возникнуть при защелкивании информации в таймерных регистрах или при перезагрузке, происходящих под воздействием перепада из 1 в 0 на выводе Р1.1.

  • Т2 как измеритель длительности импульса:

Использование таймера в качестве измерителя ширины импульсов. Известно, что измерение длительности импульса можно произвести, подсчитав импульсы эталонной частоты. Принцип измерения длительности импульсов иллюстрируется рисунком 8. Для измерения длительности импульса измеряемый сигнал подается на вывод микроконтроллера INTx и в бит управления GATE записывается разрешающий сигнал логической единицы. Таймер/счетчик настраивается в режим таймера записью в бит C/Tx логического нуля. Содержимое таймера обнуляется. Пример программы измерения длительности импульса приведен на рисунке 9.

Рисунок 8. Принцип измерения длительности импульсов

mov TMOD,#00001001b

;||||||||

;||||||++--Перевести таймер T0 в шестнадцатиразрядный режим

;|||||+----Синхронизироваться от внутреннего генератора

;||||+-----Включать таймер от ножки микроконтроллера INT0

;||++------Перевести таймер T1 в тринадцатиразрядный режим

;|+--------Синхронизироваться от внутреннего генератора

;+---------Запретить управление таймером от ножки INT1

mov TH0, #0 ;Обнулить старший байт таймера

mov TL0, #0 ;Обнулить младший байт таймера

setb TR0 ;Включить измеритель ширины импульса

TstLog0: jnb INT0, TstLog0 ;Подождать начало импульса (начало - 1)

TstLog1: jnb INT0, TstLog1 ;Подождать конец импульса (надо вроде jb)

Clr TR0 ;Отключить измеритель ширины импульса

Рисунок 9. Программа измерения длительности импульсов

Если теперь на вход микроконтроллера INT0 подать импульс с неизвестной длительностью, то в регистрах TH0 и TL0 будет записана его длительность в микросекундах.

  • Сторожевой таймер (WDT):

Все микроконтроллеры семейства MCS-96 имеют сторожевой таймер. По прошествии определенного интервала времени он переводит микроконтроллер в состояние сброса. Работающая программа должна предотвращать сброс микроконтроллера, сбрасывая в нулевое состояние WDT. При сбое сторожевой таймер не сбрасывается, и при переполнении микроконтроллер сбрасывается, что предотвращает опасные ситуации в системе управления. Некоторые микроконтроллеры могут обнаруживать падение частоты генератора тактовых импульсов (OFD). При снижении частоты ниже определенного уровня OFD сбрасывает микроконтроллер. Это предотвращает появление опасных комбинаций сигналов на выходах микроконтроллера, которые могут возникнуть при остановке генератора тактовых импульсов.

(аппаратное решение)Микроконтроллер содержит аппаратный сторожевой таймер. Если работа WDT разрешена, он через заданный в регистре WMCON временной промежуток (от 16 до 2048 мс) сбрасывает микроконтроллер. Избежать сброса можно, если 0 содержимое счетчика сторожевого таймера. Обычно включают в цикл программы команды, периодически обнуляющие счетчик таймера. "Зависание" программы останавливает основной цикл и через заданный промежуток времени микроконтроллер «сбрасывается». Сторожевой таймер выключается после сброса и в режиме Power Down. Запускается он установкой в 1 бита WDTEN регистра управления WDT, после чего программа должна его сбрасывать, записывая 1 в WDTRST. WDT имеет низший приоритет, запускается программно, используется в системах где есть электрические помехи или сбои по питанию. В режиме сторожевого таймера может работать только четвертый модуль PCA. Сигнал сброса срабатывает, когда происходит совпадение значения РСА таймера-счетчика со значением регистров ССАР4Н, CCAP4L (рис.). Бит WDTE в регистре CMOD устанавливает этот режим. При этом четвертый модуль должен находиться в режиме программи­руемого таймера или скоростного вывода. Предотвратить сброс можно тремя способами:

- изменять значения ССАР4Н, CCAP4L, что бы оно не совпало с РСА таймером-счетчиком;

- изменять регистры СН, CL РСА таймера-счетчика, чтобы они не совпали с ССАР4Н, GCAP4L;

- выключить охранный таймер сбросом WDTE перед совпадением и затем включить его.

Третий способ трудно реализовать. Второй способ не рекомендуется если таймер РСА используется другим модулем.

 

Доп. вопрос #3 – “Модуль PCA”

- как измеритель длительности импульсов

См. доп. вопрос #3 - как измеритель длительности паузы - для импульса

- как измеритель длительности периода

См. доп. вопрос #3 - как измеритель длительности паузы - в программе убрать комманду (*)

- как измеритель длительности паузы

11h = 00010001b – конец импульса

21h = 00100001b – начало импульса

DSEG

P_W EQU 30h

CAPTRE EQU 32h //сохранить первое значение времени

FLAG BIT 00h //привязывает следующую команду жестко к памяти

CSEG

ORG 0000h

AJMP MAIN

ORG 0033h

AJMP PCA_IR0

ORG 0100h

MAIN: //настройка и запуск

MOV CMOD, #00h; // WDTE =0 clock=fosc\12

MOV CL, #00h; //обнуляем регистр режима и счетчик

MOV CH, #00h;

MOV CCAPM0, #21h; (11h – для паузы) //настроить модуль 0, разрешение прерывания (2 бита в 1: 0010 0001 – позитив + фиксация событий)

CLR FLAG;

SETB IE.6; //разрешить прерывание от PCA массива

SETB IE.7; //отключить блокировку прерываний

SETB CCON.6; //установить CR

ORG 0200h

НАЧАЛО

PCA_ISR:

CLR CCF0; // Флаг прерывания модуля 0. Сбрасывается программно.

JBC FLAG, SECOND; // Переходим на метку если бит установлен и сбрасываем его.

FIRST:

MOV CAPTURE, CCAP0L; // запись в CAPTURE значения времени из CCAP0L

MOV (CAPTURE+1), CCAP0H; // запись по адресу CAPTURE+1 значения CCAP0H (фиксируем время наступления)

SETB FLAG; // Flag = 1

MOV CCAPM0, #11h; (или 21h; 21h для паузы) (11h- для импульса (конец импульса) (*) (перенастройка модуля меняет по отрицательному перепаду)

RETI; //разрешение прерывания этого уровня

SECOND:

PUSH PSW;….// выталкивает из стека последнюю затолкнутую переменную ( сохранить признаки

PUSH ACC; //и значения результата)

CLR C; //очистка бита переноса

MOV A, CCAP0L; // запись в ACC значения времени из CCAP0L

SUBB A, CAPTURE; // Вычитание из A – CAPTURE -C Вычитаем младшие байты времени поступления двух событий

MOV P_W, A (Pulse_WIDTH)

MOV A, CCAP0H

SUBB A, (CAPTURE+1) //аналогично старшие байты

MOV (P_W +1), A

POP ACC; // закидывает значение в стек //чтоб не испортить текущих значений

POP PSW;

MOV CCAPM0, #21h(начало импульса); (11h - для паузы)

CLR FLAG;

RETI;

- как сторожевой таймер

Сторожевой таймер - это схема, которая автоматически сбрасывает микроконтроллер, если не получает от управляемой системы сигнала, который подтверждает, что не произошло никакого сбоя. Такое устройство используется в системах, (где есть электрические помехи или сбои по питанию и, где нужно обеспечить большую надежность.) В режиме сторожевого таймера может работать только четвертый модуль. Сигнал сброса срабатывает всякий раз, когда происходит совпадение значения РСА таймера-счетчика со значением регистров ССАР4Н, CCAP4L (см. рисунок). Бит WDTE в регистре CMOD устанавливает этот режим. При этом четвертый модуль должен находиться или в режиме программи­руемого таймера, или скоростного вывода. Имеет наименьший приоритет, запускается программно

[CMOD]=40h, [CCAPM4]=48h.

MOV CL, #00h;

MOV CH, #00h;

MOV CCAP4L, #00h;

MOV CCAP4H, #00h;

MOV CCAPM4, #48h; (01001000b)

MOVCMOD, #40h; (01000000b)

CLR IE.7; (IE.7 – бит снятия блокировки прерываний(0 – запрет всех прерываний))

MOV CCAP4L, #00h;

MOV CCAP4H, CH;

SETB IE.7;

- как генератор сигналов

DSEG

PULSE EQU 2000

PAUSE EQU 8000

FLAG BIT 00h //привязывает следующую //команду жестко к памяти

CSEG

ORG 0000h

AJMP BEGIN

ORG 0033h

AJMP PCA_ISR

ORG 0100h

BEGIN: //настройка и запуск

MOV CL, #00h;

MOV CH, #00h;

MOV CMOD, #00h; //WDTE=0, //clock=fosc/12

MOV CCAPM0, #4Dh;

MOV CCAP0L, #LOW(PULSE)

MOV CCAP0H, #HIGH(PULSE)

SETB IE.6;

SETB IE.7;

SETB CCON.6; //запуск PCA массива (CR)

ORG 0200h

PCA_ISR:

CLR CCF0

PUSH ACC;

PUSH PSW;

JNB P1.3, MINUS //проверяем состояние бита

PULSE:

MOV A, CCAP0L;

ADD A, #LOW(PULSE); //при записи младшего байта

MOV CCAP0L, A; //компаратор выключается

MOV A, CCAP0H;

ADD A, #HIGH(PULSE);

MOV CCAP0H, A;

POP PSW;

POP ACC;

RETI; //иначе следующее прерывание не будет воспринято

MINUS:

MOV A, CCAP0L;

ADD A, #LOW(PAUSE); //каждый раз при прерывании

MOV CCAP0L, A; //проверяется состояние

MOV A, CCAP0H; //вывода P1.3 (программно)

ADD A, #HIGH(PAUSE); //если 1, то прибавляем

MOV CCAP0H, A; //длительность 8 мс

POP PSW; //если 0 – длительность импульса 2 мс

POP ACC;

RETI;

- как генератор ШИМ сигналов

MOV CL, #00h;

MOV CH, #00h;

MOV CMOD, #00h;

MOV CCAP0L, #80h; (80=1000 0000=128; 128/256=0,5)

MOV CCAP0H, #80h;

MOV CCAPM0, #42h;

SETB CR;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]