- •Микроконтроллеры msp430 Введение
- •1. Центральный процессор msp430
- •1.1. Адресное пространство микроконтроллеров msp430f1xx
- •1.2. Регистровый файл
- •1.3. Байтовая и словная формы инструкций.
- •1.4. Режимы адресации
- •1.4.1 Регистровая адресация
- •1.4.2. Индексная адресация
- •1.4.3 Символьная адресация
- •1.4.4 Абсолютная адресация
- •1.4.5. Косвенная адресация
- •1.4.6. Косвенная адресация с автоинкрементом
- •1.4.7 Непосредственная адресация
- •2. Система команд msp микроконтроллеров
- •2.1. Двухадресные команды
- •2.2 Одноадресные команды
- •2.3 Команды переходов
- •2.4. Эмулируемые команды
- •3. Периферийные устройства микроконтроллеров msp430f1xx
- •3.1 Внешние выводы микроконтроллера msp430f149
- •3.2 Система прерываний
- •3.3 Система тактирования
- •3.4 Сторожевой таймер
- •3.5 Аппаратный умножитель
- •3.6 Порты ввода/вывода
- •3.7 Таймер a3
- •3.8 Таймер b7
- •3.9 Интерфейс usart
- •3.9.1 Режим uart
- •3.9.1.1 Передача данных
- •3.9.1.2 Передача данных
- •3.9.1.3 Поддержка коммуникации в многопроцессорных системах
- •3.9.1.4 Обнаружение стартового бита при приеме
- •3.9.1.5 Скорость передачи
- •3.9.1.6 Регистры usart
- •3.9.2 Режим spi
- •3.9.3 Режим i2c
- •3.10 Аналоговый компаратор
- •3.11 Аналого-цифровой преобразователь adc12
- •3.12 Flash контроллер
- •3.12.1 Стирание Flash памяти
- •3.12.2 Запись Flash памяти
- •3.12.3 Регистры Flash контроллера
2.3 Команды переходов
Команды переходов могут быть условными и безусловными. Условные переходы выполняются на основе анализа состояния битов в статусном регистре SR. Переход осуществляется относительно содержимого регистра PC на расстояние от -511 до 512 слов.
Для некоторых команд условных переходов ассемблер поддерживает альтернативную нотацию.
Команда: JNE/JNZ - Jump if Not Equal / Jump if Not Zero –прыжок если не равно / прыжок если не ноль
Синтаксис: jne label
jnz label
Описание: Тестируется состояние бита Z статусного регистра SR. Если Z=0 осуществляется переход на метку label.
Флаги: Не модифицируются
Пример: Очистить 30 байт ОЗУ начиная с адреса 200h
mov #200h, R5 ; настраиваем указатель на начало блока ОЗУ
Loop: mov.b #0, 0(R5) ; пересылаем число 0 в текущую ячейку ОЗУ
add #1, R5 ; наращиваем указатель
cmp #200h+30, R5 ; проверяем достиг ли указатель границы
; блока ОЗУ
jne Loop ; Если нет – переход на начало цикла.
Команда: JQE/JZ - Jump if Equal / Jump if Zero –прыжок если равно / прыжок если ноль
Синтаксис: jeq label
jz label
Описание: Тестируется состояние бита Z статусного регистра SR. Если Z=1 осуществляется переход на метку label.
Флаги: Не модифицируются
Пример: Тестировать 7-й бит в регистре R10
bit #80h, R10
jz BitIsZero
. . . .
BitIsZero:
Команда: JN - Jump if Negative –прыжок если минус
Синтаксис: jn label
Описание: Тестируется состояние бита N статусного регистра SR. Если N=1 осуществляется переход на метку label.
Флаги: Не модифицируются
Пример: В регистр R12 записать сумму всех положительных значений в блоке ОЗУ с начальным адресом 2A0h и размером 50 байт.
mov #0, R12 ; обнуляем сумму
mov #2A0h, R10 ; настраиваем указатель на начало блока ОЗУ
mov #50, R11 ; инициализируем счетчик циклов
loop: mov.b @R10+, R8 ; читаем данные во временный регистр
cmp #0, R8 ; сравниваем с 0
jn skip ; если минус, пропустить следующую команду
add R8, R12 ; накапливаем сумму
skip: sub #1, R11 ; считаем количество циклов
jnz loop ; если не все значения, переход на начало цикла
Команда: JC/JHS - Jump if Carry set / Jump if Higher or Same –прыжок если флаг С установлен / прыжок если выше или равно
Синтаксис: jc label
jhs label
Описание: Тестируется состояние бита C статусного регистра SR. Если C=1 осуществляется переход на метку label. Команда JHS обычно используется после сравнения беззнаковых операндов.
Флаги: Не модифицируются
Команда: JNC/JLO - Jump if Carry Not set / Jump if Lower –прыжок если флаг С сброшен / прыжок если ниже
Синтаксис: jnc label
jlo label
Описание: Тестируется состояние бита C статусного регистра SR. Если C=0 осуществляется переход на метку label. Команда JLO обычно используется после сравнения беззнаковых операндов.
Флаги: Не модифицируются
Пример: В регистр R15 записать количество единичных бит, содержащихся в регистре R12.
mov #16, R13 ; загружаем счетчик бит
mov #0, R15 ; обнуляем регистр результата
loop: rrc R12 ; сдвиг данных в бит C
jnc skip ; если C=0, пропустить след. команду
add #1, R15 ; увеличить результат
skip: sub #1, R13 ; все биты сдвинуты?
jne loop ; если нет – переход на начало цикла
Тот же результат можно получить, если в приведенном фрагменте две команды
jnc skip
add #1, R15
заменить одной:
addc #0, R15
Команда: JGE - Jump if Greater or Equal –прыжок если больше или равно
Синтаксис: jge label
Описание: Если результат операции N^V равен 0, осуществляется переход на метку label. Команда JGE обычно используется после сравнения знаковых операндов.
Флаги: Не модифицируются
Пример: В регистр R12 записать максимальное знаковое значение, содержащееся в блоке памяти ОЗУ со стартовым адресом 200h и размером 100 слов.
mov #-32768, R12 ; инициализируем R12 наименьшим значением
mov #200h, R15 ; настраиваем указатель на начало блока
mov #100, R13 ; инициализируем счетчик циклов
loop: cmp @R15+, R12 ; сравниваем текущее слово с текущим
; максимумом
jge skip ; если меньше, пропускаем след. команду,
mov -2(R15), R12 ; иначе меняем текущий максимум
skip: sub #1, R13 ; проверяем окончание цикла
jne loop ; если цикл не закончен, переход на начало
; цикла
Команда: JL - Jump if Less –прыжок если меньше
Синтаксис: jl label
Описание: Если результат операции N^V равен 1, осуществляется переход на метку label. Команда JGE обычно используется после сравнения знаковых операндов.
Флаги: Не модифицируются
Команда: JMP - Jump –прыжок
Синтаксис: jmp label
Описание: Безусловный переход на метку label
Флаги: Не модифицируются
Все команды переходов в памяти занимают 2 байта и исполняются за два цикла.
