WikiDer > Перечень инструкций PIC

PIC instruction listings

В ПОС Набор инструкций относится к набору инструкций, которые Технология микрочипов PIC или dsPIC микроконтроллер поддерживает. Инструкции обычно программируются в Флэш-память процессора и автоматически выполняется микроконтроллером при запуске.

Чипы PICmicro имеют Гарвардская архитектура, а слова-инструкции имеют необычный размер. Первоначально 12-битные инструкции включали 5 адресных битов для указания операнда памяти и 9-битных пунктов назначения ветвления. В более поздних версиях добавлены биты кода операции, что позволяет использовать дополнительные биты адреса.

В следующих таблицах набора команд номера регистров обозначены как «f», а константы - как «k». Битовые номера (0–7) выбираются буквой «b». Бит «d» выбирает место назначения: 0 указывает W, а 1 указывает, что результат записывается обратно в исходный регистр f. Флаги состояния C и Z могут быть установлены на основе результата; в противном случае они не изменяются. Команды сложения и вычитания (но не вращения), которые устанавливают C, также устанавливают флаг DC (перенос цифр), перенос с бита 3 на бит 4, что полезно для BCD арифметика.

Архитектура

Операнды памяти также называются «регистрами». Большинство из них представляют собой просто универсальное хранилище (ОЗУ), а некоторые места зарезервированы для регистры специальных функций. За исключением одного аккумулятора (называемого W), почти все другие регистры отображаются в памяти, даже регистры, такие как счетчик команд и ALU регистр статуса. (Другими исключениями, которые не отображаются в памяти, являются стек адресов возврата и три государства регистры, используемые для настройки GPIO булавки.)

Набор команд не содержит инструкций условного перехода. Вместо этого он содержит инструкции условного пропуска, из-за которых следующая инструкция игнорируется. Условный переход, за которым следует безусловный переход, выполняет условный переход. Инструкции пропуска проверяют любой бит любого регистра. Регистр состояния ALU - это одна из возможностей.

Операнды памяти указаны абсолютный адрес; местоположение зафиксировано в время компиляции. Для обеспечения косвенной адресации предусмотрена пара регистров специальных функций:

  • В выбор файла регистр (FSR) записывается с адресом желаемого операнда памяти, после которого
  • В косвенный файл регистр (INDF) становится псевдоним для операнда указал на ФСР.

Этот механизм также позволяет адресовать до 256 байт памяти, даже если набор команд допускает только 5- или 7-битные операнды памяти. Модели с большим количеством регистров (регистры специальных функций плюс ОЗУ), чем помещается в инструкции, предоставляют несколько банков памяти и используют один из двух механизмов для доступа к ним:

  1. Большинство базовых базовых устройств и некоторые базовые устройства среднего уровня используют старшие биты регистра выбора файла для выбора текущего банка регистров.
  2. Более свежие модели имеют отдельный регистр выбора банка, а MOVLB инструкция по установке.

Процессоры PIC с объемом программы более 256 слов используют выгружаемую память. Внутренний программный счетчик и стек возврата имеют такую ​​ширину, которая необходима для адресации всей памяти, но только 8 младших битов видны программному обеспечению в PCL («Низкий уровень ПК») регистр. Есть дополнительная PCLATH ("PC latch high") регистр, который изменяется только программно. Любая операция, в которой не указан полный адрес назначения (например, 9-битный ИДТИ К или 8-битная запись в регистр PC) заполняет дополнительные старшие биты из соответствующей части PCLATH. (Некоторые процессоры PIC18 расширяют это значение за пределы 16 бит с регистром PCLATU для передачи битов 16–23.)

Базовые основные устройства (12 бит)

12-битный набор инструкций PIC
1
1
1
0

9

8

7

6

5

4

3

2

1

0
МнемоническийC
?
Z
?
Описание
0000000код операцииРазные инструкции
000000000000NOPНет работы (MOVW 0, W)
000000000010ВАРИАНТСкопируйте W в регистр OPTION
000000000011СПАТЬПерейти в режим ожидания
000000000100CLRWDTПерезапустить сторожевой таймер
0000000001жТРИС жСкопируйте W в трехсторонний регистр (ж = 1, 2 или 3)
000000010kMOVLB k*Установите регистр выбора банка на k
000000011110ВОЗВРАЩАТЬСЯВозврат из подпрограммы, W без изменений
000000011111РЕТФИВозврат из прерывания; вернуть и разрешить прерывания
00код операцииdрегистрОперации ALU: dest ← OP (f, W)
0000001жMOVWF жf ← ​​W
000001dжCLR ж,dZdest ← 0, обычно пишется CLRW или CLRF ж
000010dжSUBWF ж,dCZdest ← f − W (dest ← f + ~ W + 1)
000011dжDECF ж,dZdest ← f − 1
000100dжIORWF ж,dZdest ← f | W, включающее логическое или
000101dжANDWF ж,dZdest ← f & W, логический и
000110dжXORWF ж,dZdest ← f ^ W, логическое исключающее или
000111dжADDWF ж,dCZdest ← f + W
001000dжMOVF ж,dZdest ← f
001001dжКОМФ ж,dZdest ← ~ f, поразрядное дополнение
001010dжINCF ж,dZdest ← f + 1
001011dжDECFSZ ж,ddest ← f − 1, пропустить, если ноль
001100dжRRF ж,dCdest ← ПЕРЕНОСИТЬ << 7 | f >> 1, вращение вправо через перенос
001101dжRLF ж,dCdest ← F << 1 | ПЕРЕНОСИТЬ, повернуть влево через перенос
001110dжSWAPF ж,ddest ← f << 4 | f >> 4, поменять местами полубайты
001111dжINCFSZ ж,ddest ← f + 1, пропустить, если ноль
01opcкусочекрегистрБитовые операции
0100кусочекжBCF ж,бОчистить бит b из f
0101кусочекжBSF ж,бУстановить бит b из f
0110кусочекжBTFSC ж,бПропустить, если бит b из f очищен
0111кусочекжBTFSS ж,бПропустить, если установлен бит b функции f
10opckКонтрольные переводы
1000kRETLW kУстановите W ← k, затем вернитесь из подпрограммы
1001kВЫЗОВ kПодпрограмма вызова, 8-битный адрес k
101kИДТИ К kПерейти к 9-битному адресу k[1]
11opc8-битный немедленныйОперации с W и 8-битным литералом: W ← OP (k, W)
1100kMOVLW kW ← k
1101kIORLW kZW ← k | W, побитовое логическое или
1110kANDLW kZW ← k & W, побитовое и
1111kXORLW kZW ← k ^ W, побитовое исключающее или
1
1
1
0

9

8

7

6

5

4

3

2

1

0
МнемоническийC
?
Z
?
Описание

*: Расширенная инструкция, недоступна на большинстве 12-битных PIC. Большинство моделей с расширенным ОЗУ (например, 16C5x, 16F5x) расширяют адресное пространство регистров, используя старшие биты FSR. Некоторые (например, PIC12F529T39A) имеют отдельный регистр выбора банка, который можно установить с помощью этой инструкции.
†: Расширенная инструкция, доступна только для PIC с «улучшенным базовым уровнем». Только очень немногие модели (16F527, 16F570, MCV20A) с поддержкой прерываний (и 4-уровневый стек) включают эти инструкции. Все такие модели также включают MOVLB.

Клоны ELAN Microelectronics (13 бит)

ELAN Microelectronics Corp. создать серию микроконтроллеров, подобных PICmicro, с 13-битным командным словом.[2] Инструкции в основном совместимы с 14-битным набором команд среднего уровня, но ограничены 6-битным адресом регистра (16 специальных регистров и 48 байтов ОЗУ) и 10-битным (1024 слова) пространством программы.

10-битный программный счетчик доступен как R2. Читает доступ только к младшим битам, а записывает очищает старшие биты. Исключением является инструкция TBL, которая изменяет младший байт, сохраняя биты 8 и 9.

7 команд немедленного накопления перенумерованы относительно 14-битного PICmicro, чтобы уместиться в 3 бита кода операции, а не в 4, но все они есть, а также дополнительная инструкция программного прерывания.

Есть несколько дополнительных различных инструкций, и есть некоторые изменения в терминологии (регистр PICmicro OPTION называется регистром CONTrol; регистры PICmicro TRIS 1–3 называются регистрами управления вводом-выводом 5–7), но эквиваленты очевидный.

13-битный набор команд EM78[3][4]
1
2
1
1
1
0

9

8

7

6

5

4

3

2

1

