Память данных разделяется на две области. Первая представляет собой регистры специальных функций, вторая – регистры общего назначения (ОЗУ). Специальные регистры включают в себя регистр таймера/счетчика (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».