Константа в инструкциях представлена символом k. В описании инструкций указаны флаги, которые могут измениться при ее выполнении. Параметр d (dest) в инструкциях определяет, в какой регистр записывается результат. Если d =0 или отсутствует, результат сохраняется в регистре W. Если d =1, результат сохраняется в регистре f ( от слова file). В программах для параметра d вместо ‘0’ можно писать ‘ W ’, вместо ‘1’ можно писать ‘ f ’.
Вместо адреса регистра в программе более удобно писать его символьное имя. Например, если регистр по адресу h’21’ имеет имя R1, тогда инструкция, описанная как ADDWF f, d, в программе может быть записана двумя способами: ADDWF h’21’, W или ADDWF R1, W.
Директива ORG h’xx’ – это указатель для ассемблера, что код, следующий за этим выражением, начинается с адреса h’xx’ ЭППЗУ.
ADDLW - Сложить k с W.
Синтаксис: [label] ADDLW k.
Операнды: 0£k£255.
Операция: (W) + k à (W).
Изменяемые флаги: С, DC, Z.
ADDWF - Сложение W и f.
Синтаксис: [label] ADDWF f, d.
Операнды: 0£f£127.
Операция: (W) + (f) à (dest).
Изменяемые флаги: C, DC, Z.
ANDLW - Побитное ' И ' k и W.
Синтаксис: [label] ANDLW k.
Операнды: 0£k£255.
Операция: (W).AND. k à (W).
Изменяемые флаги: Z.
ANDWF - Побитное 'И’ W и f.
Синтаксис: [label] ANDWF f, d.
Операнды: 0£f£127.
Операция: (W).AND. (f) à (dest).
Изменяемые флаги: Z.
BCF - Очистить бит b в регистре f.
Синтаксис: [label] BCF f, b.
Операнды: 0£f£127; 0£b£7.
Операция: 0 à (f<b>).
Изменяемые флаги: Нет.
BSF - Установить бит b в регистре f.
Синтаксис: [label] BSF f, b.
Операнды: 0£f£127; 0£b£7.
Операция: 1àf<b>.
Изменяемые флаги: Нет.
BTFSC - Проверить бит b в регистре f, пропустить следующую инструкцию, если b=0.
Синтаксис: [label] BTFSC f, b.
Операнды: 0£f£127; 0£b£7.
|
Изменяемые флаги: Нет.
Описание: Если бит b в регистре f равен 0, то следующая инструкция программы пропускается.
BTFSS - Проверить бит bв регистре f, пропустить, если b = 1.
Синтаксис: [label] BTFSS f, b.
Операнды: 0£f£127; 0£b£7.
Изменяемые флаги: Нет.
Описание: Если бит b в регистре f равен ‘1’, то следующая инструкция программы пропускается.
CALL Вызов подпрограммы
Синтаксис: [label] CALL f.
CLRF - Очистить f.
Синтаксис: [label] CLRF f.
Операнды: 0£f£127.
Операция: 00h à (f); 1 àZ.
Изменяемые флаги: Z.
Описание: Очистить содержимое регистра f и установить флаг Z=1.
COMF - Инвертировать f.
Синтаксис: [label] COMF f, d.
Операнды: 0£f£127.
Операция: (-f) à (dest).
Изменяемые флаги: Z.
Описание: Инвертировать все биты в регистре f.
DECF - Вычесть 1 из f и пропустить, если f=0.
Синтаксис: [label] DECFSZ f, d.
Операнды: 0£f£127.
Операция: (f) -1 à (dest).
Изменяемые флаги: Нет.
Описание: Декрементировать содержимое регистра f. Если результат равен '0', то следующая инструкция программы пропускается.
GOTO - Безусловный переход.
Синтаксис: GOTO k.
Операнды: 0£k£2047.
Операция: Переход на метку.
Изменяемые флаги: Нет.
INCF - Прибавить 1 к f.
Синтаксис: label] INCF f, d.
Операнды: 0£f£127.
Операция: (f) + 1 à (dest).
Изменяемые флаги: Z.
IORLW - Побитное 'ИЛИ' k и W.
Синтаксис: [label] IORLW k.
Операнды: 0£k£255.
Операция (W).OR.(k) à (W).
Изменяемые флаги: Z.
IORWF - Побитное 'ИЛИ' W и f.
Синтаксис: [label] IORWF f, d.
Операнды: 0£f£127.
Операция: (W).OR.(f) à (dest).
Изменяемые флаги: Z.
MOVF - Переслать f.
Синтаксис: [label] MOVF f, d.
Операнды: 0£f£127.
Операция: (f) à (dest).
|
Изменяемые флаги: Z.
Описание: Значение d=1 используется для проверки содержимого регистра f на ноль, которое регистрируется флагом Z.
MOVLW - Переслать k в W.
Синтаксис: [label] MOVLW k.
Операнды: 0£k£255.
Операция: kà(W).
Изменяемые флаги: Нет.
Описание: В неиспользуемых битах ассемблер устанавливает '0'.
MOVWF - Переслать W в f.
Синтаксис: [label] MOVWF f.
Операнды: 0£f£127.
Операция: (W) à (f).
Изменяемые флаги: Нет.
NOP - Нет операции.
RETURN - Возврат из подпрограммы.
Синтаксис: [label] RETURN.
Операнды: Нет.
Операция: TOS à PC.
Изменяемые флаги: Нет.
Описание: Возврат из подпрограммы. Вершина стека TOS загружается в счетчик PC.
RLF - Циклический сдвиг регистра f влево через бит C регистра Status.
Синтаксис: [label] RLF f, d.
Операнды: 0£f£127.
Изменяемые флаги: С.
Описание: Выполняется циклический сдвиг влево содержимого регистра f через бит С регистра Status.
RRF - Циклический сдвиг регистра f вправо через бит C регистра status.
Синтаксис: [label] RRF f, d.
Операнды: 0£f£127.
Изменяемые флаги: С.
Описание: Выполняется циклический сдвиг вправо содержимого регистра f через бит С регистра Status.
SLEEP Перейти в режим SLEEP.
Синтаксис: [label] SLEEP.
Операнды: Нет.
Операция: 00h à WDT;
00h à предделитель WDT;
1 à -ТО; 0 à PD.
Изменяемые флаги: -ТО, -PD.
Описание: Сбросить флаг включения питания -PD в '0'. Установить флаг -ТО переполнения WDT в '1'. Очистить таймер WDT и его предделитель. Перевести микроконтроллер в режим SLEEP и выключить тактовый генератор.
SUBLW - Вычесть W из k.
Синтаксис: [label] SUBLW k.
Операнды: 0£k£255.
Операция: k - (W) à (W).
Изменяемые флаги: C, DC, Z.
|
SUBWF - Вычесть W из f.
Синтаксис: [label] SUBWF f, d.
Операнды: 0£f£127; dÎ [0,1].
Операция: (f) –(W) à (dest).
Изменяемые флаги: C, DC, Z.
SWAPF - Поменять местами полубайты в регистре f.
Синтаксис: [label] SWAPF f, d.
Операнды: 0£f£127.
Операция: (f<3:0>) à (dest<7:4>).
Изменяемые флаги: Нет.
XORLW- Побитное 'исключающее ИЛИ ' k и W.
Синтаксис: label] XORLW k.
Операнды: 0£k£255.
Операция: (W).XOR.k à (W).
Изменяемые флаги: Z.
XORWF - Побитное 'исключающее ИЛИ ' W и f.
Синтаксис: [label] XORWF f, d.
Операнды: 0£f£127.
Операция: (W).XOR.(f) à (dest).
Изменяемые флаги: Z.
Приложение Е
Модуль таймера TMR1
TMR1 - 16-разрядный таймер/счетчик, состоящий из двух 8-разрядных регистров (TMR1H и TMR1L), доступных для чтения и записи. Счет выполняется в спаренных регистрах (TMR1H:TMR1L), инкрементируется их значение от 0000h до FFFFh. При добавлении ещё единицы будет переполнение регистров и в счетчиках будет снова 0000h. При переполнении счетчика устанавливается в '1' бит флага прерывания TMR1IF в регистре PIR1<0>. Само прерывание можно разрешить/запретить установкой/сбросом бита TMR1IE в регистре Р1Е1<0>.
TMR1 может работать в режимах: режим таймера, режим счетчика.
Включается TMR1 установкой бита TMR1ON в ‘1’ (T1CON<0>).
Битом TMR1CS (T1CON<1>) выбирается источник тактовых импульсов.
TMR1 инкрементируется при каждом машинном цикле.
Когда включен генератор тактовых импульсов (T1OSCEN=1), выводы RC1/T1OSI/CCP2 и РС0/T1OSO/TICK1 настроены как входы. Значение битов TRISC<1:0> игнорируется, а чтение данных с этих выводов дает результат '0'.
Управляющие биты TMR1 находятся в регистре T1CON.
Сброс регистров TMR1 (TMR1H, TMR1L). Регистры TMR1H и TMR1L не сбрасываются в 00h при сбросе по включению питания и других видах сброса.
Предделитель TMR1 очищается при записи чисел в регистр TMR1L или TMR1H.
Регистр PIE1 (адрес 8Ch) доступен для чтения и записи, содержит биты разрешения периферийных прерываний. Чтобы разрешить периферийные прерывания необходимо установить в '1' бит PEIE (INTCON<6>).
Регистр INTCON (адрес 0Вh, 8Вh, 10Вh или 18Вh) доступен для чтения и записи, содержит биты разрешений и флаги прерываний: переполнение TMR1; изменения уровня сигнала на выводах PORTB; внешний источник прерываний RB0/INT.
Примечание. Флаги прерываний устанавливаются при возникновении условий прерываний вне зависимости от соответствующих битов разрешения и бита общего разрешения прерываний GIE (INTCON<7>).
Регистр PIR1 доступен для чтения и записи, он содержит флаги прерываний периферийных модулей.
Примечание. Флаги прерываний устанавливаются при возникновении условий прерываний вне зависимости от соответствующих битов разрешения и бита общего разрешения прерываний GIE (INTCON<7>). Программное обеспечение пользователя должно сбрасывать соответствующие флаги при обработке прерываний от периферийных модулей.
Приложение Ж
Таймер TMR0
Таймер TMR0 – 8-разрядный таймер/счетчик с предделителем. Чем больше коэффициент предделителя, тем медленнее заполняется счетчик таймера TMR0. После переполнения счетчика (значение в регистре TMR0 равно FFh) происходит прерывание, в результате чего в регистре INTCON бит TOIF (бит 2) устанавливается в 1. Само прерывание может быть разрешено/запрещено установкой/сбросом бита TOIE (INTCON<5>). При запрете прерывания программа не останавливается, но флаг прерывания от TMR0 TOIF (INTCON<2>) появляется и он должен быть сброшен в подпрограмме обработки прерывания или в основной программе. Для включения таймера и получения прерывания от него при переполнении счетчика таймера используются регистры OPTION_REG и INTCON. Связь регистров и бит с ТМR0 показана в таблице 4.1.
Таблица 4.1 Связь регистров и бит с ТМR0
Адрес | Имя | Бит 7 | Бит 6 | Бит 5 | Бит 4 | Бит 3 | Бит 2 | Бит 1 | Бит 0 |
01,101 | TMR0 | Регистр таймера TMR0 | |||||||
0B,8B, 10B,18B | INTCON | GIE | PEIE | TOIE | INTE | RBIE | TOIF | INTF | RBIF |
81,181 | OPTION_ REG | RBPU | INTEDG | TOCS | TOSE | PSA | PS2 | PS1 | PS0 |
Затененные биты не используются.
Регистр OPTION_REG
Регистр OPTION_REG доступен для чтения и для записи. Он содержит биты: конфигурации предделителя (PSC) для TMR0/WDT, внешнего преры-вания INT и состояния выходов порта В. Описание битов регистра OPTION_REG показано в таблице Ж.1.
Таблица Ж.1 Регистр OPTION_REG (адреса 81h, 181h)
№ бита | ||||||||
Имя бита | RBPU | INTEDG | T0CS | T0SE | PSA | PS2 | PS1 | PS0 |
после сброса | ||||||||
доступность | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W |
Обозначения: R – читаемый разряд, W – записываемый разряд. |
Назначение битов регистра OPTION_REG приведено ниже.
Бит 7: - RBPU: включение подтягивающих резисторов на PORTВ
0 = подтягивающий резистор включен
1 = подтягивающий резистор выключен
Примечание: если используется низкий уровень напряжения при програм-мировании по входу PGM и выводы PORTB подтянуты к высокому уровню, то 3-ий бит в регистре TRISB необходимо сбросить, чтобы вход RB3 не был подтянут к высокому уровню. Это необходимо для правильного програм-мирования устройства.
Бит 6: INTEDG: выбор активного фронта сигнала прерывания на входе RB0/INT регистра PORTB
0 = прерывание по заднему фронту.
1 = прерывания по переднему фронту.
Бит 5: TOCS: выбор источника тактового сигнала для TIMER0.
1 = тактовый сигнал с входа RA4/T0CKI.
0 = внутренний источник тактового сигнала (CLKOUT).
Бит 4: T0SE: выбор фронта приращения TMR0 при внешнем
тактовом сигнале
1 = приращение по заднему фронту сигнала на T0CKI.
0 = приращение по переднему фронту сигнала на T0CKI.
Бит 3: PSA: выбор включения предделителя.
1 = предделитель включен перед сторожевым таймером WDT.
0 = предделитель включен перед таймером TMR0.
Биты 2-0: PS2 - PS0; выбор коэффициента предделителя. Чем больше коэффи-циент предделителя, тем больше время паузы, обеспечиваемой таймером.
Коэффициенты деления предделителя показаны в таблице 4.2.
Таблица Ж.2 Коэффициенты деления в зависимости от значений PS2- PS0
Значение | TMR0 (PSA = 0) | WDT (PSA = 1) | ||
PS2 | PS1 | PS0 | ||
1:2 | 1:1 | |||
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 |
Установка коэффициента деления предделителя 1:1 для TMR0
соответствует переключению предделителя на сторожевой таймер.
Регистр INTCON
Регистр INTCON доступен для чтения и для записи. Он содержит
биты масок прерываний и флаги прерываний. Флаги прерываний
должны сбрасываться программно. Регистр показан в таблице Ж.3.
Таблица Ж.3 Регистр INTCON (адреса 0Bh, 8Bh, 10Bh, 18Bh)
№ бита | ||||||||
Имя бита | GIE | PEIE | T0IE | INTE | RBIE | T0IF | INTF | RBIF |
после сброса | ||||||||
доступность | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W |
Обозначения: R – читаемый разряд, W – записываемый разряд. |
Назначение битов регистра INTCON приведено ниже.
Бит 7: GIE – Общее (глобальное) управление прерываниями.
1=все немаскируемые прерывания разрешены.
0=все прерывания запрещены.
Примечание: Если происходит прерывание, то бит GIE
сбрасывается. По команде выхода из подпрограммы (RETFIE) этот бит
устанавливается.
Бит 6: PEIE – маска прерываний от периферийных устройств
1=все немаскируемые прерывания периферийных устройств
разрешены
0=все прерывания периферийных устройств запрещены
Бит 5: T0IE – маска прерывания по переполнению TMR0
1=прерывание TMR0 разрешено
0= прерывание TMR0 запрещено
Бит 4: INTE – маска внешнего прерывания по входу RB0/INT
1=прерывание по входу RB0/INT разрешено
0=прерывание по входу RB0/INT запрещено
Бит 3: RBIE – маска прерывания по изменению состояния на
входах RB7: RB4 PORTB
1=прерывание по изменению уровня сигнала на входах RB7: RB4 PORTB разрешено
0=прерывание по изменению уровня сигнала на входах RB7: RB4 PORTB запрещено
Бит 2: T0IF – флаг прерывания при переполнении TMR0
1=устанавливается, если регистр TMR0 переполнен (очищается
программно)
0=если регистр TMR0 не переполнен
Бит 1: INTF – флаг внешнего прерывания по входу RB0/INT
1=устанавливается, если происходит прерывание по входу
RB0/INT
0=если прерывание по входу RB0/INT не произошло
Бит 0: RBIF – флаг прерывания по изменению уровня сигнала на входах RB7: RB4 PORTB
1=устанавливается, если изменился уровень сигнала на одном из входов RB7:RB4 PORTB (очищается программно)
0=если уровень сигнала на входах RB7:RB4 не изменились.
Приложение З
Модуль АЦП
Модуль аналого-цифрового преобразователя (АЦП) имеет восемь каналов у 40/44-выводных микросхем.
Входной аналоговый сигнал через коммутатор каналов заряжает внутренний конденсатор АЦП Chold. Модуль АЦП преобразует напряжение, удерживаемое на конденсаторе Chold в соответствующий 10-разрядный цифровой код методом последовательного приближения. Источник верхнего и нижнего опорного напряжения может быть программно выбран с выводов VDO, VSS, RA2 или RA3.
Допускается работа модуля АЦП в SLEEP режиме микроконтроллера, при этом в качестве источника тактовых сигналов должен быть выбран RC генератор.
Для управления АЦП в микроконтроллере используется 4 регистра.
- регистр результата ADRESH (старший бит);
- регистр результата ADRESL (младший бит);
- регистр управления ADCON0;
- регистр управления ADCON1.
Регистр ADCON0 используется для настройки работы модуля АЦП, а с помощью регистра ADCON1 устанавливается какие входы микроконтроллера будут использоваться модулем АЦП и в каком режиме (аналоговый вход или цифровой порт ввода/вывода).