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

umm_7154

.pdf
Скачиваний:
22
Добавлен:
18.03.2016
Размер:
2.85 Mб
Скачать

ла на ввод или вывод. Для каналов, настроенных как вход АЦП, результат чтения даст 0. При высоком уровне сигнала RD PORT значение на выходе защелки «замораживается» и подключается буфером данных к шине данных. При низком уровне сигнала RD PORT выход защелки повторяет логическое состояние ножки микросхемы.

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

Все каналы порта B имеют встроенную отключаемую нагрузку, реализованную на транзисторах P, подключенных к шине питания (рис. 3.10). Эквивалентное сопротивление открытого транзистора P составляет примерно 20 кОм. Нагрузка включается и отключается одновременно для всех выводов при помощи 7-го бита RBPU регистра OPTION_REG. При включении питания каналы порта B настроены на ввод данных, бит RBPU = 1 и нагрузка отключена. Сброс бита в ноль подключает нагрузку, но для каналов, настроенных на вывод, нагрузка отключается. Все каналы порта B имеют выход с тремя состояниями.

Каналы RB4-RB7 (рис. 3.10, б) могут использоваться как входы прерывания по изменению уровня. В каждом командном цикле происходит сравнение текущих значений на выводах с предыдущим, зафиксированном в специальной защелке. В такте Q1 происходит сравнение значений, а в такте Q3 выполняется сохранение состояния входа. Если хотя бы на одном из этих выводов произошло изменение уровня, устанавливается флаг RBIF и формируется прерывание. Вывод RB0 используется как вход внешнего прерывания. В зависимости от настроек устанавливается флаг INTF по переднему или заднему фронту сигнала на RB0. Выводы RB6

иRB7 применяются для внутрисхемного программирования микроконтроллера.

Каналы порта C мультиплексированы с коммуникационными периферийными модулями имеют триггеры Шмитта на входе

ивыходы с тремя состояниями (рис 3.11).

71

72

а

б

Рис. 3.10. Устройство каналов порта B:

а RB0-RB3; б RB4-RB7

а

б

73

Рис. 3.11. Устройство порта C:

а RC0-RC2, RC5-RC7; б RC3-RC4

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

Входы каналов RC3 и RC4 (рис. 3.11, б) имеют по два триггера Шмитта, подключенных к защелке через мультиплексор, с разными входными уровнями. Управление мультиплексором осуществляется с помощью бита CKE регистра SSPSTAT.

3.17. Программирование параллельных портов

Для управления работой портов ввода-вывода используются следующие регистры:

TRISA, TRISB и TRISC – определяют направление передачи информации, при записи 0 в какой-либо разряд регистра TRIS соответствующий разряд порта работает как выход, а при записи 1 – как вход (0 как O Out, 1 как I In). Направление передачи информации можно задавать для каждого бита порта отдельно, например, биты порта A с 0 по 3 можно настроить на ввод, а 4 и 5 биты на вывод. Для этого можно записать последовательность команд:

bsf TRISA, 0 bsf TRISA, 1 bsf TRISA, 2 bsf TRISA, 3 bcf TRISA, 4 bcf TRISA, 5;

или так:

movlw 0b00001111 movwf TRISA

PORTA, PORTB, PORTC – регистры портов ввода-вывода. Если порт настроен на вывод информации, то запись 0 или 1 в разряд этих регистров приводит к появлению соответствующего сигнала на выходах параллельного порта, если порт настроен на ввод информации, то из этих регистров можно считать логические уровни, присутствующие на входах параллельного порта.

Для того чтобы установить нулевой бит порта C в 1, когда порт настроен на вывод, следует записать:

74

bsf PORTC, 0 или:

movlw b’00000001’ movwf PORTC

Для того чтобы считать состояние порта B во WREG следует записать:

movf PORTB, W

OPTION_REG позволяет подключить к входам порта B внутренние подтягивающие резисторы. Сброс в 0 разряда -RBPU приводит к подключению внутренних подтягивающих резисторов, установка в 1 – к отключению. Для подключения резисторов используется команда:

bсf OPTION_REG, NOT_RBPU

ADCON1 позволяет настроить каналы порта A как цифровые входы-выходы или как входы модуля АЦП. Для настройки используются 4 младшие бита регистра ADCON1: PCFG0-PCFG3. Настройка каналов на цифровой ввод вывод осуществляется установкой в 1 битов PCFG1 и PCFG2:

bsf ADCON1, 1 bsf ADCON1, 2

3.18. Организация прерываний

Прерывание (Interrupt) – это событие, возникающее при выполнении определенных условий в системе. Возникновение такого события вынуждает процессор прервать выполнение текущей задачи и перейти к специальной подпрограмме, называемой обработчиком прерываний (Interrupt Service Routine, ISR). Прерывания позволяют организовать совместную работу ядра и периферийных модулей микроконтроллера. Запуск модулей выполняется ядром, после чего ядро и запущенный модуль работают параллельно во времени. Периферийный модуль после выполнения своей задачи формирует прерывание, т. е. он является источником прерывания.

