Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Память данных разделяется на две области. Первая представляет собой регистры специальных функций, вторая – регистры общего назначения (ОЗУ). Специальные регистры включают в себя регистр таймера/счетчика (TMR0), счетчика команд (PC), регистра состояния (STATUS), регистров ввода/вывода (PORTA и PORTB), регистра косвенной адресации (FSR) и регистров управления встроенным электрически перепрограммируемым ПЗУ (EEADR, EEDATA, EECON1, EECON2). Кроме того, специальные регистры TRISA и TRISB управляют конфигурацией портов ввода-вывода, а OPTION – режимами работы предварительного делителя.
Регистры общего назначения используются для хранения переменных по усмотрению пользователя.
Доступ к части регистров специальных функций, управляющих периферийными устройствами, осуществляется через механизм выбора банков (страниц памяти данных). Биты, управляющие переключением банков, находятся в регистре STATUS.
На рисунке 5 приведена организация памяти данных PIC16F84.
Регистры | |||
00h | Косвенный адрес (*) | Косвенный адрес (*) | 80h |
01h | TMR0 | OPRION | 81h |
02h | PCL | PCL | 82h |
03h | STATUS | STATUS | 83h |
04h | FSR | FSR | 84h |
05h | PORTA | TRISA | 85h |
06h | PORTB | TRISB | 86h |
07h | 87h | ||
08h | EEDATA | EECON1 | 88h |
09h | EEADR | EECON2(*) | 89h |
0Ah | PCLATH | PCLATH | 8Ah |
0Bh | INTCON | INTCON | 8Bh |
0Ch | 68 регистров | Отображаются | 8Ch |
2Fh | общего назначения (ОЗУ) | на банк 0 | AFh |
30h | B0h | ||
4Fh | CFh | ||
Банк 0 | Банк 1 |
Примечания
1 Символ (*) означает нефизический адрес.
2 Символ означает, что адресное пространство не используется, содержимое считывается как «0».
Рисунок 5 – Организация памяти данных PIC16F84
Все регистры могут быть адресованы прямо или косвенно, с использованием регистра косвенной адресации FSR. Непосредственная адресация поддерживается специальными командами, загружающими данные из памяти программы в рабочий регистр W.
Регистр состояния STATUS
Регистр состояния содержит флаги состояния АЛУ, состояния микроконтроллера при сбросе и биты выбора страниц памяти данных. Регистр STATUS доступен для любой команды так же, как и любой другой регистр. Однако биты и устанавливаются аппаратно и не могут быть изменены программно, это следует иметь в виду при выполнении команд с использованием регистра состояния. Например, команда CLRF STATUS обнулит все биты, кроме битов и , а затем установит бит Z = 1. После выполнения этой команды регистр состояния будет иметь значение 000uu100 ( и не изменились). Поэтому рекомендуется для изменения регистра состояния использовать только команды битовой установки BCF, BSF, а также MOVWF и SWAPF, которые дополнительно не меняют биты регистра состояния.
Биты IRP и RP1 (STATUS <7:6>) не используются в PIC16F84 и должны быть программно установлены в «0». Использование этих битов в качестве битов общего назначения не рекомендуется. Биты C и DC при вычитании функционируют как биты заема и десятичного заема соответственно. Подробное описание разрядов регистра приведено в таблице 2.
Если регистр STATUS используется в качестве регистра операнда для команд, изменяющих биты Z, DC и C, то непосредственная запись в эти три бита запрещается. Биты устанавливаются в соответствии с внутренней логикой микроконтроллера.
Таблица 2 – Описание разрядов регистра STATUS
Регистр STATUS | Адрес: | 03h, | 83h | Состояние по включению питания: | 1XXX | |||||||
R/W | R/W | R/W | R | R | R/W | R/W | R/W | |||||
IRP | RP1 | RP0 | Z | DC | C | |||||||
бит 7 | бит 0 | |||||||||||
Окончание таблицы 2
Бит является флагом переноса для команд сложения ADDWF, ADDLW и инверсным флагом заема для команд вычитания SUBWF, SUBLW. Бит устанавливается в «1» в командах сложения ADDWF и ADDLW, если в результате операции из старшего разряда произошел перенос (результат больше 0FFh). При выполнении команд сдвига RRF, RLF бит загружается из младшего или старшего бита сдвигаемого регистра соответственно. Вычитание осуществляется путем прибавления дополнительного кода второго операнда. Бит устанавливается в «1» в командах вычитания SUBWF и SUBLW, если при вычитании не произошло заема (результат больше или равен 0) | |||||
C | (Carry/Borrow) Перенос/Заем | ||||
DC | (Decimal Carry/Borrow) Десятичный перенос/Заем | Бит устанавливается в «1» в командах ADDWF и ADDLW, если произошел перенос результата из бита 3. Бит устанавливается в «1» в командах вычитания SUBWF и SUBLW, если при вычитании не произошло заема из бита 4 | |||
Z | (Zero) Ноль | Бит устанавливается в «1», если результат арифметической или логической операции равен нулю | |||
(Power down) Выключение питания | Бит устанавливается в «1» по включению питания или по команде CLRWDT. Бит сбрасывается в «0» по команде SLEEP | ||||
(Time-out) Тайм-аут | Бит устанавливается в «1» по включению питания, а также командами CLRWDT и SLEEP. Бит сбрасывается в «0» по срабатыванию сторожевого таймера | ||||
(Register Bank Select) | Биты RP0, RP1 выбирают одну из четырех страниц памяти данных: | ||||
RP1 | RP0 | : | |||
RPO | Выбор страницы памяти данных | : | страница 0 (000h…07Fh) | ||
RP1 | : | страница 1 (080h…0FFh) | |||
: | страница 2 (100h…17Fh) | ||||
: | страница 3 (180h…1FFh) | ||||
Для PIC16F84 используется только бит RP0. Бит RP1 должен быть установлен в 0 | |||||
IRP | Не используется | Не используется. Бит должен быть установлен в «0» | |||
Примечание – R – только чтение, R/W – чтение и запись. |
Регистр OPTION
Описание разрядов регистра приведено в таблице 3.
Регистр OPTION доступен для чтения и записи и содержит управляющие биты, которые определяют коэффициент деления и использование предварительного делителя, источник внешних прерываний, а также подтягивающие резисторы на PORTB. Если предварительный делитель установлен на сторожевой таймер WDT (PSA = «1»), то таймер TMR0 имеет коэффициент деления 1:1.
Таблица 3 – Описание разрядов регистра OPTION
Регистр OPTION | Адрес: | 81h | Состояние по включению питания: | ||||||||||||||
R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W | ||||||||||
INTEDG | T0CS | T0SE | PSA | PS2 | PS1 | PS0 | |||||||||||
бит 7 | бит 0 | ||||||||||||||||
PS2 | PS1 | PS0 | Коэффициент деления TMR0 | Коэффициент деления WDT | |||||||||||||
1: 2 | 1: 1 | ||||||||||||||||
PS0, PS1, PS2 | (Prescaler Value) Значение предварительного делителя | 1: 4 | 1: 2 | ||||||||||||||
1: 8 | 1: 4 | ||||||||||||||||
1: 16 | 1: 8 | ||||||||||||||||
1: 32 | 1: 16 | ||||||||||||||||
1: 64 | 1: 32 | ||||||||||||||||
1: 128 | 1: 64 | ||||||||||||||||
1: 256 | 1: 128 | ||||||||||||||||
PSA | (Prescaler Assigment) Назначение предварительного делителя | 1 – предварительный делитель включен после WDT 0 – предварительный делитель включен перед TMR0 | |||||||||||||||
T0SE | (TMR0 source edge select) Выбор фронта переключения TMR0 | 1 – TMR0 увеличивается по перепаду 1/0 на входе T0CKI 0 – TMR0 увеличивается по перепаду 0/1 на входе T0CKI | |||||||||||||||
Окончание таблицы 3
T0CS | (TMR0 clock source select) Выбор источника тактирования TMR0 | 1 – сигнал со входа T0CKI 0 – внутренняя тактовая частота CLKOUT = CLKIN/4 |
INTEDG | (Interrupt Edge select) Выбор фронта переключения RB0/INT | 1 – прерывание по перепаду 0/1 на входе RB0/INT 0 – прерывание по перепаду 1/0 на входе RB0/INT |
(PORTB Pull-Up enable) Разрешение подтягивающих резисторов на PORTB | 1 – подтягивающие резисторы на PORTB отключены 0 – подтягивающие резисторы на PORTB подключены на всех разрядах, запрограммированных как входы | |
Примечание – R/W – чтение и запись |
Регистр INTCON
Описание разрядов регистра приведено в таблице 4.
Таблица 4 – Описание разрядов регистра INTCON
Регистр INTCON | Адрес: | 0Bh, | 8Bh | Состояние по включению питания: | 000X | |||||||
R/W | R/W | R/W | R | R | R/W | R/W | R/W | |||||
GIE | EEIE | T0IE | INTE | RBIE | T0IF | INTF | RBIF | |||||
бит 7 | бит 0 | |||||||||||
RBIF | (RB port change Interrupt Flag bit) Флаг прерывания по изменению состояния порта B | Устанавливается в «1» по изменению состояния хотя бы на одном из входов RB7 … RB4. Сбрасывается программно | ||||||||||
INTF | (RB0/INT Interrupt Flag bit) Флаг прерывания INT | Устанавливается в «1» по прерыванию INT. Сбрасывается программно | ||||||||||
T0IF | (TMR0 Overflow Interrupt Flag bit) Флаг прерывания по переполнению таймера TMR0 | Устанавливается в «1» при переполнении таймера TMR0. Сбрасывается программно | ||||||||||
Окончание таблицы 4
RBIE | (RB port change Interrupt enable bit) Маска прерывания RBIF | RBIE=0: запрещает прерывания от RBIF; RBIE=1: разрешает прерывания от RBIF |
INTE | (RB0/INT Interrupt Enable bit) Маска прерывания INT | INTE=0: запрещает прерывания от INTF; INTE=1: разрешает прерывания от INTF |
T0IE | (TMR0 Overflow Interrupt Enable bit) Маска прерывания TMR0 | T0IE=0: запрещает прерывания от T0IF; T0IE=1: разрешает прерывания от T0IF |
EEIE | (EE write complete Interrupt Enable bit) Маска прерывания от записи в ЭППЗУ | EEIE=0: запрещает прерывания от EEIF; EEIE=1: разрешает прерывания от EEIF |
GIE | (Global Interrupt Enable bit) Флаг разрешения прерываний | GIE=0: прерывания запрещены; GIE=1: разрешены все немаскированные прерывания |
Примечание – R – только чтение, R/W – чтение и запись. |
Регистр INTCON доступен для чтения и записи и содержит биты разрешения прерываний и флаги прерываний от различных источников. Флаги прерываний устанавливаются при возникновении условия прерывания независимо от состояния соответствующих бит разрешения прерываний и бита общего разрешения прерываний GIE (INTCON).
Счетчик команд
Счетчик команд PC 13-разрядный, младшим байтом счетчика команд служит регистр PCL, доступный для чтения и записи. Старшие разряды счетчика команд PC<12:8> не могут быть непосредственно считаны или записаны, а адресуются через регистр PCLATH. Содержимое регистра PCLATH заносится в счетчик команд, когда PC загружается новым значением. Это происходит в командах CALL, GOTO и при записи в PCL. По сигналу RESET в счетчик команд записывается «0». Загрузка счетчика команд в различных ситуациях показана на рисунке 6.
Рисунок 6 – Загрузка счетчика команд командой, модифицирующей PCL (а) и командами GOTO, CALL (б)
Стек
Микроконтроллер PIC16F84 содержат 8-уровневый аппаратный стек (см. рисунок 4). Стек не является частью памяти программы или памяти данных, а указатель стека не может быть считан или записан. При выполнении команды CALL или при прерывании в вершину стека заносится содержимое счетчика команд PC, предварительно увеличенное на единицу. Одновременно старое значение из вершины стека переписывается в стек следующего уровня. Значение из стека извлекается по командам RETURN, RETLW и RETFILE. Содержимое регистра PCLATH не изменяется при операциях со стеком. Стек работает как последовательный буфер. После того, как в стек было подряд занесено восемь значений счетчика команд, девятое значение переписывает значение, которое было занесено первым. Десятое значение перепишет значение, занесенное вторым, и т.д. При девятом и последующих последовательных извлечениях из стека будет считано то же значение, что и при восьмом извлечении, а именно значение, которое было занесено в стек первым.
Биты, указывающие на переполнение и пустоту стека, отсутствуют.
Косвенная адресация данных
Регистр INDF физически не существует и используется совместно с регистром FSR для косвенной адресации данных. Любая команда, использующая регистр INDF, в действительности обращается к регистру данных, адресуемому регистром FSR. Например, в команде ADDWF INDF к регистру W будет прибавлено содержимое регистра, адрес которого находится в FSR. Чтение косвенным образом самого регистра INDF даст результат 00h (т.е. FSR = 0). Косвенная запись в регистр INDF аналогична, хотя биты состояния могут быть изменены.
Программа, использующая косвенную адресацию для записи нулей в 16 последовательно расположенных ячеек ОЗУ с адреса 20h до адреса 2Fh, приведена ниже.
MOVLW | 0X20 | ; Загрузка в W адреса первой ячейки памяти. | |
MOVWF | FSR | ; Пересылка в FSR адреса первой ячейки памяти. | |
NEXT | CLRF | INDF | ; Это начало цикла очистки ячеек. Команда, ад- |
; ресующаяся к регистру INDF, в результате по | |||
; очереди очищает все ячейки. | |||
INCF | FSR | ; Следующий адрес. | |
; Когда пройдут все 16 адресов (10h), в регистре | |||
; FSR окажется установленным бит 4 | |||
; (0011 0000 = 30h) и цикл закончится. | |||
BTFSS | FSR,4 | ; Все закончено? | |
GOTO | NEXT | ; Нет, следующая ячейка. | |
CONT… | ; Продолжение программы. |
Порты ввода/вывода
Микроконтроллеры PIC16F84 имеют два порта ввода/вывода – PORTA и PORTB. Некоторые разряды портов имеют дополнительные функции. Программа может считывать и записывать данные в регистры ввода/вывода аналогично регистрам общего назначения. При чтении всегда считывается действительное состояние выводов, независимо от того, запрограммированы отдельные биты как входы или как выходы. После сброса все разряды программируются как входы (выходы находятся в высокоимпедансном состоянии), поскольку регистры управления портами TRISA и TRISB устанавливаются в «1». Разряд порта ввода/вывода определяется как выход, если соответствующий бит в регистре управления портом установлен в «0».
PORTA
Регистр ввода/вывода PORTA имеет разрядность 5 бит. Старшие 3 бита физически отсутствуют и считываются как «0». Разряд RA4 имеет вход с триггером Шмитта и выход с открытым стоком. Все остальные разряды PORTA имеют ТТЛ-входные уровни и КМОП-выходы. Разряд RA4 объединен с входом таймера TMR0. Описание выводов регистра PORTA приведено в таблице 5.
Ниже приведем пример программы инициализации (настройки) PORTA.
CLRF | PORTA | ; Очистка (сброс в «0») выходных защелок |
; PORTA. | ||
BSF | STATUS,RP0 | ; Выбор банка 1. |
MOVLW | 0x 0F | ; Значение константы для выбора режимов |
; работы разрядов. | ||
MOVWF | TRISA | ; Установить RA<3:0> как входы и RA4 как |
; выход. | ||
BCF | STATUS,RP0 | ; Выбор банка 0. |
PORTB
Регистр ввода/вывода PORTB 8-разрядный. Все разряды PORTB имеют внутренние подтягивающие резисторы, которые могут быть включены установкой в «0» бита RBPU (OPTION). Подтягивающие резисторы автоматически отключаются, если соответствующий разряд программируется как выход. По включении питания подтягивающие резисторы отключаются.
Имеется возможность прерывания по изменению состояния четырех разрядов PORTB (выводы RB7…RB4). Прерывание может возникнуть только от тех разрядов PORTB<7:4>, которые запрограммированы как входы, выходы не включаются в процедуру сравнения. Текущее состояние разрядов PORTB<7:4>, запрограммированных как входы, сравнивается с состоянием, защелкнутым в регистр PORTB при последнем считывании. При несовпадении возникает прерывание по изменению состояния. Это прерывание может вывести микроконтроллер из режима пониженного энергопотребления SLEEP. Для сброса прерывания в подпрограмме обработки необходимо выполнить следующие действия:
1 считать PORTB (это сбросит условие несовпадения);
2 сбросить флаг RBIF.
Прерывание по несовпадению совместно с программно управляемыми подтягивающими резисторами позволяет легко реализовать интерфейс клавиатуры и обеспечить выход из режима пониженного энергопотребления по нажатии клавиши. Для возникновения прерывания по изменению состояния минимальная деятельность импульса должна быть не менее длительности цикла команды.
Ниже приведем пример инициализации (настройки) PORTB.
CLRF | PORTB | ; Обнуление выходных регистров PORTB. |
BSF | STATUS,RP0 | ; Выбор банка 1. |
MOVLW | 0x CF | ; Значение для задания направления. |
MOVWF | TRISB | ; Установить RB<3:0> как входы, RB<5:4> |
; как выходы и RB<7:6> как входы. |
Особенности программирования портов
Некоторые команды выполняются в режиме «чтение-модификация-запись». Например, команды BCF и BSF считывают содержимое порта целиком, модифицируют один бит и выводят результат обратно. При использовании этих команд с портами, в которых некоторые разряды запрограммированы как входы, а некоторые как выходы, необходима осторожность. Например, команда BSF для пятого бита регистра PORTB сначала считывает все восемь бит, затем выполняется установка пятого бита, и новое значение байта целиком записывается в выходную защелку. Если другой бит регистра PORTB используется в качестве двунаправленного входа/выхода (скажем, бит 0) и в данный момент он определен как вход, входной сигнал на этом выводе будет считан и записан обратно в выходную защелку этого же вывода, затирая ее предыдущее состояние. До тех пор пока этот вывод остается в режиме входа, никаких проблем не возникает. Однако, если позднее линия 0 переключится в режим выхода, ее состояние будет неопределенным. Команда считывания порта считывает состояние вывода, а не выходных регистров. Например, если разряд порта запрограммирован как выход и установлен в «1», но внешняя схема поддерживает низкий уровень на выводе, порт будет считываться как «0». На вывод, работающий в режиме выхода, не должны подключаться внешние нагрузки по схеме «монтажное И» либо «монтажное ИЛИ». Возникающие при этом большие токи могут повредить кристалл.
Модуль таймера
Модуль таймера имеет следующие особенности:
– 8-разрядный таймер/счетчик, доступен по чтению и записи;
– 8-разрядный программируемый предварительный делитель;
– внутреннее или внешнее тактирование;
– прерывание по переполнению счетчика (переход от 0FFh к 00h);
– выбор фронта тактирующего импульса при внешнем тактировании.
Упрощенная структурная схема модуля таймера приведена на рисунке 7.
Режим таймера выбирается установкой в «0» бита T0CS (OPTION<5>). В режиме таймера TMR0 увеличивается в каждом командном цикле (в отсутствии предварительного делителя). Если происходит запись в TMR0, то увеличение счетчика задерживается на два последующих цикла выполнения команды. Запись в TMR0 должна вестись с учетом этой задержки. При необходимости проверки регистра TMR0 на ноль без влияния на процесс счета рекомендуется пользоваться командой MOVF TMR0,W.
Примечания
1 Биты T0CS,T0SE, PSA, PS2, PS1 и PS0 находятся в регистре OPTION.
2 Предварительный делитель используется совместно со сторожевым таймером.
Рисунок 7 – Структурная схема таймера
Режим счетчика выбирается установкой в «1» бита T0CS (OPTION<5>). В этом режиме TMR0 увеличивается по каждому перепаду 1/0 или 0/1 на выводе T0CKI. Перепад, увеличивающий значение TMR0, выбирается битом выбора фронта переключения T0SE (OPTION<4>). Установка этого бита в «0» вызывает увеличение TMR0 по перепаду 0/1.
Предварительный делитель может использоваться модулем сторожевого таймера WDT или модулем таймера. Подключение предварительного делителя задается битом PSA (OPTION<3>). Установка бита PSA в «1» подключает предварительный делитель к модулю WDT и устанавливает коэффициент деления для TMR0 1:1. Установка бита PSA в «0» подключает предварительный делитель к модулю таймера. Коэффициент деления предварительного делителя может быть установлен битами PS0-PS2 регистра OPTION (см. таблицу 3). Сам предварительный делитель недоступен для чтения и записи.
Дата публикования: 2014-11-26; Прочитано: 774 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!