0
МнемоническийC
?
Z
?
Описание
0000000код операцииРазные инструкции
0000000000000NOP*Нет работы (MOVW 0, W)
0000000000001DAACДесятичная корректировка после сложения
0000000000010ПРОДОЛЖЕНИЕ*Напишите регистр CONT (CONT ← W)
0000000000011СОН*Перейти в режим ожидания (WDT ← 0, остановить часы)
0000000000100WDTC*Перезапустить сторожевой таймер (WDT ← 0)
000000000жIOW жСкопируйте W в регистр управления вводом / выводом (ж = 5–7, 11–15)
0000000010000ENIРазрешить прерывания
0000000010001DISIОтключить прерывания
0000000010010RETВозврат из подпрограммы, W без изменений
0000000010011РЕТИВозврат из прерывания; вернуть и разрешить прерывания
0000000010100CONTRЧтение регистра CONT (W ← CONT)
000000001жIOR жСкопируйте регистр управления вводом / выводом в W (ж = 5–7, 11–15)
0000000100000TBLCZPCL + = W, сохранить PC-биты 8 и 9
00код операцииdрегистрОперации ALU такие же, как у 12- и 14-битных PIC
01opcкусочекрегистрБитовые операции такие же, как у 12- и 14-битных PIC
10ckПередача управления такая же, как у 14-битного PIC
11код операции8-битный немедленныйОперации с W и 8-битным литералом: W ← OP (k, W)
110opkMOV / IOR / AND / XOR, то же, что и 12-битный PIC
11100kRETLW kW ← k, затем вернуться из подпрограммы
11101kSUBLW kCZW ← k − W (W ← k + ~ W + 1)
111100kINT kPush PC, PC ← k (программное прерывание, обычно k = 1)
11111kADDLW kCZW ← k + W
111101код операцииkРасширения (заменяющие INT k за k≥128 на более поздних моделях)[4][5][6]
111101000kСТРАНИЦА kВыберите страницу ROM k (как MOVLP k)
111101001kБАНК kВыберите банк RAM k
111101010kLCALL kДлинный звонок с 17-битным адресом (инструкция из 2 слов)
111101011kLJMP kПереход в длину с 17-битным адресом (инструкция из 2 слов)
1111011жTBRD жЧтение ПЗУ в TBHP: TBLP в указанный регистр
1
2
1
1
1
0

9

8

7

6

5

4

3

2

1

0
МнемоническийC
?
Z
?
Описание

*: Тот же код операции, что и для 12-битного PIC
†: инструкция, уникальная для набора инструкций EM78 без эквивалента PIC

Некоторые модели поддерживают несколько банков ПЗУ или ОЗУ, как и другие микроконтроллеры PIC.

Существует также 15-битный вариант набора команд, который почти идентичен, за исключением того, что номера регистров увеличены до 8 бит, а адреса вызова и перехода увеличены до 12 бит. Прочие отличия:[7]

  • Инструкции CONTW, IOW, CONTR, IOR и INT удаляются,
  • Операции с 8-битным литералом имеют два 0 бита, добавленные как биты 8 и 9,
  • Расширения с 4-битным литералом имеют два нулевых бита, добавленных как биты 4 и 5, и
  • Инструкции PAGE и BANK переименовываются в SBANK и GBANK и выполняют переключение банка в регистрах специальных функций и ОЗУ общего назначения, соответственно.

Набор 15-битных инструкций второго поколения включает несколько дополнительных инструкций:

15-битные расширения набора команд EM78 / EM88[8][9]
1
4
1
3
1
2
1
1
1
0

9

8

7

6

5

4

3

2

1

0
МнемоническийC
?
Z
?
Описание
00000000код операцииРазные инструкции
000000000000000NOP*Нет работы (MOVW 0, W)
000000000000001DAA*CДесятичная корректировка после сложения
000000000000011СОН*Перейти в режим ожидания (WDT ← 0, остановить часы)
000000000000100WDTC*Перезапустить сторожевой таймер (WDT ← 0)
000000000000101MULW8 × 8 → 16-битное умножение
000000000000110DIVW8 ÷ 8 → 8,8-битное деление
000000000010000ENI*Разрешить прерывания
000000000010001DISI*Отключить прерывания
000000000010010RET*Возврат из подпрограммы, W без изменений
000000000010011РЕТИ*Возврат из прерывания; вернуть и разрешить прерывания
000000000010110ПЕРЕЗАГРУЗИТЬСброс программного обеспечения
000000000010111TBWRЗапись Flash ROM
000000001kINT kПрограммное прерывание по адресу 2 × k
00000001кусочекжBTG ж,бИнвертировать (переключить) бит b из f (ограниченный диапазон адресов)
00код операцииdрегистрОперации ALU такие же, как у EM78 и PIC
01opcкусочекрегистрБитовые операции такие же, как у EM78 и PIC
10ckПередача управления такая же, как у EM78 и 14-битного PIC
11код операции008-битный немедленныйОперации с 8-битным литералом такие же, как у EM78 (кроме INT)
11код операциизарегистрироваться или немедленноРасширения набора инструкций
1100001жJE рПропустить, если W = f
1100010жJGE рПропустить, если W> f
1100011жJLE рПропустить, если W
1100101kJE kПропустить, если W = k
1100110k(зарезервированный)
1100111жTBRDA жПрочитать ROM в TBHP: TBLP в f; мбит в W
1101001kSJC адресПерейти на ПК + секст (k) если переносить
1101010kSJNC адресПерейти на ПК + секст (k) если несут ясно
1101011kSJZ адресПерейти на ПК + секст (k) если установлен нулевой флаг
1101101kSJNZ адресПерейти на ПК + секст (k) если нулевой флаг снят
110111dжRR ж/ RRAdest ← f << 7 | f >> 1, повернуть вправо без переноса
1110001жXCH жОбмен f ↔ W
111001dжRL ж/ RLAdest ← f << 1 | f >> 7, повернуть влево без переноса
1110101жMUL жPRODH: PRODL ← f × W
111011Иксk(зарезервированный)
111100dжSUBBCZdest ← f + ~ W + C, вычесть с переносом
11110100000kСБАНК k*Выбрать банк регистров специальных функций k
11110100100kGBANK k*Выберите банк RAM k
11110101000kLCALL k*Длинный звонок с 19-битным адресом (инструкция из 2 слов)
11110101100kLJMP k*Переход в длину с 19-битным адресом (инструкция из 2 слов)
1111011жTBRD ж*Прочтите ROM на TBHP: TBLP в f
1111101жNEG жCZf ← ​​−f (f ← ~ f + 1), отрицать
111111dжАЦП жCZdest ← f + W + C, добавить с переносом

*: Тот же код операции, что и 13-битный EM78
†: только на EM89F768N; операнды и результаты в специальных регистрах
‡: Только на EM88F794N, MTF213 и MTF351

Базовые устройства среднего уровня (14 бит)

Эти устройства имеют 14-битную кодовую память и улучшенный 8-уровневый стек вызовов. Набор команд очень мало отличается от базовых устройств, но 2 дополнительных бита кода операции позволяют напрямую адресовать 128 регистров и 2048 слов кода. Есть несколько дополнительных различных инструкций и две дополнительные 8-битные буквальные инструкции сложения и вычитания. Ядро среднего уровня доступно в большинстве устройств с маркировкой PIC12 и PIC16.

14-битный набор инструкций PIC
1
3
1
2
1
1
1
0

9

8

7

6

5

4

3

2

1

0
МнемоническийC
?
Z
?
Описание
0000000код операцииРазные инструкции
00000000000000NOPНет работы (MOVW 0, W)
00000000001000ВОЗВРАЩАТЬСЯВозврат из подпрограммы, W без изменений
00000000001001РЕТФИВозврат из прерывания
00000001100010ВАРИАНТСкопируйте W в регистр OPTION (не рекомендуется)
00000001100011СПАТЬПерейти в режим ожидания
00000001100100CLRWDTПерезапустить сторожевой таймер
000000011001жТРИС жСкопируйте W в трехсторонний регистр (ж = 1, 2 или 3) (не рекомендуется)
00код операцииdрегистрОперации ALU: dest ← OP (f, W)
0000001жMOVWF жf ← ​​W
000001dжCLR ж,dZdest ← 0, обычно пишется CLRW или CLRF ж
000010dжSUBWF ж,dCZdest ← f − W (dest ← f + ~ W + 1)
000011dжDECF ж,dZdest ← f − 1
000100dжIORWF ж,dZdest ← f | W, включающее логическое или
000101dжANDWF ж,dZdest ← f & W, логический и
000110dжXORWF ж,dZdest ← f ^ W, логическое исключающее или
000111dжADDWF ж,dCZdest ← f + W
001000dжMOVF ж,dZdest ← f
001001dжКОМФ ж,dZdest ← ~ f, поразрядное дополнение
001010dжINCF ж,dZdest ← f + 1
001011dжDECFSZ ж,ddest ← f − 1, пропустить, если ноль
001100dжRRF ж,dCdest ← ПЕРЕНОСИТЬ << 7 | f >> 1, вращение вправо через перенос
001101dжRLF ж,dCdest ← f << 1 | ПЕРЕНОСИТЬ, повернуть влево через перенос
001110dжSWAPF ж,ddest ← f << 4 | f >> 4, поменять местами полубайты
001111dжINCFSZ ж,ddest ← f + 1, пропустить, если ноль
01opcкусочекрегистрБитовые операции
0100кусочекжBCF ж,бОчистить бит b из f
0101кусочекжBSF ж,бУстановить бит b из f
0110кусочекжBTFSC ж,бПропустить, если бит b из f очищен
0111кусочекжBTFSS ж,бПропустить, если установлен бит b функции f
10ckКонтрольные переводы
100kВЫЗОВ kПодпрограмма вызова
101kИДТИ К kПерейти к адресу k
11код операции8-битный немедленныйОперации с W и 8-битным литералом: W ← OP (k, W)
1100ИксИксkMOVLW kW ← k
1101ИксИксkRETLW kW ← k, затем вернуться из подпрограммы
111000kIORLW kZW ← k | W, побитовое логическое или
111001kANDLW kZW ← k & W, побитовое и
111010kXORLW kZW ← k ^ W, побитовое исключающее или
111011k(зарезервированный)
11110ИксkSUBLW kCZW ← k − W (назначение ← k + ~ W + 1)
11111ИксkADDLW kCZW ← k + W
1
3
1
2
1
1
1
0

