Программная составляющая микроконтроллера

Система команд микроконтроллер.

Каждая команда микроконтроллера состоит из одного 14-разрядного слова разделенного на:

· код операции, определяющий тип команды

· один или несколько операндов, определяющие операцию команды.

Полный список команд смотрите в таблице 2. Команды разделены на следующие группы:

· байтовые команды;

· битовые команды;

· команды управления и операций с константами.

На рисунке 5 показан формат команд трех основных групп.

Для байт ориентированных команд:

· 'f ' является указателем регистра и определяет - какой регистр должен использоваться в команде;

· 'd' указателем адресата результата и определяет, где будет сохранен результат.

Если 'd'=0, результат сохраняется в регистре W.

Если 'd'=1, результат сохраняется в регистре, который используется в команде.

В бит ориентированных командах:

· 'b' определяет номер бита участвующего в операции;

· 'f ' - указатель регистра, который содержит этот бит.

В командах управления или операциях с константами:

· 'k' представляет восемь или одиннадцать бит константы.

Рис. 5. Формат команд.

Все команды выполняются за один машинный цикл, кроме команд условия, в которых замещается значение программного счетчика. В случае выполнения команды за два машинных цикла, во втором цикле выполняется инструкция NOP. Один машинный цикл состоит из четырех тактов генератора. Для тактового генератора с частотой 4 МГц команда выполняется за 2 мкс.


 

Таблица 2. Команды микроконтроллера PIC16F877.

Мнемоника Операция Циклы Код команды Флажки Примечание
команды          

БАЙТОВЫЕ КОМАНДЫ

ADDWF f, d Сложение (W + f->d) 1 00 0111 dfff ffff C.DC.Z 1,2
ANDWF f, d Логическое "И" (W and f — > d) 1 00 0101 dfff ffff Z 1,2
CLRF   f Обнулить f 1 00 0001 1fff ffff Z 2
CLRW - Обнулить W 1 00 0001   0xxx xxxx Z  
COMF f, d Дополнение f (Логическое "НЕ") 1 00 1001 dfff ffff Z 1,2
DECF  f, d Декремент f               | 1 00 0011 dfff ffff Z 1,2
DECFSZ f, d Декремент f, пропуск если "0" 1(2) 00 1011 dfff ffff   1,2,3
INCF    f, d Инкремент f 1 00 1010  dfff ffff Z 1,2
INCFSZ f, d Инкремент f, пропуск если "0" 1(2) 00 1111 dfff ffff   1,2,3
IORWF f, d Логическое "ИЛИ" (W or f-> d) 1 00 0100  dfff ffff Z 1,2
MOVF f, d Пересылка (f — > W) 1 00 1000 dfff ffff Z 1,2
MOVWF f Пересылка (W — >f) 1 00 0000 1fff ffff    
NOP Пустая операция 1 00 0000 0xx0 0000    
RLF     f, d Сдвиг влево через перенос 1 00 1101 dfff ffff С 1,2
RRF     f, d Сдвиг вправо через перенос 1 00 1100 dfff ffff C 1, 2
SUBWF f, d Вычитание (f - W -> d) 1 00  0010  dfff ffff C,DC,Z 1, 2
SWAPF f, d Обменять полубайты f 1 00 1110  dfff ffff   1,2
XOFWF f, d Исключающее "ИЛИ" (W or f-> d) 1 00 0110  dfff ffff Z 1,2

БИТОВЫЕ КОМАНДЫ

BCF     f. b Обнулить бит b в f 1 01 00bb bfff ffff   1,2
BSF     f, b Установить бит b в f 1 01 0lbb bfff ffff   1,2
BTFSC f, b Тест бита b в f, пропуск если "0" 1(2) 01 l0bb bfff ffff   3
BTFSS f, b Тест бита b в f пропуск если "1" 1(2) 01 11bb  bfff ffff   3

КОМАНДЫ С КОНСТАНТАМИ И КОМАНДЫ УПРАВЛЕНИЯ

ADDLW к Сложение (k + W — > W) 1 11 111x kkkk kkkk C,DC,Z  
ANDLW к Логическое "И" (k and W -> W) 1 11 1001 kkkk kkkk Z  
CALL   k Вызов подпрограммы k 2 10  0kkk  kkkk kkkk    
CLRWDT - Обнулить WDT 1 00 0000  0110 0100 TO,PD  
GOTO k Переход к адресу k 2 10 1kkk  kkkk kkkk    
IORLW k Логическое "ИЛИ" (К or W -> W) 1 11 1000  kkkk kkkk Z  
MOVLW k Пересылка (k — > W) 1 11 00xx  kkkk kkkk    
RETFIE - Возврат из прерывания 2 00 0000  0000 1001    
RETLW k Возврат с константой 2 11 01xx kkkk kkkk    
RETURN - Возврат из подпрограммы 2 00  0000  0000 1000    
SLEEP - Останов 1 00 0000 0110 0011 TO,PD  
SUBLW k Вычитание (k - W -> W) 1 11 110х kkkk kkkk C,DC,Z  
XORLW k Исключающее  "ИЛИ" (k or W->W) 1 11 1010  kkkk kkkk Z  

Примечание

1: Если регистр ввода/вывода изменяется, то исходным значением будет величина, считанная

непосредственно с контактов.

2: Если команда модифицирует регистр TMR0, то предделитель будет обнулен.

3: Если в счетчик программ записывается адрес (т.е. условие проверки «истина»), то команда

выполняется за два цикла. Второй цикл выполняется как команда NOP.


Рекомендуемая структура программы

для микроконтроллера PIC16F877

       list p=16f877                       ; директива определения процессора

       #include <p16f877.inc>                        ; подключение списока определений переменных

;процессора

           

       __CONFIG _CP_OFF & _WDT_ON & _BODEN_ON & _PWRTE_ON & _RC_OSC & _WRT_ENABLE_ON & _LVP_ON & _DEBUG_OFF & _CPD_OFF

 

; '__CONFIG'  - директива определения битов конфигурации процессора

 

;***** определение переменных

w_temp   EQU 0x70                  ; переменная для сохранения текущего состояния при

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

status_temp EQU                                  ; переменная для сохранения текущего состояния при

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

 

;**********************************************************************

                       ORG 0x000            ; размещение команд по адресу сброса процессора

                       clrf PCLATH           ; очистка старших бит счетчика команд

                     goto main               ; переход на основную программу

 

 

                       ORG 0x004          ; размещение команд по вектору прерывания

;процессора

                       movwf w_temp       ; сохранение текущего значения регистра W

                       movf STATUS,w   ; сохранение текущего значения регистра

;STATUS

                       movwf status_temp      

 

 

; прерывающая программа

 

 

                       movf status_temp,w; восстановление значения регистра STATUS

                       movwf STATUS           

                       swapf w_temp,f

                       swapf w_temp,w    ; восстановление значения регистра Ц

                       retfie                           ; возврат в основную программу

 

 

main

 

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

 

 

END             ; директива конца программы

 


 





Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: