Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Микропроцессорное управление устройствами преобразования электрической энергии и передачи электротехнической информации. Учебное пособие
.pdf
В любом из этих случаев происходит ветвление, так как имеется два сце-
нария работы (рис. 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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