9

8

7

6

5

4

3

2

1

0
МнемоническийC
?
Z
?
Описание

Усовершенствованные базовые устройства среднего уровня (14 бит)

Усовершенствованные базовые устройства среднего уровня включают более глубокий аппаратный стек, дополнительные методы сброса, 14 дополнительных инструкций и Язык программирования C оптимизации.[10] Особенно. есть два Регистры INDF (INDF0 и INDF1), и два соответствующих FSR регистровые пары (FSRпL и FSRпЧАС). Особые инструкции по применению FSRп регистры, такие как регистры адресов, с различными режимы адресации.

14-битные расширенные дополнительные инструкции PIC
1
3
1
2
1
1
1
0

9

8

7

6

5

4

3

2

1

0
МнемоническийC
?
Z
?
Описание
0000000код операцииРазные инструкции
00000000000001ПЕРЕЗАГРУЗИТЬСброс программного обеспечения
00000000001010CALLWНажмите PC, затем перейдите к PCLATH: W
00000000001011BRWПК ← ПК + W, относительный прыжок с помощью W
00000000010п00MOVIW ++ FSRпZПриращение FSRп, то W ← INDFп
00000000010п01MOVIW −−FSRпZУменьшение FSRп, то W ← INDFп
00000000010п10MOVIW FSRп++ZW ← INDFп, затем увеличить FSRп
00000000010п11MOVIW FSRп−−ZW ← INDFп, затем уменьшаем FSRп
00000000011пмMOVWI с использованием FSRпINDFп ← W, те же режимы, что и MOVIW
000000001kMOVLB kBSR ← k, переместить литерал в регистр выбора банка
11код операцииdрегистрОперации ALU: dest ← OP (f, W)
110101dжLSLF ж,dCZdest ← ж << 1, логический сдвиг влево
110110dжLSRF ж,dCZdest ← ж >> 1, логический сдвиг вправо
110111dжASRF ж,dCZdest ← ж >> 1, арифметический сдвиг вправо
111011dжSUBWFB ж,dCZdest ← ж + ~ W + C, вычесть с переносом
111101dжADDWFC ж,dCZdest ← ж + W + C, добавить с переносом
11код операцииkОперации с буквальным k
1100010пkADDFSR FSRп,kFSRп ← FSRп + k, добавить 6-битное смещение со знаком
1100011kMOVLP kPCLATH ← k, переместить 7-битный литерал в высокий уровень защелки ПК
11001kБЮСТГАЛЬТЕР kPC ← PC + k, относительная ветвь с использованием 9-битного смещения со знаком
1111110пkMOVIW k[FSRп]ZW ← [FSRп+k], 6-битное смещение со знаком
1111111пkMOVWI k[FSRп][FSRп+k] ← W, 6-битное смещение со знаком
1
3
1
2
1
1
1
0

9

8

7

6

5

4

3

2

1

0
МнемоническийC
?
Z
?
Описание

Клоны Holtek (14 или 16 бит)

Холтек создавать многочисленные 8-битные микроконтроллеры с 14-битным командным словом, эквивалентным (не расширенному) ядру среднего уровня. Все кодировки команд умещаются в 14 бит и обеспечивают 7-битные адреса операндов, но модели с 4K или 8K слов программного ПЗУ предоставляют 15- или 16-битное ПЗУ и расширяют базовый 11-битный адрес назначения, используя биты 14-15 инструкция как биты 11–12 адреса. Некоторые модели расширяют 7-битные адреса ОЗУ, используя бит 14 инструкции как бит 7 адреса операнда.

Формат команд идентичен формату Microchip, но коды операций назначаются в другом порядке, а производитель использует другую мнемонику команд. Аккумулятор называется ACC, а не W, и место назначения указывается суффиксом мнемоники инструкции, а не операндом.

Помимо назначения кода операции, есть семантические различия в нескольких инструкциях:

  • Команды вычитания вычитают операнд из аккумулятора, а команды вычитания Microchip делают обратное. (Это делает команду немедленного вычитания излишней, так как это эквивалентно сложению отрицательного числа.)
  • Инструкции перехода к аккумулятору и очистки не изменяют никаких флагов.

В репертуар 14-битного PICmicro добавлено несколько операций:

  • Поверните на один бит влево и вправо без нести,
  • Установить операнд на все единицы,
  • Пропустить, если операнд равен нулю (без предварительного увеличения или уменьшения),
  • Сложить и вычесть с переносом,
  • Десятичная корректировка после сложения, для двоично-десятичный код арифметика и
  • Чтение из ПЗУ программы для поиска в таблице. Он использует регистры TBHP и TBLP в качестве 16-битного указателя, выбирает слово и сохраняет младший байт в указанном месте. Старшие 6–8 битов выбранного слова хранятся в регистре TBLH. Вторая форма использует только TBLP и читает с самой высокой 256-байтовой страницы в ПЗУ.
  • Большинство моделей поддерживают вторую инструкцию для сброса сторожевого таймера, которая должна чередоваться с первой; повторения одной инструкции игнорируются. Это позволяет запускать две независимые программы сторожевого таймера, и отказ любой из них запускает сторожевой таймер.
  • Holtek предоставляет два регистра косвенной адресации, например, улучшенный 14-битный PIC. Некоторые модели (например, HT66F70A) имеют три.
14-битный набор команд Holtek[11]
1
3
1
2
1
1
1
0

9

8

7

6

5

4

3

2

1

0
МнемоническийPIC экв.C
?
Z
?
Описание
00000000000код операцииРазные инструкции
00000000000000NOPNOPНет операции (MOV A, A)
00000000000001CLR WDT1CLRWDTПерезапустить сторожевой таймер
00000000000010HALTСПАТЬПерейти в режим пониженного энергопотребления
00000000000011RETВОЗВРАЩАТЬСЯВозврат из подпрограммы
00000000000100РЕТИРЕТФИВозврат из прерывания
00000000000101CLR WDT2Перезапустить сторожевой таймер
00код операцииdадресОперации ALU: dest ← OP (ACC, [m])
0000001мMOV [м], АMOVWF м[м] ← ACC
000001dмCPLA / CPL [м]КОМФ м,dZdest ← ~ [m], поразрядное дополнение
000010dмПОД / ПОДМ А, [м]≠ SUBWF м,dCZпункт назначения ← ACC - [m] (пункт назначения ← ACC + ~ [m] +1)
000011dмДОБАВИТЬ / ДОБАВИТЬ A, [м]ADDWF м,dCZdest ← ACC + [м]
000100dмXORA / XOR [м]XORWF м,dZdest ← ACC ^ [m], логическое исключающее или
000101dмORA / OR [м]IORWF м,dZdest ← ACC | [m], логический включающий или
000110dмANDA / И [м]ANDWF м,dZdest ← ACC & [m], логический и
0001110мMOV A, [м]≈MOVF м,0ACC ← [м]
0001111м≈MOVF м,1[м] ← [м]
001код операции8-битный немедленныйОперации с 8-битным литералом: ACC ← OP (ACC, k)
001000k(зарезервированный)
001001kRET A,kRETLW kACC ← k, затем вернуться из подпрограммы
001010kSUB A,k≠ SUBLW kCZACC ← ACC - k (ACC ← ACC + ~ k + 1)
001011kДОБАВИТЬ,kADDLW kCZАКК ← АКК + К
001100kXOR A,kXORLW kZACC ← ACC ^ k, логическое исключающее ИЛИ
001100kИЛИ А,kIORLW kZACC ← ACC | k, логический включающий или
001100kИ А,kANDLW kZACC ← ACC & k, логические и
001100kMOV A,kMOVLW kАКК ← k
01код операцииdадресОперации ALU: dest ← OP (ACC, [m])
010000dмSZA / SZ [м]dest ← [m], пропустить следующую инструкцию, если ноль
010001dмСВОП / СВОП [м]SWAPF м,ddest ← [m] << 4 | [m] >> 4, поменять местами полубайты
010010dмSBC / SBCM A, [м]≠ SUBWFB м,dCZdest ← ACC + ~ [m] + C, вычесть с переносом
010011dмАЦП / АЦП А, [м]ADDWFC м,dCZdest ← ACC + [m] + C, добавить с переносом
010100dмINCA / INC [м]INCF м,dZdest ← [m] + 1
010101dмDECA / DEC [м]DECF м,dZdest ← [m] - 1
010110dмРАЗМЕР / РАЗМЕР [м]INCFSZ м,ddest ← [m] + 1, пропустить, если ноль
010111dмSDZA / SDZ [м]DECFSZ м,ddest ← [m] - 1, пропустить, если ноль
011000dмRLA / RL [м]dest ← [m] << 1 | м >> 7, повернуть влево на 1 бит
011001dмRRA / RR [м]dest ← [m] << 7 | м >> 1, повернуть вправо на 1 бит
011010dмRLCA / RLC [м]RLF м,dCdest ← [m] << 1 | C, повернуть влево через перенос
011011dмRRCA / RRC [м]RRF м,dCdest ← C << 7 | [m] >> 1, повернуть вправо через перенос
0111код операцииадресОтдельные операции: [м] ← специальные
011100Иксм(зарезервированный)
0111010мTABRDC [м]TBLH: [m] ← ПЗУ на TBHP: TBLP, поиск в таблице
0111011мTABRDL [м]

Прочитать с последней страницы ПЗУ по адресу 0xff: TBLP

0111100м(зарезервированный)
0111101мDAA [м]C[m] ← DAA (ACC), десятичная корректировка после добавления BCD
0111110мCLR [м]≈CLRF м[м] ← 0
0111111мНАБОР [м][м] ← 255
10ckКонтрольные переводы
100kВЫЗОВ kВЫЗОВ kПодпрограмма вызова
101kJMP kИДТИ К kПерейти к адресу k
11opcкусочекадресБитовые операции
1100кусочекмНАБОР [м].бBSF м,бУстановить бит b [m]
1101кусочекмCLR [м].бBCF м,бОчистить бит b [m]
1110кусочекмSNZ [м].бBTFSS м,бПропустить, если установлен бит b [m]
1111кусочекмSZ [м].бBTFSC м,бПропустить, если бит b [m] очищен
1
3
1
2
1
1
1
0

9

8

7

6

5

4

3

2

1

0
МнемоническийPIC экв.C
?
Z
?
Описание

Микроконтроллеры Padauk (13, 14, 15 или 16 бит)

Padauk Technology Co., Ltd. сделать серию PIC-подобных микроконтроллеров, отличающихся чрезвычайно низкой стоимостью, начиная с 0,033 доллара США в количестве,[12] многие модели стоят меньше 0,10 доллара США.[13]

Хотя очевидно, что это происходит из PIC, есть некоторые существенные различия:

  • Они не используют механизм FSR / INDF для выполнения косвенного доступа к памяти, вместо этого имеют инструкции косвенной загрузки и сохранения, которые используют произвольное расположение ОЗУ в качестве указателя;
  • они используют стек вызовов на основе RAM с регистром указателя стека;
  • то нести флаг использует соглашение о «битах заимствования» для вычитания, а не соглашение о «битах переноса», используемое Microchip;
  • они также включают подписанный флаг переполнения, который, как и перенос цифр, устанавливается командами сложения, вычитания и сравнения (каждая инструкция, которая устанавливает флаг переноса Кроме для смены инструкций);
  • у них есть отдельные адресные пространства ОЗУ и регистров ввода / вывода (64 и 32 байта соответственно в 13-битном наборе команд);
  • битовые операции ограничены пространством ввода-вывода и первыми 16 адресами RAM;
  • однооперандные инструкции с источником памяти и назначением аккумулятора опускаются;
  • предоставляются однооперандные инструкции с источником и получателем аккумулятора;
  • операции вычитания вычисляют назначение - источник, обменивая входные операнды в зависимости от назначения;
  • они работают быстрее, требуя 1 цикла для большинства инструкций и 2 цикла для передачи управления; и
  • некоторые модели поддерживают временная многопоточность, имеющий несколько контекстов выполнения, выполнение которых чередуется.
13-битный набор инструкций Padauk[14][15]
1
2
1
1
1
0

9

8

7

6

5

4

3

2

1

0
МнемоническийПОС
эквивалент
C
?
Z
?
Описание
000000000код операцииРазные инструкции
0000000000000NOPNOPНет операции
0000000000001(зарезервированный)
000000000001Икс(зарезервированный)
000000000010Икс(зарезервированный)
0000000000110ЛДСПТЛA ← ROM [[SP]], загрузка младшего / старшего байта слова ROM с использованием 16-битного указателя поверх стека
0000000000111ЛДСПТН
0000000001(зарезервированный)
000000001код операцииОднооперандные инструкции для аккумулятора
То же, что и инструкции с одним операндом для памяти (ниже), за исключением
0000000010111PCADD A≈ADDWF PCL, 1ПК ← ПК + A, добавить в счетчик программ
0000000011110СВОП АA ← A << 4 | A >> 4, поменять местами полубайты
000000010(зарезервированный)
000000011код операцииИнструкции по управлению системой
0000000110000WDRESETCLRWDTПерезапустить сторожевой таймер
0000000110001(зарезервированный)
0000000110010ПУШАФНажмите A, затем отметьте флагом наверху стека
0000000110011ПОПАФCZВыдвигайте флаги, затем A сверху стека
0000000110100(зарезервированный)
0000000110101ПЕРЕЗАГРУЗИТЬПЕРЕЗАГРУЗИТЬСброс программного обеспечения
0000000110110СТОПСИССПАТЬПерейти в режим ожидания (часы остановлены)
0000000110111СТОПЕКСПерейти в режим ожидания (часы идут)
0000000111000ДВИГАТЕЛЬBSF INTCON, GIEРазрешить прерывания
0000000111001DISGINTBCF INTCON, GIEОтключить прерывания
0000000111010RETВОЗВРАЩАТЬСЯВозврат из подпрограммы, без изменений
0000000111011РЕТИРЕТФИВозврат из прерывания
0000000111100MULMULRH: A ← A × MULOP (не для всех моделей)
0000000111101(зарезервированный)
000000011111Икс(зарезервированный)
00000код операцииioaddrБайтовые операции ввода-вывода
00000011ioaddrXOR ioaddr, АIO [ioaddr] ← A ^ IO [адрес]
00000100ioaddrMOV ioaddr, АIO [ioaddr] ← A
00000101ioaddrMOV A,ioaddrZA ← IO [ioaddr]
0000011cадресc16-битные операции (даже адрес ОЗУ ограничен)
00000110адрес0STT16 адресTimer16 ← [адрес]
00000110адрес1LDT16 адрес[адрес] ← Таймер16
00000111адрес0IDXM адрес, А[[адрес]] ← A, косвенный адрес памяти
00000111адрес1IDXM A,адресA ← [[адрес]], косвенный адрес памяти
00001kВернуть буквальную константу
00001kRET kRETLW kA ← k, затем вернитесь из подпрограммы
0001cкусочекcадресБитовые операции с ОЗУ (только первые 16 байт)
00010кусочек0адресT0SN адрес.бBTFSC адрес,бПропустить, если бит б из [адрес] чисто
00010кусочек1адресT1SN адрес.бBTFSS адрес,бПропустить, если бит б из [адрес] установлен
00011кусочек0адресSET0 адрес.бBCF адрес,бОчистить бит б из [адрес]
00011кусочек1адресSET1 адрес.бBSF адрес,бУстановить бит б из [адрес]
001dкод операцииадресОперации ALU между A и памятью
0010000адресДОБАВИТЬ адрес, АADDWF адрес,1CZ[адрес] ← [адрес] + A
0010001адресSUB адрес, АSUBWF адрес,1CZ[адрес] ← [адрес] - А
0010010адресADDCадрес, АADDWFC адрес,1CZ[адрес] ← [адрес] + A + C
0010011адресSUBCадрес, А≈SUBWFBадрес,1CZ[адрес] ← [адрес] - А - С
0010100адресИ адрес, АANDWF адрес,1Z[адрес] ← [адрес] & A, логический и
0010101адресИЛИ ЖЕ адрес, АIORWF адрес,1Z[адрес] ← [адрес] | A, логический включающий или
0010110адресXOR адрес, АXORWF адрес,1Z[адрес] ← [адрес] ^ A, логическое исключающее или
0010111адресMOV адрес, АMOVWF адрес[адрес] ← A
0011000адресДОБАВИТЬ,адресADDWF адрес,0CZA ← A + [адрес]
0011001адресSUB A,адрес≠ SUBWF адрес,0CZA ← A - [адрес]
0011010адресADDC A,адресADDWFC адрес,0CZA ← A + [адрес] + C
0011011адресSUBC A,адрес≠ SUBWFBадрес,0CZA ← A - [адрес] - C
0011100адресИ А,адресANDWF адрес,0ZA ← [A] и [адрес], логичный и
0011101адресИЛИ А,адресIORWF адрес,0ZA ← A | [адрес], логическое включающее или
0011110адресXOR A,адресXORWF адрес,0ZA ← A ^ [адрес], логическое исключающее или
0011111адресMOV A,адресMOVF адрес,0ZA ← [адрес]
010код операцииадресОднооперандные операции с памятью
0100000адресADDC адресCZ[адрес] ← [адрес] + C
0100001адресSUBC адресCZ[адрес] ← [адрес] - C
0100010адресИЗСН адресINCFSZ адрес,1CZ[адрес] ← [адрес] + 1, пропустить, если ноль
0100011адресДЗСН адресDECFSZ адрес,1CZ[адрес] ← [адрес] - 1, пропустить, если ноль
0100100адресINC адресINCF адрес,1CZ[адрес] ← [адрес] + 1
0100101адресDEC адресDECF адрес,1CZ[адрес] ← [адрес] − 1
0100110адресЧИСТО адрес≈CLRF адрес[адрес] ← 0
0100111адресXCH адресA ← [адрес], [адрес] ← A
0101000адресНЕТ адресКОМФ адрес,1Z[адрес] ← ~[адрес], поразрядное дополнение
0101001адресNEG адресZ[адрес] ← −[адрес], отрицать
0101010адресSR адрес≈LSRF адрес,1C[адрес] ← [адрес] >> 1, логический сдвиг вправо
0101011адресSL адрес≈LSLF адрес,1C[адрес] ← [адрес] << 1, сдвиг влево
0101100адресSRC адресRRF адрес,1C[адрес] ← C << 7 | [адрес] >> 1, повернуть вправо через перенос
0101101адресSLC адресRLF адрес,1C[адрес] ← [адрес] << 1 | C, повернуть влево через перенос
0101110адресCEQSN адресCZВычислить A - [адрес], то пропускаем, если ноль
0101111адрес(зарезервированный)
011opcкусочекадресБитовые операции с вводом / выводом
01100кусочекадресT0SNioaddr.бBTFSC ioaddr,бПропустить, если бит б из [ioaddr] чисто
01101кусочекадресT1SNioaddr.бBTFSS ioaddr,бПропустить, если бит б из [ioaddr] установлен
01110кусочекадресSET0 ioaddr.бBCF ioaddr,бОчистить бит б из [ioaddr]
01111кусочекадресSET1 ioaddr.бBSF ioaddr,бУстановить бит б из [ioaddr]
10код операциибуквальныйБуквальные операции: A ← OP (A,k)
10000kДОБАВИТЬ,kADDLW kCZA ← A + k
10001kSUB A,k≠ SUBLW kCZA ← A - k
10010kCEQSN A,kCZВычислить A - k, то пропускаем, если ноль
10011k(зарезервированный)
10100kИ А,k≈ANDLW kZA ← A & k
10101kИЛИ А,k≈IORLW kZA ← A | k
10110kXOR A,k≈XORLW kZA ← A ^ k
10111kMOV A,kMOVLW kA ← k
11ckУправляющие передачи: ПК ← k
110kИДТИ К kИДТИ К kПК ← k
111kВЫЗОВ kВЫЗОВ kНажмите ПК, затем ПК ← k
1
2
1
1
1
0