В микроконтроллерах PIC16F873A каждый источник управляется двумя битами, названия которых формируются следующим образом. На первом месте стоит аббревиатура, соответствующего источника прерывания, на втором – аббревиатура IF (Interrupt

75

Flag – флаг прерывания) или IE (Interrupt Enable – разрешение прерывания). Например, периферийный модуль таймера управляется битами TMR0IF и TMR0IE, а модуль АЦП управляется битами ADCIF и ADCIE. Биты разрешения прерываний устанавливаются и сбрасываются программно, флаги прерывания устанавливаются в 1 аппаратно, а сбрасываются программно.

Возникновение прерывания приводит к установке соответствующего флага прерывания. Если прерывание разрешено, выполняется запись числа 0004 в счетчик команд, т. е. происходит переход к адресу 0004 в памяти программ. При этом текущий адрес сохраняется в стек. Источник прерывания определяется программно в начале обработчика прерываний перебором флагов разрешенных прерываний. После обработки прерывания выполняется возврат к команде основной программы, перед которой возникло прерывание. Адрес возврата считывания из стека в счетчик команд.

Микроконтроллер PIC16F873A имеет 14 источников прерывания, которые разделены на две группы – прерывания ядра и периферийные прерывания (рис. 3.12, а).

Бит GIE (Global Interrupt Enable – глобальное разрешение прерываний) служит для разрешения или запрета всех прерываний микроконтроллера. Если бит GIE = 0, то микроконтроллер не выполняет обработку прерываний. Если же GIE = 1, то обрабатываются только разрешенные прерывания. Периферийные прерывания могут быть одновременно разрешены или запрещены соответствующей настройкой бита PEIE (Peripheral Interrupt Enable – разрешение периферийных прерываний). При переходе к обработке прерывания бит GIE сбрасывается, запрещая остальные прерывания. Возврат из прерывания выполняется командой RETFIE, при этом бит GIE аппаратно устанавливается в 1.

Следует отметить, что даже когда прерывания запрещены битом GIE, флаги прерывания могут устанавливаться в 1. Поэтому состояние периферийных модулей может быть определено по значению соответствующего флага. Кроме того, если флаг прерывания какого-либо источника установлен в 1, сразу после разрешения соответствующего прерывания и записи 1 в бит GIE будет выполнен переход на вектор прерывания.

Биты управления прерываниями скомпонованы в 5 регистров (рис. 3.12, б). Регистр INTCON содержит биты разрешения и флаги прерываний ядра. В регистрах PIE1 и PIE2 находятся биты раз-

76

решения периферийных прерываний, а в регистрах PIR1 и PIR2 – флаги периферийных прерываний.

Программа, содержащая обработчик прерываний, имеет следующую структуру:

goto begin

;1

org h’04’

;2

ISR1:

;3

btfss INTCON, T0IF

;4

goto ISR2

;5

;обработка прерывания таймера 0

;…

 

ISR2:

;6

btfss PIR1, ADIF

;7

goto exitISR

;8

;обработка прерывания АЦП

;…

 

exitISR:

;9

retfie

;10

begin:

;11

call TMR0config

;12

call ADCconfig

;13

bsf INTCON, GIE

;14

bsf INTCON, PEIE

;15

ckl:

;16

;основная программа

 

goto ckl

;17

TMR0config:

 

;настройка таймера 0

 

;…

 

return

 

ADCconfig:

 

;настройка АЦП

 

;…

 

return

 

end

 

Первая выполняемая команда размещается в памяти программ по адресу 0000 и выполняет переход на метку begin (строка 1). Далее записана директива, размещающая следующую за ней коман-

77

78

а

б

Рис. 3.12 – Организация прерываний:

а – структурная схема; б – регистры управления

ду по адресу 0004, где находится вектор прерывания (строка 2). Обработчик прерываний начинается меткой ISR1 (строка 3). Выполняется поиск сформировавшего прерывание источника и обработка прерывания (строки 4-8). По команде RETFIE происходит возвращение в основную программу (строки 9-10). Меткой begin начинается вызов подпрограмм настройки источников прерывания (строки 11-15). Затем размещается основная программа микроконтроллера, которая выполняется в бесконечном цикле (строки 16-17).

3.19.Таймеры

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

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

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

Микроконтроллер PIC16F873A содержит 4 таймера: TMR0, TMR1, TMR2 и сторожевой таймер WDT (Watch Dog Timer).

79

3.20. Таймер TMR0

Таймеры TMR0 и WDT используют общий программируемый делитель. Структурная схема TMR0 представлена на рисунке 3.13.

Рис. 3.13. Структурная схема таймера TMR0

Таймер TMR0 представляет собой 8-и разрядный счетчик, при переполнении которого устанавливается флаг прерывания TM- R0IF. Счетчик увеличивается на 1 при каждом поступлении импульса через синхронизатор, который служит для синхронизации активного фронта внешнего сигнала с внутренней тактовой частотой. В качестве источников счетных импульсов может выступать внутренний тактовый генератор микроконтроллера, период следования этих импульсов равен длительности машинного цикла, либо внешний сигнал, подаваемый на ножку RA4 микросхемы PIC16F873A. Переключение источника тактового сигнала выполняется битом T0CS. С помощью бита T0SE настраивается активный фронт внешнего сигнала. Программируемый делитель частоты позволяет увеличивать формируемый таймером интервал времени. Делитель может быть подключен перед таймером TMR0 или после сторожевого таймера WDT. Переключение делителя выполняется битом PSA. Коэффициент деления настраива-

80

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