- •1.Организация микроконтроллера мк1816
- •1.1.Общие сведения о семействе микроконтролеров к1816.
- •2.Арифметическо-логическое устройство (алу) микроконтроллера мк1816
- •3.Память микроконтроллера мк1816
- •3.1.Память программ (или - память команд, пк)
- •3.2.Память данных (или - оперативная память, озу)
- •4.Организация ввода – вывода в микроконтроллере мк1816
- •4.1.Порты (или каналы) ввода - вывода р1 и р2.
- •4.2.Порт ввода - вывода bus (или db).
- •5.Управление работой микроконтроллера мк1816
- •5.1.Синхронизация микроконтроллера.
- •5.2.Системный сброс.
- •5.3.Пошаговый режим работы.
- •6.Варианты структур микроконтроллерных систем(мкс) на основе мк1816
- •6.1.Мк-система с расширенной памятью программ.
- •6.2.Мк-система с расширенной памятью данных.
- •6.3.Мк-система с расширенным вводом-выводом.
- •7.Система команд микроконтроллера мк1816
- •7.1.Команды пересылки и обмена
- •7.2.Команды арифметических и логических операций (в том числе и операций над признаками)
- •7.2.1.Общие сведения.
- •7.2.2.Команды группы арифметических операций
- •7.2.3.Команды группы логических операций:
- •Xrl a,Rr - Исключающее или аккумулятора с маской в регистре
- •Xrl a,#d - Исключающее или аккумулятора с непосредственным операндом
- •Xrl a,@Rr - Исключающее или аккумулятора и маской в ячейке памяти
- •7.3.Команды ввода – вывода
- •7.4.Команды передачи управления (в том числе и операций с подпрограммами)
- •7.5.Команды операций с таймером
- •7.6.Команды управления режимом работы мк
7.4.Команды передачи управления (в том числе и операций с подпрограммами)
Выполнение команд передачи управления и работы с подпрограммами в МК 1816 имеет свои особенности и зависит от распределения программ и данных по блокам и страницам памяти, особенно в случае использования внешней памяти.
При использовании внешней памяти программ в МК 1816 команда безусловного перехода JMP позволяет осуществить переход к любой ячейке памяти в пределах блока 0 (адресное пространство 0 ÷ 204710). Переход к блоку памяти 1 (адресное пространство 2048 ÷ 409510) возможен только после предварительного выполнения команды выбора блока памяти 1 ("SEL MB1"). Граница блоков памяти 2К может быть пересечена в любом направлении только по команде перехода или вызова подпрограмм вслед за командой выбора блока памяти. Переключение блока памяти не происходит, пока не выполнится переход. До тех пор, пока не будет выбран другой блок памяти, все переходы осуществляются только в пределах выбранного блока памяти. В том случае, если требуемая подпрограмма располагается в другом блоке памяти, доступ к ней осуществляется тандемом команд: выбор блока памяти и вызов подпрограммы. После выполнения подпрограммы управление передается в исходный, блок памяти в том случае, если в подпрограмме имеется команда выбора исходного блока памяти. В том случае, если в подпрограмме нет команды выбора исходного блока памяти, после выполнения подпрограммы возврат в исходный блок будет все же выполнен правильно, однако любая очередная команда перехода в исходном блоке (в основной программе) вновь передаст управление в другой блок. Необходимо обратить внимание на указанные особенности как на возможный источник ошибок программирования.
Команда передачи управления по косвенному адресу JMPP позволяет выполнять переход к одному из множества адресов в зависимости от содержимого аккумулятора. Аккумулятор адресует ячейку памяти программ, в которой содержится адрес перехода, Эта команда может быть эффективно использована для передачи управления одной из нескольких процедур в зависимости от кода символа (например, для создания таблиц адресов функций), вводимого в аккумулятор (например, с клавиатуры). Для необслуживаемых МК-систем эта команда упрощает реализацию механизма множественных ветвлений по программе в зависимости от результата предыдущих вычислений.
Группа команд условных переходов оперирует со следующими признаками:
Т0 - сигнал на входе Т0;
T1 - сигнал на входе Т1;
ЗПР* - сигнал запроса прерывания;
Z - нулевое содержимое аккумулятора;
Вn - единичное значение любого бита n = { 0÷7 } аккумулятора;
С - признак переноса;
F0, F1 - признаки, специфицируемые разработчиком.
Кодирование команд JMP и CALL в зависимости от номера текущей страницы памяти программ (размер страницы 256 байт) представлено в таблице:
Страница |
JMP |
CALL |
|
Страница |
JMP |
CALL |
0 |
04 |
14 |
|
4 |
84 |
94 |
1 |
24 |
34 |
|
5 |
А4 |
В4 |
2 |
44 |
54 |
|
6 |
С4 |
D4 |
3 |
64 |
74 |
|
7 |
Е4 |
F4 |
Команды условных переходов позволяют осуществлять передачу управления в пределах текущей страницы (256 байт). Анализируемые признаки, за исключением С, Вn и F0, не фиксируются в специальных триггерах, а представляются мгновенными сигналами в АЛУ (признак Z) или на соответствующих выводах МК. Для организации программных циклов используется команда DJNZ (декремент регистра и переход, если не нуль), которая позволяет использовать любой из восьми рабочих регистров в качестве счетчика и осуществить переход в пределах текущей страницы памяти программ.
JMP a - Безусловный переход в пределах блока памяти
"a8-a101'0100 a0-a7", "!4"
(PC8-10) <- a8-10;
(PC0-7) <- a0-7; (PC11) <- DBF
Команда выполняется за два машинных цикла. Адрес перехода a0÷10 передается в счетчик команд (PC, биты 0 ÷ 10). Значение бита 11 счетчика команд определяется последней выполненной командой выбора блока памяти ("SEL MB0" или "SEL MB1").
JMPP @A - Косвенный переход в пределах страницы памяти
"1011'0011", "B3"
(PC0-7) <- ((A))
Команда выполняется за два машинных цикла. Номер страницы не изменяется, а в счетчик команд PC, в биты 0 ÷ 7, загружается содержимое ячейки памяти, адресуемой аккумулятором.
DJNZ a - Декремент регистра и переход, если не нуль
"1110'1rrr" a7--a0", "E*"
(Rr) <- (Rr) - 1; если (Rr) не = 0, то (PC0÷7) <- a,
иначе (РС) <- (РС) + 2
Команда выполняется за два машинных цикла. Декрементируется рабочий регистр, и в случае его обнуления выполняется очередная команда. Переход возможен только в пределах текущей страницы. В том случае, если команда DJNZ расположена в ячейке с адресом 255 текущей страницы, переход должен осуществляться по адресу следующей страницы памяти программ.
Пример: требуется инкрементировать содержимое ячеек 10 ÷ 18 внутренней оперативной памяти.
INCTABL: |
MOV |
R0,#10 |
; загрузить в R0 десятичное число 10 |
|
MOV |
R3,#9 |
; загрузить в счетчик циклов число 9 |
LOOP: |
INC |
@R0 |
; инкремент ячейки памяти |
|
INC |
R0 |
; инкремент адреса в R0 |
|
DJNZ |
R3,LOOP |
; декремент счетчика циклов и возврат, если не нуль |
DONE: |
NOP |
|
; очередная команда программы |
JC a - Переход по признаку переноса
"1111'0110 a0--a7", "F6"
Если C = 1, то (PC0÷7) <- a, иначе (PC) <- (PC) + 2
JNC a - Переход при отсутствии переноса
"1110'0110 a0÷a7", "F6"
Если C = 0, то (PC0-7) <- a, иначе (PC) <- (PC) + 2
JZ a - Переход при нулевом результате
"1100'0110 a0÷a7", "c6"
Если А = 0, то (PC0÷7) <- a, иначе (PC) <- (PC) + 2
JNZ a - Переход при ненулевом результате
"1001'0110 a0÷a7", "96"
Если А =/= 0, то (PC0÷7) <- a, иначе (PC) <- (PC) + 2
JT0 a - Переход по сигналу 1 на входе Т0
"0011'0110 a0÷a7", "36"
Если T0 = 1, то (PC0÷7) <- a, иначе (PC) <- (PC) + 2
JNT0 a - Переход по сигналу 0 на входе Т0
"0010'0110 a0÷a7", "26"
Если T0 = 0, то (PC0÷7) <- a, иначе (PC) <- (PC) + 2
JT1 a - Переход по сигналу 1 на входе Т1
"0101'0110 a0÷a7", "56"
Если T1 = 1, то (PC0÷7) <- a, иначе (PC) <- (PC) + 2
JNT1 a - Переход по сигналу 0 на входе Т1
"0100'0110 a0÷a7", "46"
Если T1 = 0, то (PC0÷7) <- a, иначе (PC) <- (PC) + 2
JF0 a - Переход, если признак F0 равен 1
"1011'0110 a0÷a7", "B6"
Если T0 = 1, то (PC0÷7) <- a, иначе (PC) <- (PC) + 2
JF1 a - Переход, если признак F1 равен 1
"0111'0110 a0÷a7", "76"
Если F1 = 1, то (PC0÷7) <- a, иначе (PC) <- (PC) + 2
JTF a - Переход, если признак TF равен 1
"0001'0110 a0÷a7", "16"
Если TF = 1, то (PC0÷7) <- a, иначе (PC) <- (PC) + 2
JNI a - Переход, если сигнал на входе запроса
прерывания ЗПР* = 0
"1000'0110 a0÷a7", "86"
Если ЗПР* = 0, то (PC0÷7) <- a, иначе (PC) <- (PC) + 2
JBb a - Переход, если заданный бит аккумулятора равен 1
b0÷b21'0010 a0--a7
Если Bb = 1, то (PC) <- (PC) + 2.
Управление передается по указанному адресу, если заданный бит аккумулятора имеет значение 1.
Шестнадцатеричные коды восьми возможных команд JBb в зависимости от номера тестируемого бита аккумулятора выглядит следующим образом.
JB7 |
JB6 |
JB5 |
JB4 |
JB3 |
JB2 |
JB1 |
JBO |
F2 |
D2 |
В2 |
92 |
72 |
52 |
32 |
12 |
CALL a - Вызов подпрограммы
"a8÷a101'0100" "a0 - a7", "14"
((SP)) <-- (PC), (PSW4÷7)
(SP) <-- (SP) + 1
(PC8-10) <-- a8÷a10; (PC11) <-- DBF
При вызове подпрограммы содержимое счетчика команд и биты 4 ÷ 7 ССП загружаются в стек. Управление передается по адресу a10 ÷ a0. Бит 11 счетчика команд определяется последней командой выбора блока памяти (SEL MB).
RET - Возврат без восстановления ССП
"1000'0011", "83"
(SP) <-- (SP) - 1
(PC) <-- ((SP))
Команда выполняется за два машинных цикла. Декрементируется указатель стека (биты 0 ÷ 2 ССП), и в счетчик команд загружается адрес возврата в основную программу.
RETR - Возврат с восстановлением ССП
"1001'0011", "93"
(SP) <-- (SP) - 1
(PC) <-- ((SP)), (PSW4÷7) <-- ((SP))
Эта команда должна использоваться для возврата из подпрограммы обслуживания прерывания и не может быть использована внутри подпрограммы, так как она сигнализирует МК об окончании процедуры прерывания.