9

8

7

6

5

4

3

2

1

0
МнемоническийПОС
эквивалент
C
?
Z
?
Описание

Наборы 14-, 15- и 16-битных инструкций в основном отличаются наличием более широких полей адреса, хотя некоторые изменения кодировки сделаны, чтобы позволить несколько дополнительных инструкций (например, CNEQSN, который выполняет сравнение и пропускает, если нет равный.)

14-битный набор инструкций Padauk[16][17][18]
1
3
1
2
1
1
1
0

9

8

7

6

5

4

3

2

1

0
МнемоническийПОС
эквивалент
C
?
Z
?
Описание
0000000000код операцииПрочие инструкции такие же, как 13-битный
0000000001(зарезервированный)
000000001(зарезервированный)
000000010(зарезервированный)
0000000110код операцииИнструкции с одним операндом на A такие же, как 13-битные
0000000111код операцииИнструкции по управлению системой такие же, как для 13-битных
00000010(зарезервированный)
00000код операцииадресОперации ввода-вывода для байтов такие же, как для 13-битных, но коды операций изменены
00000011ioaddrXOR ioaddr, АIO [ioaddr] ← A ^ IO [адрес]
0000010(зарезервированный)
00000110ioaddrMOV ioaddr, АIO [ioaddr] ← A
00000111ioaddrMOV A,ioaddrZA ← IO [ioaddr]
000010kВозвращает литеральную константу как 13-битную
000011cадресc16-битные операции такие же, как 13-битные, но 128-байтовый диапазон
00010кусочекадресКопировать бит в I / O
00010кусочекадресSWAPCioaddr.бCОбменять перенос с помощью [ioaddr] кусочек б
00011cdадресДополнительные операции с двумя операндами
0001100адресКОМП А,адресCZA - [адрес], флаги установлены, результат отброшен
0001101адресКОМП адрес, АCZ[адрес] - A, флаги установлены, результат отброшен
0001110адресНАДД А,адресSUBWFадрес,0CZA ← [адрес] + −A (A ← [адрес] + ~ A + 1)
0001111адресНАДД адрес, АCZ[адрес] ← A + - [адрес] ([адрес] ← A + ~ [адрес] + 1)
001dкод операцииадрес2-операндные инструкции такие же, как 13-битные
010код операцииадресОперации с одним операндом в памяти такие же, как 13-битные, плюс CNEQSN
0101111адресCNEQSN адресCZВычислить A - [адрес], затем пропустить, если не ноль
011opcкусочекioaddrБитовые операции с вводом / выводом такие же, как 13-битные
100opcкусочекадресБитовые операции с памятью такие же, как 13-битные, но с 64-байтовым диапазоном
101код операциибуквальныйБуквальные операции такие же, как 13-бит, плюс CNEQSN
101011kCNEQSN A,kCZВычислить A - k, то пропускаем, если не ноль
11ckПередачи управления такие же, как 13-битные
1
13
1
2
1
1
1
0

9

8

7

6

5

4

3

2

1

0
МнемоническийПОС
эквивалент
C
?
Z
?
Описание

Высокопроизводительные базовые устройства PIC18 (16 бит)

В 2000 году Microchip представила архитектуру PIC18.[2] В отличие от 17-й серии, она оказалась очень популярной, в настоящее время в производстве находится большое количество вариантов устройств. В отличие от более ранних устройств, которые чаще всего программировались на ассемблере, C стал преобладающим языком разработки.[19]

PIC18 имеет 12-битное адресное пространство RAM, разделенное на 16 страниц по 256 байтов. 8-битный ж поле определяет адрес в сочетании с а бит и 4-битный регистр выбора банка (BSR). Если а= 0, BSR игнорируется и ж поле расширяется знаком до диапазона 0x000–0x07F (глобальная RAM) или 0xF80–0xFFF (регистры специальных функций). Если а= 1, ж поле расширяется BSR для генерации 12-битного адреса.

PIC18 расширяет FSR/INDF Механизм, используемый в предыдущих процессорах PICmicro для косвенной адресации двумя способами:

Во-первых, он обеспечивает три регистры выбора файла. В FSRп регистры имеют длину 12 бит (каждый разделен на две 8-битные части FSR0L через FSR2H) и доступ к соответствующему INDFп регистр (INDF0 через INDF2) действует как псевдоним для адресуемого байта.

Во-вторых, это режимы адресации. Для каждого из трех не только один INDFп регистр, но пять, а используемый определяет режим адресации:

  • INDFп: Доступ к байту в местоположении FSRп
  • ПОСТДЕКп: Доступ к байту в FSRп, затем уменьшаем FSRп
  • POSTINCп: Доступ к байту в FSRп, затем увеличить FSRп
  • PREINCп: Приращение FSRп, затем получить доступ к байту с увеличенным FSRп
  • PLUSWп: Доступ к байту в FSRп + W (индексированная адресация).

Также есть инструкции для прямой загрузки пары FSR с 12-битным адресом и MOVFF инструкция, которая перемещает байт между двумя 12-битными адресами.

Набор 16-битных команд PIC18[20]
1
5
1
4
1
3
1
2
1
1
1
0

9

8

7

6

5

4

3

2

1

