Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Микропроцессорное управление устройствами преобразования электрической энергии и передачи электротехнической информации. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
В любом из этих случаев происходит ветвление, так как имеется два сце-
нария работы (рис. 3.8, 3.9).
Рис. 3.8. Алгоритм команды BTFSC f, b
Рис. 3.9. Алгоритм команды BTFSS f, b
31
Пример: организация больших интервалов времени (при высокочастотном
764мкс
769мкс
генераторе):
Count1 equ 0Ch Count2 equ 0Dh org 0 goto Start
­Loop movlw 0xFF movwf Count1 cycle1 movlw 0xFF movwf Count2 cycle2 decfsz Count2,1 goto cycle2 decfsz Count1,1 goto cycle1
­ goto Loop end
Определение времени:
(764 + 1 + 2 + 1 + 1) × 255 – 1 = 769 × 255 – 1 = 196094 мкс ≈ 196 мс ≈ 0,2 с.
3.7. СТЕК, РЕЖИМЫ ПРЕРЫВАНИЯ
В современных вычислительных средствах применяется режим прерыва­ния по вектору. Прерывание по вектору ― это передача данных с прерыва­нием программы по вектору для N периферийных устройств (ПУ) без поиска прерывающего устройства путем перехода сразу на подпрограмму обслужива­ния этого устройства. Вектор прерывания ― это адрес ячейки основной памя­ти, где хранится первая команда п/п обслуживания данного ПУ.
Аналог — звонок на телефон с АОН.
Если в составе программы имеется подпрограмма прерываний, то в «шап­ке» программы устанавливается так называемый вектор прерываний, который так же, как и команда старта для «основной» программы, определяет началь­ный адрес счетчика команд для первой команды, но только не «основной» про­граммы, а подпрограммы прерываний.
Если выбран внешний источник прерываний, то момент ухода в прерыва­ние «привязан» к активному перепаду сигнала, который формирует этот ис­точник. Отклик на внешнее воздействие будет гораздо быстрее, нежели в слу­чае работы без уходов в прерывания.
32
Особенности режима прерывания для PIC-микроконтроллеров
В PIC-микроконтроллерах есть только один вектор прерывания. Он имеет один конкретный адрес, задаваемый директивой org 4.
Прерывающих устройств несколько. Они определяются регистром
INTCON.
Если прерывания нет, то программа исполняется в пределах «основного те­ла» программы, если прерывание есть (на выводе RB0/INT сформировался ак­тивный перепад), то происходит переход рабочей точки программы на начало исполнения ПП прерываний.
Такой переход происходит по стеку.
Стек — это специально выбранная часть памяти или набор регистров, где запись и считывание происходят по принципу «пришел первым — ушел по­следним».
Стек или стековая память используется чаще всего для хранения адресов возврата при обращении к вложенным подпрограммам.
Рис. 3.10. Принцип «вложения» подпрограмм
Операции записи называются проталкиванием, а выборки — выталкивани­ем. То есть, в стек записывается адрес следующей команды, после той команды, во время исполнения которой произошло прерывание. Это нужно для того, что­бы после отработки ПП прерывания произошел возврат на эту «следующую» команду. Например (рис. 3.10), представим себе, что «зона» разрешения преры­ваний содержит 3 команды: А, В и С (по тексту программы, сверху вниз).
В случае, если активный перепад управляющего сигнала сформировался во время исполнения команды А, сразу же после исполнения этой команды рабо­чая точка программы «улетает» в ПП прерывания.
33
При этом адрес команды В автоматически запишется в стек и будет в нем находиться до тех пор, пока не исполнится последняя команда ПП прерываний, которой всегда должна быть команда RETFIE.
Она используется только для возврата из ПП прерывания.
Обратите внимание: на момент возврата из ПП прерывания, флаг (флаги) прерывания должен быть программно сброшен (установлен в 0).
Специалисты Микрочипа рекомендуют в начале ПП прерывания сохранить содержимое регистров STATUS и W в специально созданных для этого регист­рах общего назначения (стандартные названия: Stat_Temp и W_Temp, но они мо­гут быть и другими), а в конце ПП прерывания восстановить их содержимое.
Дело в том, что по ходу исполнения ПП прерывания, содержимое регист­ров STATUS и W может измениться, и после возврата из ПП прерывания это содержимое может негативным образом повлиять на исполнение программы
в «основном теле» программы.
В части касающейся заданного прерывания по входу RB0/INT, для органи­зации работы с прерываниями необходимо:
1) в «шапке» программы назначить вектор прерывания;
2) назначить источник прерывания (INTCON);
3) определить активный фронт прерывания (OPTION);
4) создать «зону» разрешения прерываний;
5) в начале ПП прерывания сохранить, а в конце ПП прерывания — восста-
новить содержимое регистров STATUS и W;
6) перед осуществлением возврата из ПП прерывания сбросить флаг преры-
вания выбранного источника прерываний;
7) в самом конце ПП прерывания исполнить команду RETFIE.
3.8. ИСПОЛЬЗОВАНИЕ ВСТРОЕННОЙ ПАМЯТИ EEPROM
EEPROM память данных так же, как и память программ, является энерго­независимой памятью, но к памяти программ она отношения не имеет. Она вы­полняет свои специфические функции. Из нее можно только или считать дан­ные, или записать их в нее.
При выключении питания эти данные не уничтожаются, и с ними можно работать при последующих включениях питания.
Запись и/или чтение данных можно «спровоцировать» различными спосо­бами. С привлечением EEPROM памяти данных, можно организовать пароль­ный доступ к чему-либо.
34
Во всех случаях, управлять ею будет либо рабочая часть программы, либо
org
2100h
;
Обращение к EEPROM памяти данных.
DE
0h,0h,64h
;
Записать в ячейки с адресами .0, .1, .2
;
числа 0h, 0h, 64h (.100) соответственно.
DE
0h, 0h, 0h
;
Записать в ячейки с адресами .3, .4, .5
;
числа 0h, 0h, 0h соответственно.
org
0
;
Начать выполнение программы
goto
START
;
с подпрограммы START.
она же вместе с директивами записи в EEPROM памяти данных, располагаю­щиеся в «шапке» программы.
Объем EEPROM памяти данных не велик. Для PIC16F84A это 64 ячейки по 8 бит. В других типах МК может быть и больше. В PIC16F877 их 256×8.
В каждую из этих ячеек может быть записан один байт (число от .00 до
.255).
Каждая из этих 64 ячеек, в диапазоне адресов от .00 до .63 (00h...3Fh), име­ет свой адрес, который обязательно нужно указывать как при чтении из EE- PROM памяти данных, так и при записи в нее.
Запись в ту или иную ячейку EEPROM памяти данных того или иного чис­ла производится «поверх» старого числа.
Этим управляет директива (или несколько таких директив) DE (см. ниже), которая в «шапке» программы должна располагаться до директивы org 0.
Пример. До начала исполнения рабочей части программы, необходимо запи- сать в ячейку с адресом 02h число, например, 64h, и еще в три ячейки — нули.
Заполненная память выглядит так:
00 00 64 00 00 00 FF FF FF………..… FF FF FF …………………………………. FF FF FF …………………………………. FF FF FF …………………………………. FF
То есть адрес числа в EEPROM при применении директивы DE определя­ется местом по порядку перечисления. Это создает некоторые неудобства, но чаще всего память записывается с самого начала, и неудобства этим компен­сируются.
Прежде чем применить эту директиву, необходимо обратиться к EEPROM памяти данных org.
35
Директива org 2100h всегда трактуется однозначно (других вариантов
7 6 5 4 3
2 1 0
―
INTEDG
TOCS
TOSE
PSA
PS2
PS1
PS0
Включение подтягивающих резисторов порта В: 1 ― подтяги­вающие резисторы отключены; 0 ― подтяги­вающие рези­сторы вклю­чены.
Выбор ак­тивного фронта сигнала на входе INT: 1 ― пре­рывания по переднему фронту
(0/1);
0 ― пре­рывания по заднему фронту сигнала
(1/0).
1 ― внеш­ний вход
TOCKI/ RA4;
0 ― внут­ренний.
Передний или задний фронт на
TOCKI/ RA4: 1 ― зад-
ний 0 ― пе­редний.
Способ включения: 0 ― перед
TMR0; 1 ― после WDT для TMR0 ―
без деле­ния.
Коэффициент деле­ния предделителя 000 ― 1:2 001 ― 1:4 010 ― 1:8 011 ― 1:16 100 ― 1:32 101 ― 1:64 110 ― 1:128 111 ― 1:256
«включения» предварительной записи в EEPROM память данных нет).
Проконтролировать содержимое области EEPROM памяти данных можно так: в главном меню компилятора, с которым мы будем работать — MPLAB — нужно щелкнуть по слову Window, а в раскрывшемся списке щелкнуть по строке EEPROM Memory. Откроется окно EEPROM Window, в котором есть область EEPROM памяти.
3.9. ИСПОЛЬЗОВАНИЕ ВСТРОЕННЫХ ТАЙМЕРОВ, ПРИМЕРЫ ПРОГРАММ
Таймер TMR0
Основная функция таймера TMR0 ― подсчет количества импульсов. Для работы с таймером используются регистры специального назначения.
1. OPTION_REG
Бит 6 (INTEDG): 1 — прерывание по переднему фронту 0 — по заднему фронту Бит 5 (TOCS):
Значение 5-го бита регистра OPTION (TOCS) определяет, какой сигнал бу-
дет подаваться на вход TMR0: либо внешний сигнал со счетного входа RA4/TOCKI (бит устанавливается в 1), либо внутренний тактовый сигнал CLKOUT (бит устанавливается в 0).
36
Бит 4 (TOSE):
7
6 5 4
3 2 1
0
TOIE
TOIF
1-прерывание по
переполнению TMR0
разрешено
1-произошло прерывание
по TMR0.Флаг нужно
сбрасывать!!!
PS4
tFosc
256
4-м битом регистра OPTION (TOSE) устанавливается момент срабатыва-
ния таймера TMR0. При установке бита TOSE в 1, счет происходит по спадам импульсной последовательности (переход от 1 к 0) присутствующей на выводе RA4/TOCKI, а при установке его в 0 — по фронтам (переход от 0 к 1).
Бит 3 (PSA):
Предделитель может быть включен либо перед таймером TMR0, либо после
сторожевого таймера WDT. Это определяет 3-й бит регистра OPTION (PSA).
Биты 2, 1, 0:
Максимальный коэффициент деления предделителя равен 256, и он, в пре-
делах разрешенных таблицей значений, может задаваться значениями битов 0, 1, 2 PS0, PS1, PS2 регистра OPTION_REG.
Пример 1. Подсчет внутренних импульсов TMR0 с коэффициентом деле-
ния 1:2. OPTION_REG=11000000 = С0н.
Пример 2. Подсчет внутренних импульсов без деления. OPTION_REG=11001000 = С8н.
2. INTCON
Для работы с TMR0 из регистра INTCON используются только 2 бита.
В качестве внутреннего тактового сигнала используется сигнал с частотой
опорного генератора МК, разделенной на 4, то есть в этом случае TMR0 будет считать каждый машинный цикл (1 мкс при применении кварца на 4 МГц).
Это — для случая работы TMR0 без предделителя. Предустановка с предделителем:
код TMR0 =
,
где PS — код предделителя из OPTION_REG в десятичном виде.
Задача: Какое максимальное время можно организовать с помощью TMR0
при использовании внутреннего осциллятора 4 МГц?
37
Ответ: 0 = 256 − 4МГц × t/4 × 256;
PS
tFg
256
256 = 4 × 106 × t/4 × 256, t = 256 × 256/106 = 65 мс. TMR0 считает только в одну сторону (реверса нет), а именно — в сторону
увеличения.
Если в качестве «предмета счета» выбран внешний тактовый сигнал, при­сутствующий на выводе RA4/TOCKI, то подсчитывается количество импуль­сов, формируемых внешним источником импульсов.
В случае выбора внешнего такта импульсы внутреннего такта (CLKOUT) не подсчитываются (и наоборот).
TMR0 всегда включен. Выключить его нельзя.
Предустановка без предделителя:
код TMR0 =
.
Для того, чтобы при наличии импульсной последовательности на выводе
RA4/TOCKI (выбран внешний такт) остановить или разрешить счет, нужно заблокировать или разблокировать счетный вход МК (вывод RA4/TOCKI). То есть, примитивно выражаясь, его нужно либо «закоротить» на корпус, либо снять этот «коротыш».
Для этого выводы RA3 (блокировка/разблокировка) и RA4/TOCKI (счет­ный вход МК) электрически соединяются между собой, и блокировка осуще­ствляется программно.
То есть если на выводе RA3 устанавливается 0 (блокировка), то это соот­ветствует остановке счета, а если 1 (разблокировка), то это соответствует раз­решению счета.
Чтобы разрешить счет, нужно установить выводы RA4/TOCKI и RA3 на вход:
Movlw 00011000b (18Н)
Movwf TrisA
Чтобы остановить счет:
Movlw 00010000b (10Н)
Movwf TrisA
Критерием переполнения TMR0 является флаг прерывания по переполне­нию TMR0 (бит № 2 регистра INTCON с названием T0IF). После того как он поднялся (1), в конце процедуры проверки TMR0 на переполнение, флаг T0IF нужно опустить (0).
38
pulse btfss INTCON,2
goto pulse
bcf INTCON,2
Пример.
;программа организации временного интервала 1мин на выходе RB0
;с внешним тактом на RA4 1kГц (С=0,1мкФ R=10к):
LIST p=16F84A
#include p16f84a.inc
__config 03FF3H
org 0
goto Start
Start movlw .22
movwf TMR0
clrf PORTB
bsf STATUS,5
movlw .0
movwf TRISB
movlw 0xA7 ; 10100111
movwf OPTION_REG
movlw 0x18 ; 00011000
movwf TRISA
bcf STATUS,5
pulse btfss INTCON,2
goto pulse
bcf INTCON,2
movlw 0x01
stop movwf PORTB
goto stop
end
В режиме прерываний (если во время счета нужно производить еще какие­то действия) нужно писать программу несколько иначе.
; программа задания времени таймером TMR0 (пример для 30 сек)
; и при переполнении таймера вывод 1 в RB7
; таймер подключен к RA 4 (TOCKI) от источника импульсов с частотой 1 кГц
LIST p = 16F84A
#include p16f84a.inc
39
__config 03FF3H
org 0
goto Start
org 4
INT movlw 0x80
movwf PORTB
goto INT
Start movlw 0x8B ; предустановка таймера
movwf TMR0
clrf PORTB
bsf STATUS,5
movlw .0
movwf TRISB
movlw 0xA7 ; 10100111
movwf OPTION_REG
movlw 0x18 ; 00011000
movwf TRISA
bcf STATUS,5
movlw 0xA0
movwf INTCON ;
Pusk goto Pusk
end
Если п/п прерывания не в начале текста, то после org 4 нужно написать goto INT, а в конце текста п/п написать RETFIE.
3.10. РЕГИСТРЫ INDF И FSR
Регистры INDF и FSR-регистры косвенной адресации. Здесь необходимо кое-что пояснить. Существует 2 вида адресации: прямая и косвенная.
Прямая адресация — это обращение к регистру напрямую, то есть в ко­манде указывается название регистра, с содержимым которого нужно произве­сти какое-то действие. При этом адрес этого регистра в области оперативной памяти определяется автоматически (по его названию).
При косвенной адресации название регистра не указывается, а указывается адрес этого регистра в области оперативной памяти, предварительно записан­ный в регистр FSR. Для того, чтобы осуществить действие с регистром, адрес
40
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]