0
МнемоническийC
?
Z
?
N
?
Описание
00000000код операцииРазные инструкции
0000000000000000NOPНет операции
0000000000000011СПАТЬПерейти в режим ожидания
0000000000000100CLRWDTПерезапустить сторожевой таймер
0000000000000101ТОЛКАТЬВставить ПК в верхнюю часть стека
0000000000000110ПопВставить (и сбросить) верх стека
0000000000000111DAWCДесятичная регулировка W
0000000000001000TBLRD ∗Таблица гласит: TABLAT ← mem [TBLPTR]
0000000000001001TBLRD ∗ +Таблица, прочитанная с постинкрементом
0000000000001010TBLRD ∗ -Таблица, прочитанная с постдекрементом
0000000000001011TBLRD + ∗Таблица читается с предварительным приращением
00000000000011модTBLWRЗапись таблицы, те же режимы, что и TBLRD
000000000001000sРЕТФИ [, БЫСТРО]Возврат из прерывания
000000000001001sВОЗВРАТ [, БЫСТРО]Возврат из подпрограммы
0000000000010100CALLW*Нажмите PC, перейдите к PCLATU: PCLATH: W
0000000011111111ПЕРЕЗАГРУЗИТЬ000Сброс программного обеспечения
00000001—0—kMOVLBПереместить буквальный k в банк выбрать регистр
00001код операциибуквальныйБуквальные операции: W ← OP (k, W)
00001000kSUBLW kW ← k - W
00001001kIORLW kW ← k | W, включающее логическое или
00001010kXORLW kW ← k ^ W, исключая или
00001011kANDLW kW ← k & W, логический и
00001100kRETLW kВОЗВРАТ W ← k
00001101kMULLW kW ← k × W
00001110kMOVLW kW ← k
00001111kADDLW kW ← k + W
0код операцииdарегистрОперации ALU: dest ← OP (f, W)
0000001ажMULWF ж,аPRODH: PRODL ← W × f (без знака)
000001dажDECF ж,d,аCZNdest ← f - 1
000100dажIORWF ж,d,аZNdest ← f | W, включающее логическое или
000101dажANDWF ж,d,аZNdest ← f & W, логический и
000110dажXORWF ж,d,аZNdest ← f ^ W, исключающий или
000111dажКОМФ ж,d,аZNdest ← ~ f, поразрядное дополнение
001000dажADDWFC ж,d,аCZNцель ← f + W + C
001001dажADDWF ж,d,аCZNdest ← f + W
001010dажINCF ж,d,аCZNdest ← f + 1
001011dажDECFSZ ж,d,аdest ← f - 1, пропустить, если 0
001100dажRRCF ж,d,аCZNdest ← f >> 1 | C << 7, повернуть вправо через перенос
001101dажRLCF ж,d,аCZNdest ← f << 1 | C, повернуть влево через перенос
001110dажSWAPF ж,d,аdest ← f << 4 | f >> 4, поменять местами полубайты
001111dажINCFSZ ж,d,аdest ← f + 1, пропустить, если 0
010000dажRRNCF ж,d,аZNdest ← f >> 1 | f << 7, повернуть вправо (без переноса)
010001dажRLNCF ж,d,аZNdest ← f << 1 | f >> 7, повернуть влево (без переноса)
010010dажИНФСНЗ ж,d,аdest ← f + 1, пропустить, если не 0
010011dажDCFSNZ ж,d,аdest ← f - 1, пропустить, если не 0
010100dажMOVF ж,d,аZNdest ← f
010101dажSUBFWB ж,d,аCZNdest ← W + ~ f + C (dest ← W - f - C̅)
010110dажSUBWFB ж,d,аCZNdest ← f + ~ W + C (dest ← f - W - C̅)
010111dажSUBWF ж,d,аCZNdest ← f - W (dest ← f + ~ W + 1)
0110код операцииарегистрОперации ALU, не писать в W
0110000ажCPFSLT ж,апропустить, если f
0110001ажCPFSEQ ж,апропустить, если f == W
0110010ажCPFSGT ж,апропустить, если f> W (без знака)
0110011ажTSTFSZ ж,апропустить, если f == 0
0110100ажSETF ж,аf ← ​​0xFF
0110101ажCLRF ж,а1f ← ​​0, PSR.Z ← 1
0110110ажNEGF ж,аCZNf ← ​​−f
0110111ажMOVWF ж,аf ← ​​W
0111кусочекажBTG ж,б,аПереключить бит b из f
10opcкусочекарегистрБитовые операции
1000кусочекажBSF ж,б,аУстановить бит b из f
1001кусочекажBCF ж,б,аОчистить бит b из f
1010кусочекажBTFSS ж,б,аПропустить, если установлен бит b функции f
1011кусочекажBTFSC ж,б,аПропустить, если бит b из f очищен
110opcадресОперации с большим адресом
1100источникMOVFF s,dАбсолютное перемещение
1111пункт назначения
11010пБЮСТГАЛЬТЕР пПереход к ПК + 2п
11011пRCALL пВызов подпрограммы на ПК + 2п
11100condпУсловный переход (на ПК + 2п)
11100000пBZ пПереход, если установлен PSR.Z
11100001пBNZ пПерейти, если ПСР.З очищен
11100010пдо н.э пПереход, если установлен PSR.C
11100011пBNC пПерейти, если PSR.C очищен
11100100пBOV пПереход, если установлен PSR.V
11100101пBNOV пПереход, если PSR.V очищен
11100110пBN пПереход, если установлен PSR.N
11100111пBNN пПереходить, если PSR.N ясен
111010opckРасширения для использования FSR2 в качестве указателя программного стека*
11101000пkADDFSR п,k*FSRn + = k
1110100011kADDULNK k*FSR2 + = k, поп-ПК
11101001пkСУБФСР п,k*FSRn - = k
1110100111kСУБУЛНК k*FSR2 - = k, поп ПК
11101010kPUSHL k*[FSR2] ← k, декремент FSR2
111010110sMOVSF src,ж*f ← ​​FSR2 [s]
1111ж
111010111sMOVSS src,dst*FSR2 [d] ← FSR2 [s]
1111—0—d
111011opckИнструкции из 2 слов
1110110sk (лсбит)ВЫЗОВ k[, БЫСТРЫЙ]Подпрограмма вызова (20-битный адрес)
1111k (мсбит)
1110111000жk (msb)LFSR ж,kПереместить 12-битный литерал в FSRж
11110000k (лсбит)
11101111k (лсбит)ИДТИ К kАбсолютный скачок, ПК ← k (20-битный адрес)
1111k (мсбит)
1111kНет операции, второе слово инструкций из 2 слов
1
5
1
4
1
3
1
2
1
1
1
0

9

8

7

6

5

4

3

2

1

0
МнемоническийC
?
Z
?
N
?
Описание

*: Эти расширенные инструкции доступны только для некоторых моделей, и то только в том случае, если XINST бит конфигурации установлен.

16-битные микроконтроллеры PIC24 и dsPIC

В 2001 году Microchip представила серию микросхем dsPIC,[21] которые начали массовое производство в конце 2004 года. Это первые 16-разрядные микроконтроллеры Microchip. Устройства PIC24 представляют собой микроконтроллеры общего назначения. Устройства dsPIC включают цифровая обработка сигналов возможности в дополнение.

Инструкции бывают двух основных типов. Одна из них похожа на классические инструкции PIC с одним операндом, с операцией между W0 и значением в указанном регистре f (т.е. первые 8 КБ ОЗУ) и выбором бита выбора места назначения, который обновляется с результатом. Регистры W отображены в память, поэтому операнд f может указывать регистр W.

Другая форма, новая для PIC24, определяет три регистровых операнда W, два из которых допускают 3-битную спецификацию режима адресации:

Режимы адресации PIC24
исходный операндоперанд назначенияОписание
PPPРегСинтаксисqqqРегСинтаксис
000ssssWs000ддддWdЗарегистрироваться напрямую
001ssss[Ws]001дддд[Wd]Косвенный
010ssss[Ws−−]010дддд[Wd−−]Косвенный с постдекрементом
011ssss[Ws++]011дддд[Wd++]Косвенный с постинкрементом
100ssss[−−Ws]100дддд[−−Wd]Косвенный с предварительным приращением
101ssss[++ Ws]101дддд[++ Wd]Косвенный с прединкрементом
11kкккк#u5(Не используется, незаконно)5-битный беззнаковый немедленный
11Иксssss[Ws+ Wш]11Иксдддд[Wd+ Wш]Косвенный со смещением регистра

Режим адресации смещения регистра доступен только для MOV src,dst инструкция, где регистр Ww может использоваться как смещение регистра для источника, назначения или обоих. Все остальные инструкции используют эту кодировку для беззнакового 5-битного непосредственного источника.

Для операндов TBLRD и TBLWT которые обращаются к программной памяти, разрешены только косвенные режимы и относятся к адресам в памяти кода.

Несколько инструкций состоят из двух слов. Второе слово - это NOP, которое включает до 16 бит дополнительного непосредственного операнда.

24-битный набор команд PIC24[22]
2
3
2
2
2
1
2
0
1
9
1
8
1
7
1
6
1
5
1
4
1
3
1
2
1
1
1
0

9

8

7

6

5

4

3

2

1

0
МнемоническийC
?
Z
?
N
?
Описание
0000код операциикомпенсироватьКонтрольные переводы
00000000NOPНет операции
00000000—0—п<22:16>ВЫЗОВ / НАЙТИ адрес 23(второе слово)
00000000пДЕЛАТЬ #k,адрес(второе слово)
000000010opc—0—аВычисленная передача управления (в 16-битный Wa)
00000001000—0—аЗВОНИТЕ RаНажмите на компьютер, перейдите в Wa
00000001001—0—аRCALL RаНажмите ПК, перейдите на ПК + 2 × Wa
00000001010—0—аGOTO RаПерейти к Wa
00000001011—0—аБюстгальтер RаПерейти на ПК + 2 × Wa
00000010п<15:1>0ВЫЗОВадрес 23Нажмите ПК, перейдите к абсолютному адресу
—0——0—п<22:16>
00000011(Зарезервированный)
00000100п0ИДТИ Кадрес 23Перейти к абсолютному адресу
—0——0—п<22:16>
000001010BkdRETLW [.B] #k, ВтdWd = k, поп ПК
0000011000—0—ВОЗВРАЩАТЬСЯпоп-компьютер
0000011001—0—РЕТФИCZNпоп-эр, ПК
00000111пRCALL адресНажимаем ПК, ПК + = 2 × s16
0000100000kДЕЛАТЬ #k,адресЦикл с нулевыми издержками: k + 1 - количество повторов, PC + 2 × n последняя инструкция
—0—п
0000100000kПОВТОРЕНИЕ #kПовторить следующую инструкцию k + 1 раз
00001000пRCALL адресНажимаем ПК, ПК + = 2 × s16
0000101(Зарезервированный)
0000110апБюстгальтер Oа, адресЕсли аккумулятор переполнен / насыщен, PC + = 2 × simm16
0000111апБюстгальтер Sа, адрес
0код операциишBqdпsОбратное вычитание: destисточник - Wш
00010шBqdпsSUBR [.B] Wш,src,dstCZNdst ← src - Ww = src + ~ Ww + 1)
00011шBqdпsSUBBR [.B] Wш,src,dstCZNdst ← src - Ww - C̅ = src + ~ Ww + C
0010kdMOV #k, ВтdWd ← # imm16
0011condпУсловный переход на ПК + 2 ×п
00110000пBRA OV, г.адрес... если установлен PSR.V
00110001пБюстгальтер C,адрес... если установлен PSR.C
00110010пБюстгальтер Z,адрес... если установлен PSR.Z
00110011пБюстгальтер N,адрес... если установлен PSR.N
00110100пБюстгальтер LE,адрес... если ПСР.З, или ПСР.Н ≠ ПСР.В
00110101пБюстгальтер LT,адрес... если PSR.N ≠ PSR.V
00110110пBRA LEU,адрес... если установлен PSR.Z или PSR.C очищен
00110111пБЮСТГАЛЬТЕР адрес... безоговорочно
00111000пBRA NOV,адрес... если PSR.V ясен
00111001пBRA NC,адрес... если PSR.C ясен
00111010пBRA NZ,адрес... если ПСР.З ясно
00111011пБРА НН,адрес... если PSR.N ясен
00111100пБюстгальтер GT,адрес... если PSR.Z очищен, а PSR.N = PSR.V
00111101пБюстгальтер GE,адрес... если PSR.N = PSR.V
00111110пБРА ГТУ,адрес... если PSR.Z очищен, а PSR.C установлен
00111111п(Зарезервированный)
0код операциишBqdпsОперации ALU: dest ← OP (Wш,источник)
01000шBqdпsДОБАВИТЬ [.B] Wш,src,dstCZNdst ← Ww + src
01001шBqdпsADDC [.B] Wш,src,dstCZNdst ← Ww + src + C
01010шBqdпsSUB [.B] Wш,src,dstCZNdst ← Ww - src
01011шBqdпsSUBB [.B] Wш,src,dstCZNdst ← Ww - ~ src - C̅ = Ww + ~ src + C
01100шBqdпsИ [.B] Wш,src,dstZNdst ← Ww & src
01101шBqdпsXOR [.B] Wш,src,dstZNdst ← Ww ^ src
01110шBqdпsIOR [.B] Wш,src,dstZNdst ← Ww | src
01111шBqdпsMOV [.B] src,dstZNdst ← src (разрешен режим смещения)
10000жdMOV ж, ВтdWd ← f
10001жsMOV Ws,жf ← ​​Ws
10010kBkdksMOV [.B] [Ws+s10], ВтdЗагрузить с 10-битным смещением
10011kBkdksMOV [.B]Ws,[Wd+s10]Сохранить с 10-битным смещением
10100код операциибZB—0—пsБитовые операции на источник
10100000б0B—0—пsBSET [.B] #б,srcУстановить бит b src
10100001б0B—0—пsBCLR [.B] #б,srcОчистить бит b из src
10100010б0B—0—пsBTG [.B] #б,srcПереключить бит b в src
10100011б00—0—пsBTST.C #б,srcCУстановите PSR.C = бит b src
10100011б10—0—пsBTST.Z #б,srcZУстановите PSR.Z = бит b src
10100100бZ0—0—пsBTSTS.z #б,srcC / ZПроверьте бит b src (в C или Z), затем установите
10100101Zш0—0—пsBTST.z Wш,srcC / ZТестовый бит Ww из src
10100110б00—0—пsBTSS #б,srcТестовый бит, пропустить, если установлен
10100111б00—0—пsBTS #б,srcТестовый бит, пропустить, если сброшен
10101код операциибжБитовые операции на ж
10101000бжбBSET [.B] ж,#бУстановить бит b из f
10101001бжBCLR.B ж,#бОчистить бит b из f
10101010бжBTG.B ж,#бПереключить бит b из f
10101011бжBTST.B ж,#бZТестовый бит b из f
10101100бжBTSTS.B ж,#бZПроверить бит b функции f, затем установить
10101101Zш0—0—пsBSW.z src, ВтшСкопируйте PSW.C или PSW.Z укусить Ww из src
10101110бжBTSS ж,#бТестовый бит, пропустить, если установлен
10101111бжBTSC ж,#бТестовый бит, пропустить, если сброшен
101100код операцииBkdРегистр-немедленные операции: Wd ← OP (Wd,k)
101100000BkdДОБАВИТЬ [.B] #u10, ВтdCZNWd ← Wd + k
101100001BkdADC [.B] #u10, ВтdCZNWd ← Wd + k + C
101100010BkdSUB [.B] #u10, ВтdCZNWd ← Wd - k
101100011BkdSUBB [.B] #u10, ВтdCZNWd ← Wd - k - C̅
101100100BkdИ [.B] #u10, ВтdZNWd ← Wd & k
101100101BkdXOR [.B] #u10, ВтdZNWd ← Wd ^ k
101100110BkdIOR [.B] #u10, ВтdZNWd ← Wd | k
101100111BkdMOV [.B] #u10, ВтdWd ← k
101101код операцииBDжОперации ALU: dest ← OP (ж, W0)
101101000BDжДОБАВИТЬ [.B] ж[, WREG]CZNdest ← f + W0
101101001BDжАЦП [.B] ж[, WREG]CZNцель ← f + W0 + C
101101010BDжПОД [.B] ж[, WREG]CZNdest ← f - W0
101101011BDжSUBB [.B] ж[, WREG]CZNdest ← f - W0 + C̅
101101100BDжИ [.B] ж[, WREG]ZNdest ← f & W0
101101101BDжXOR [.B] ж[, WREG]ZNdest ← f ^ W0
101101110BDжIOR [.B] ж[, WREG]ZNdest ← f | W0
101101111B1жMOV [.B] WREG,жf ← ​​W0
1011100opcшd0пs16 × 16 → 32 умножение
101110000шd0пsMUL.UU Wш,src, ВтdWd + 1: Wd ← Ww × src (без знака)
101110001шd0пsMUL.US Wш,src, ВтdWd + 1: Wd ← Ww × src (src подписано)
101110010шd0пsMUL.SU Wш,src, ВтdWd + 1: Wd ← Ww × src (Ww со знаком)
101110011шd0пsMUL.SS Wш,src, ВтdWd + 1: Wd ← Ww × src (со знаком)
1011101opcBqdпsДоступ к программной памяти (только косвенные режимы)
101110100BqdпsTBLRDL [.B] src,dstdst ← ROM [TBLPAG: src] (биты 15: 0)
101110101BqdпsTBLRDH [.B] src,dstdst ← ROM [TBLPAG: src] (биты 23:16)
101110110BqdпsTBLWTL [.B] src,dstПЗУ [TBLPAG: dst] ← src (биты 15: 0)
101110111BqdпsTBLWTH [.B] src,dstПЗУ [TBLPAG: dst] ← src (биты 23:16)
101111000B0жMUL [.B] жW3: W2 ← f × W0 (без знака)
101111000B1(Зарезервированный)
101111001(Зарезервированный)
10111101(Зарезервированный)
1011111000—0—d0пsMOV.D src, ВтdЗагрузить регистровую пару
1011111010qd—0—s0MOV.D Ws,dstПара регистров магазина
10111111(Зарезервированный)
11000мАSИксуяjаDSP MAC (только dsPIC)
11001Другие инструкции DSP (только dsPIC)
1100111100—0—dпsFF1R src, ВтdCНайдите первый справа (lsb)
1100111110—0—dпsFF1L src, ВтdCНайдите первый слева (msb)
110100код операцииBqdпsСдвиг / поворот общего операнда
110100000BqdпsSL [.B] src,dstCZNdst ← src << 1, сдвиг влево (в перенос)
110100010BqdпsЛСР [.B] src,dstCZNdst ← src >> 1, логический сдвиг вправо
110100011BqdпsASR [.B] src,dstCZNdst ← src >> 1, арифметический сдвиг вправо
110100100BqdпsRLNC [.B] src,dstZNdst ← src <<< 1, повернуть влево (без переноса)
110100101BqdпsRLC [.B] src,dstCZNC: dst ← src: C << 1, повернуть влево через перенос
110100110BqdпsRRNC [.B] src,dstZNdst ← src >>> 1, повернуть вправо (без переноса)
110100111BqdпsRRC [.B] src,dstCZNdst: C ← C: src >> 1, повернуть вправо через перенос
110101код операцииBDжСдвиг / поворот ж
110101000BDжSL [.B] ж[, WREG]CZNdest ← f << 1, сдвиг влево (в перенос)
110101010BDжЛСР [.B] ж[, WREG]CZNdest ← f >> 1, логический сдвиг вправо
110101011BDжASR [.B] ж[, WREG]CZNdest ← f >> 1, арифметический сдвиг вправо
110101100BDжRLNC [.B] ж[, WREG]ZNdest ← f <<< 1, повернуть влево (без переноса)
110101101BDжRLC [.B] ж[, WREG]CZNC: dest ← f: C << 1, повернуть влево через перенос
110101110BDжRRNC [.B] ж[, WREG]ZNdest ← f >>> 1, повернуть вправо (без переноса)
110101111BDжRRC [.B] ж[, WREG]CZNdest: C ← C: f >> 1, повернуть вправо через перенос
11011000UтdD00sРазделить шаг (префикс REPEAT # 17)
110110000—0—d000sDIV.S Wd, ВтsCZNW0 ← Wd / Ws, W1 ← остаток
110110000тd100sDIV.SD Wd, ВтsCZNW0 ← Wt: Wd / Ws, W1 ← остаток
110110001—0—d000sDIV.U Wd, ВтsCZNW0 ← Wd / Ws, W1 ← остаток
110110001тd100sDIV.UD Wd, ВтsCZNW0 ← Wt: Wd / Ws, W1 ← остаток
110110010т—0—000sDIVF Wт, ВтsCZNW0 ← Wt: 0 / Ws, W1 ← остаток
110110011(Зарезервированный)
1101101(Зарезервированный)
110111код операциишdя00sСдвиг / поворот несколько
110111000шd000sSL Wш, Втs, ВтdZNWd ← Ww << Ws
110111000шd100kSL Wv,#u4, ВтdZNWd ← Ww << k
110111100шd000sЛСР Wш, Втs, ВтdZNWd ← Ww >> Ws, логический сдвиг вправо
110111100шd100kЛСР Wv,#u4, ВтdZNWd ← Ww >> k, логический сдвиг вправо
110111101шd000sASR Wш, Втs, ВтdZNWd ← Ww >> Ws, арифметический сдвиг вправо
110111101шd100kASR Wv,#u4, ВтdZNWd ← Ww >> k, арифметический сдвиг вправо
110111110—0—dпsFBCL src, ВтdCНайдите допустимый сдвиг арифметической нормализации
111000000—0—B000пsCP0 [.B] srcCZNСравните с нулем, src - 0
111000010шB000пsCP [.B] Wш,srcCZNСравните, Ww - src (Ww + ~ src + 1)
111000011шB000пsCPB [.B] Wш,srcCZNСравните с заимствованием, Ww - src - C̅ (Ww + ~ src + C)
111000100B0жCP0 [.B] жCZNСравните с нулем, f - 0
111000110B0жCP [.B] жCZNСравнить, f - W0
111000111B0жCPB [.B] жCZNСравните с заимствованием, f - W0 - C̅ (f + ~ W0 + C)
1110010(Зарезервированный)
1110011opcшB—0—sСравнить и пропустить
111001100шB—0—sCPSGT [.B] Wш, Втs... если Ww> Ws, подписано
111001101шB—0—sCPSLT [.B] Wш, Втs... если Ww
111001110шB—0—sCPSNE [.B] Wш, Втs... если Ww ≠ Ws
111001111шB—0—sCPSNE [.B] Wш, Втs... если Ww = Ws
111010000BqdпsINC [.B] src,dstCZNdst ← src + 1
111010001BqdпsINC2 [.B] src,dstCZNdst ← src + 2
111010010BqdпsDEC [.B] src,dstCZNdst ← src − 1
111010011BqdпsDEC2 [.B] src,dstCZNdst ← src − 2
111010100BqdпsNEG [.B] src,dstCZNdst ← ~ src + 1
111010101BqdпsГРЕБЕНЬ] src,dstZNdst ← ~ src
111010110Bqd—0—CLR [.B] dstdst ← 0
111010111Bqd—0—SETM [.B] dstdst ← ~ 0
111011000BDжINC [.B] ж[, WREG]CZNdest ← f + 1
111011001BDжINC2 [.B] ж[, WREG]CZNdest ← f + 2
111011010BDжDEC [.B] ж[, WREG]CZNdest ← f − 1
111011011BDжDEC [.B] ж[, WREG]CZNdest ← f − 2
111011100BDжNEG [.B] ж[, WREG]CZNцель ← ~ f + 1
111011101BDжГРЕБЕНЬ] ж[, WREG]ZNdest ← ~ f
111011110BDжCLR [.B] ж[, WREG]dest ← 0
111011111BDжSETM [.B] ж[, WREG]dest ← ~ 0
111100мА1ИксуяjopcDSP MPY / MAC / ED / EDAC (только dsPIC)
111101(Зарезервированный)
11111000ж0ТОЛКАТЬ жНажмите f на вершину стека
11111001ж0Поп жPop f из вершины стека
1111101000kLNK #u14Нажмите W14, W14 ← W15, W15 + = k
1111101010—0—ULNKW15 ← W14, поп W14
1111101100000dпsSE src,dstCZNdst ← sign_extend (src), скопируйте бит 7 в биты 15: 8
1111101110000dпsZE src,dst1Z0dst ← zero_extend (src), очистить биты 15: 8
1111110000kDISI #u14Отключить прерывание для k+1 цикл
1111110100000d000sEXCH Ws, ВтdПоменять местами содержимое регистров Ws, Wd
11111101010000000000sDAW.B WsCДесятичная регулировка на основе C, DC
111111011B0000000000sСВОП [.B] WsПоменять местами половинки Ws
1111111000—0—ПЕРЕЗАГРУЗИТЬСброс программного обеспечения
11111110010—0—kPWRSAV #u1Перейти в спящий режим или режим ожидания
11111110011—0—CLRWDTОчистить сторожевой таймер
11111110100—0—POP.SРегистры Pop Shadow (W0–3, часть PSR)
11111110101—0—PUSH.SПроталкивать теневые регистры (W0–3, часть PSR)
1111111011(Зарезервированный)
11111111НЕТ ПРНет операции (версия №2)

Рекомендации

  1. ^ PIC10F200 / 202/204/206 Лист данных (PDF). Технология микрочипов. 2007. с. 52. Архивировано с оригинал (PDF) на 2015-08-11. Получено 2015-01-15.
  2. ^ http://www.emc.com.tw/eng/products.asp
  3. ^ ELAN Microelectronics Corp. (26 апреля 2016 г.), EM78P157N 8-битный микроконтроллер с OTP ROM Спецификация продукта (PDF), версия 1.3, в архиве (PDF) из оригинала от 04.03.2016, получено 2020-06-06
  4. ^ а б ELAN Microelectronics Corp. (25 апреля 2016 г.), EM78P143 8-битный микропроцессор с OTP ROM Спецификация продукта (PDF), версия 1.7, стр. 77, получено 2020-06-06
  5. ^ ELAN Microelectronics Corp. (апрель 2016 г.), EM78P346N 8-битный микропроцессор с OTP ROM Спецификация продукта (PDF), версия 1.5, стр. 77, получено 2019-07-11
  6. ^ ELAN Microelectronics Corp. (17 апреля 2000 г.), EM78860 8-битный микроконтроллер (PDF), п. 17, получено 2019-07-11
  7. ^ ELAN Microelectronics Corp. (15 марта 2013 г.), EM78F648 / 644/642 / 641N / 548/544/542 / 541N 8-разрядный микроконтроллер серии Flash (PDF), версия 1.2, с. 162–165, получено 2019-07-11
  8. ^ Получено из таблиц кодирования инструкций в Elan eUIDE II v2.19.60.14, выпущено 1 мая 2019 г., дата обращения 13 июля 2019 г. В частности, Bin / *. Cfg файлы.
  9. ^ ELAN Microelectronics Corp. (2014-01-14), EM78XXX 15-битный набор команд (PDF), получено 2019-07-13
  10. ^ «Представляем усовершенствованную архитектуру среднего уровня» (PDF). Микрочип.
  11. ^ Волк, Эш «Ниндзи» (12 декабря 2018 г.). "Мышиные приключения №3: Написание дизассемблера". Получено 8 июля 2019.
  12. ^ Карлсон, Джей (6 сентября 2019 г.). «Что случилось с этими 3-центовыми микроконтроллерами? (Обзор Padauk PMS150C и друзей)». Получено 2020-05-18.
  13. ^ "Ужасный" микроконтроллер стоимостью 3 цента - краткий обзор микроконтроллеров стоимостью менее $ 0,10 ". Блог Вима. 12 августа 2019 г.. Получено 2020-05-18.
  14. ^ Волк, Эш «Ниндзи» (12 декабря 2018). "Документация для микроконтроллеров PADAUK FPPA". Получено 2020-05-18.
  15. ^ Padauk Technology Co. Ltd. (11 декабря 2018 г.). "PMC150 / PMS150 8-битный контроллер ввода-вывода типа OTP" (PDF) (техническая спецификация). Версия 1.8. С. 38–51. PDK-DS-PMX150-EN-V108. Получено 2020-06-08.
  16. ^ Волк, Эш «Ниндзи» (23 мая 2020 г.). «Основные устройства PADAUK FPPA (14 бит)». Получено 2020-06-08.
  17. ^ Волк, Эш «Ниндзи» (26 ноября 2018). "fppa_instructions_sets_notes / 14bit.txt". Получено 2020-06-08.
  18. ^ Padauk Technology Co. Ltd. (18 июня 2019 г.). "Технические данные контроллера ввода-вывода типа PFS154 8bit MTP" (PDF). Версия 1.04. С. 71–84. PDK-DS-PFS154_RN_V104. Получено 2020-06-09.
  19. ^ http://www.microchipc.com/sourcecode/
  20. ^ Microchip Technology, Inc. (2007 г.), PIC18F1220 / 1320 Лист данных (PDF), получено 2012-04-02
  21. ^ [1]
  22. ^ Справочное руководство программиста dsPIC30F (PDF), Microchip Technology, 2008, DS70157C, получено 2012-07-02