Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Микропроцессоры и микроЭВМ. Учебное пособие
.pdf
№ Условие
1.12. Команды работы с битами
Мнемокод
команды
№ Условие
Мнемокод
команды
111 Rr.b = 0 SBRC Rr, b 112 Rrb = 1 SBRS Rr, b
113 PrP.b = 0 SBIC P, b 114 PrP.b = 1 SPIS P, b
115 (Rd) = (Rr) CPSE Rd, Rr
d, r = 0 – 31; P = 0 – 31 (!); b = 0 – 7
1.13. Управление режимами работы
№ Операция Мнемокод команды
116 MK → режим энергосбережения SLEEP
117 Перезапуск WDT WDR
118 Нет NOP
1.4.10. Команды регистровых операций
В группу регистровых операций входят пересылочные, арифметические и логические операции. Команды регистровых операций описаны в
табл. 2 – 4. Машинные коды всех команд регистровых операций имеют
формат «слово», команды № 1 – 31 выполняются за один такт, а команды
№ 32 и 33 – за два такта.
При описании операций в табл. 1.1 – 1.3 используются следующие
обозначения:
Rd, Rr – регистры общего назначения с номерами d и r соответственно;
(Rd), (Rr) – байты в регистрах Rd и Rr соответственно;
Rd.b – разряд b (b = 0 – 7) регистра Rd, бит в разряде Rd.b;
$ – указатель шестнадцатеричного кода;
&, | , ^ – знаки логических операций И, ИЛИ, исключающее ИЛИ соответственно;
(~), ( >> ), ( << ) – знаки операций НЕ, сдвиг регистра вправо, сдвиг
регистра влево соответственно.
Арифметические операции – сложение и вычитание – могут выполняться с числами без знака в двоичном коде и с числами со знаком в дополнительном двоичном коде. В отличие от микроконтроллеров многих
других семейств, в которых вычитание сводится к сложению с числом с
изменённым знаком (X–Y = X + (–Y)), в микроконтроллерах семейства AVR
вычитание выполняется с помощью аппаратного двоичного вычитателя.
При выполнении арифметических и логических операций кроме кода
результата формируются значения признаков результата. При выполне-
41

нии операций сравнения (команды № 18, 19 и 27) формируются только
значения признаков результата.
Значения признаков результата представлены состоянием разрядов
регистра состояния SREG (№$33F). Используются шесть признаков результата, которым присвоены имена C (SREG.0), Z(SREG.1) N (SREG.2),
V (SREG.3, S (SREG.4) и H (SREG.5).
В таблицах 1.1 – 1.3 признаки, значения которых формируются при
выполнении команд, отмечены знаком «+» или указано их название.
При выполнении разных операций значение признаков формируется
по разным правилам.
Признак C принимает единичное значение:
1) при появлении единицы переноса из старшего разряда при вы-
полнении операции сложения (команды № 14, 15 и 32);
2) при появлении единицы займа в старший разряд при выполнении
операции сложения (команды № 4, 16, 17, 18, 19, 25, 26, 27 и 33);
3) при выходе единицы за пределы разрядной сетки при выполнении
операции сдвига (команды № 7, 8, 9, 10 и 11).
Единичное значение признака C при выполнении операций сложения
и вычитания с числами без знака свидетельствует о получении неправильного результата операции вследствие переполнения разрядной сетки.
Признак Z принимает единичное значение при получении нулевого
результата операции. При выполнении операции вычитания с учётом займа (команды № 17, 19 и 26) Z = 1, если нулевой результат получен при
выполнении данной и предшествующей операций.
Признак N имеет значение, равное значению старшего разряда кода
результата. При выполнении арифметических операций с числами со знаком и отсутствии переполнения разрядной сетки он представляет знак
результата.
Признак V принимает единичное значение, если при выполнении
арифметической операции с числами со знаком возникло переполнение
разрядной сетки.
Признак S = N XOR V представляет знак результата при выполнении
арифметических операций с числами со знаком вне зависимости от переполнения разрядной сетки. При переполнении разрядной сетки (V = 1)
знак результата противоположен значению в старшем разряде кода результата.
Признак H принимает единичное значение при наличии единицы переноса из разряда D3 в разряд D4 при выполнении операции вычитания и
при передаче единицы из разряда D3 в разряд D4 при выполнении операции кода влево.
42

1.4.11. Команды для работы с ОЗУ
По командам с обращением по адресу в адресном пространстве
SRAM выполняются операции пересылки (копирования) байта между
регистром общего назначения и элементом, которому соответствует адрес
в адресном пространстве SRAM. Таким элементом может быть регистр
общего назначения (адреса от $00 до $1F), регистр ввода-вывода (адреса
от $20 до $5F), ячейка памяти в SRAM (адреса от $60 до максимального
адреса в SRAM), ячейка памяти в ERAM (адреса от максимального адреса
в SRAM +1 до максимального адреса в ERAM).
Команды с обращением по адресу в адресном пространстве SRAM
описаны в табл. 1.4 и 1.5.
Машинные коды команд № 34 и 35 имеют формат «2 слова», машинные коды остальных команд – формат «слово». Команды выполняются за
два такта, а при обращении к ячейкам в ERAM – за три такта. В случае
необходимости в цикл выполнения команды при обращении к ERAM может быть введён дополнительный такт ожидания.
В таблицах 1.4 и 1.5 используются следующие обозначения:
ЯчА – регистр общего назначения, регистр ввода-вывода, ячейка памяти в SRAM, ячейка памяти в ERAM, к которым производится обращение с использованием адреса А из адресного пространства SRAM;
(ЯчА) – байт в ЯчА;
X, Y, Z – пара регистров общего назначения X (R26, R27), Y (R28, R29),
Z (R30, R31) соответственно;
(X), (Y), (Z) – слово в паре регистров X, Y, Z соответственно;
СТЕК – ЯчА, к которой производится обращение с использованием
адреса, хранящегося в регистре-указателе стека SP;
(СТЕК) – байт в СТЕК, е;
(SP) – код числа в регистре SP.
В командах № 34 и 35 реализуется прямая адресация. Адрес байта
(A = k) указывается в коде команды.
В командах № 36 – 57 реализуется косвенная адресация. Адрес байта
находится в паре регистров X, Y или Z. При выполнении команд
№ 48 – 53 до выполнения пересылки адрес в паре регистров аппаратно
уменьшается на единицу. При выполнении команд № 54 – 57 адрес, по
которому производится обращение, равен адресу в паре регистров Y или
Z, увеличенному на единицу q, которое указано в коде команды. Адрес в
паре регистров остаётся без изменения.
В командах № 58 и 59 в качестве кода адреса используется код, находящейся в регистре-указателе стека. При запуске микроконтроллера в
регистр-указатель стека заносится код числа 0. Для нормальной работы
стека в регистр-указатель стека в начале программы необходимо занести
код другого числа. Обычно в качестве такого числа используют старший
адрес в SRAM. Например, для микроконтроллера типа 8515 таким адресом является число $025F.
43

1.4.12. Команды с обращением к регистрам ввода-вывода
По командам с обращением к регистрам ввода-вывода выполняются
операции пересылки (копирования) байта между регистром общего назначения и регистром ввода-вывода с использованием для выбора регистра ввода-вывода его номера ($00 – $3F).
Команды с обращением к регистрам ввода-вывода описаны в
табл. 1.6. Машинные коды команд имеют формат «слово». Команды выполняются за один такт.
В таблице 1.6 используются следующие новые обозначения:
PrP – регистр ввода-вывода с номером P;
(PrP) – байт в регистре PrP.
При записи мнемокода команды вместо конкретного номера регистра
может использоваться его символическое имя.
Все регистры ввода-вывода имеют штатные имена. У микроконтроллеров разных типов регистры ввода-вывода, имеющие одинаковые имена,
могут иметь разные имена. При записи в мнемокодах имён регистров вместо их номера необходимо использовать версию AVR ассемблера для
микроконтроллера данного типа.
По команде с обращением к FlashROM выполняется пересылка (копирование) байта из половины ячейки памяти в FlashROM в регистр общего назначения R0. Команда описана в табл. 1.7. Машинный код команды имеет формат «слово». Команда выполняется за три такта.
До выполнения команды необходимо адрес, соответствующий ячейке памяти в FlashROM, в которой хранится константа, умножить на два и
записать в пару регистров Z (№ $30, $31).
При умножении на два (сдвиг кода влево на один разряд) в младшем
разряде регистра ZL ($30) оказывается цифра 0. При нулевом значении
младшего разряда выбирается байт из младшей половины ячейки
FlashROM. Для выбора байта из старшей половины ячейки необходимо
число, код которого находится в паре регистров Z, увеличить на 1 с использованием команды № 33 с мнемокодом ADIWR30, 1 или ADIWZL, 1.
Запись констант в FlashROM выполняется при программировании
микроконтроллера и бывает полезной для хранения массивов данных или
параметров настройки (например, байт калибровки встроенного тактового
генератора).
44
1.4.13. Команда с обращением к FlashROM

1.4.14. Команды операций с битами
Команды операций с битами описаны в табл. 1.8 и 1.9. Машинные
коды всех команд имеют формат «слово». Команды № 65 и 66 выполняются за два такта, остальные команды – за один такт.
В таблице 1.8 используется следующее новое обозначение:
PrP.b – разряд b (b = 0 – 7) регистра ввода-вывода с номером P
(P = $00 – $1F (!)), бит в разряде PrP.b.
По командам № 63 и 64 выполняется пересылка (копирование) бита
между указанным разрядом регистра общего назначения и разрядом
Tрегистра SREG.
По командам № 65 и 66 устанавливается в требуемое состояние
(0 или 1 соответственно) указанный разряд регистра ввода-вывода, а по
командам № 67 и 68 – указанный разряд регистра SREG.
При записи мнемокода команд № 65 и 66 вместо номера регистра (P)
может быть указанно его символическое имя, а вместо номера разряды
(b) – символическое имя разряда. В микроконтроллерах семейства AVR
разряды многих регистров ввода-вывода имеют штатные имена. Эти имена приводятся в тексте при рассмотрении устройств, в которых эти разряды используются.
В микроконтроллерах некоторых типов разряды одноимённых регистров с одинаковыми именами имеют разные номера. При использовании
штатных имён регистров ввода-вывода в штатных имён разрядов в них
необходимо использовать версию AVR ассемблера для микроконтроллера
соответствующего типа.
При назначении штатного имени разряда подразумевалось, что этот
разряд принадлежит определённому регистру ввода-вывода, однако в
мнемокоде команд № 65 и 66 необходимо указывать и имя/номер регистра
и имя разряда.
Требуемое значение бита (0 или 1) в разрядах регистров вводавывода с номерами от $20 до $3F устанавливается с использованием команд регистровых операций с мнемокодами CBR (№ 29) и SBR (№ 31)
соответственно.
В таблице 1.9 приведены мнемокоды команд, по которым устанавливаются в определённое состояние (0 или 1) разряды регистра SREG без
указания в мнемокоде команды номера разряда.
1.4.15. Команды управления ходом программы
В группу команд управления ходом программы входят команды безусловного и условного переходов, перехода в энергосберегающий режим,
перезапуска сторожевого таймера и «холостая» команда.
В таблице 1.10 описаны команды безусловного перехода (№ 85 и 86),
безусловного перехода с возвратом (№ 87 и 88), возврата из подпрограм-
45

мы (№ 89) и возврата из прерывающей программы (№ 90). В таблице используются следующие новые обозначения:
PC – счётчик команд;
(PC) – код числа в счётчике команд;
k – приращение числа в счётчике команд.
При записи программы на языке ассемблера в мнемокодах команд
№ 85 и 87 вместо приращения k указывается метка (символический адрес), записанная перед мнемокодом команды, к выполнению которой
нужно перейти. Приращение вычисляется и помещается в машинный код
команды в процессе ассемблирования.
Машинные коды команд, описанные в табл. 1.10, имеют формат
«слово». Команды безусловного перехода (№ 85 и 86) выполняются за два
такта, команды безусловного перехода, а возвратом (№ 87 и 88) – за три
такта, команды возврата (№ 89 и 90) – за четыре такта.
Группа команд условного перехода делится на две группы. В командах
первой подгруппы в качестве условия используется равенство нулю или
равенство единице одного из битов в регистре SREG. Условия и мнемокоды
команд первой подгруппы приведены в табл. 1.11. Если условие выполняется, совершается переход по адресу, который формируется с использованием приращения k, указанного в коде команды ((PC) + 1 + k→PC;
– 64 ≤ k ≤ 63).
Если условие не выполняется, происходит переход к следующей команде в программе ((PC) + 1→PC).
При записи программы на языке ассемблера в мнемокоде команд
вместо приращения k указывается метка (символический адрес), записанная перед мнемокодом команды, к выполнению которой нужно перейти,
если условие выполняется.
Машинные коды команд первой подгруппы имеют формат «слово».
При выполнении условия команда выполняется за два такта, при выполнении условия – за один такт.
Если условие не выполняется, совершается переход к очередной команде в программе ((PC) +1→PC). Если условие выполняется, происходит
переход к выполнению команды, следующей за очередной ((PC) + 1 +
+ 1/2→PC). Приращение числа в счётчике команд (1 или 2) определяется
форматом машинного кода очередной команды (1 слово или 2 слова соответственно).
Машинные коды команд условного перехода второй подгруппы
имеют формат «слово». Команды выполняются за один такт, если условие
не выполняется, за два такта, если условие выполняется и очередная команда (K1) имеет формат «слово», или за три такта, если условие не выполняется и очередная команда (K1) имеет формат «2 слова».
46

1.5. ПРОГРАММИРОВАНИЕ ПАМЯТИ
Для того чтобы загрузить программу во Flash-память, служат специальные программаторы, которые делятся на последовательные и параллельные. Помимо этого для моделей семейства Mega есть ещё способ
программирования с помощью JTAG – стандартизированного (IEEE
Std 1149.1–1990) интерфейса для отладки и тестирования микроконтроллерных устройств, о котором мы уже упоминали. Но мы не будем здесь на
этом останавливаться: в любительских конструкциях, да и во многих
профессиональных, он не употребляется.
Последовательные программаторы ещё называют ISP (In-System
Programmer, что переводится, как «внутрисистемный программатор»),
потому что они обычно не предполагают специального устройства для
подсоединения и питания программируемой микросхемы, а заканчиваются обычным плоским кабелем с двухрядным штырьковым разъёмом типа
IDC, который подсоединяется к специально предусмотренной штыревой
части, располагаемой прямо на плате вашего устройства. Точно такие же
разъёмы служат для подсоединения периферии к материнским платам ПК.
Название IDC относится к варианту в корпусе, в бескорпусном двухрядном варианте эти разъёмы именуются PLD, в однорядном – PLS. Питание
на программатор при этом поступает от самой схемы.
Такой вариант очень удобен для отладки – МК находится в «родном»
окружении и сразу после программирования автоматически начинает работать. Причём внешние элементы (с некоторыми оговорками) процессу
программирования обычно не мешают. Этот способ программирования и
позволяет превратить любую схему в отладочный модуль.
Недостаток последовательного способа программирования – дополнительная площадь, которую будут занимать «лишние» элементы на плате, а также некоторое снижение помехоустойчивости. Зато всегда без особых сложностей можно поправить ошибку в программе и дополнить её
функциональность – хоть через месяц, хоть через год, что очень важно
для любительских или экспериментальных конструкций, которые, как
правило, выпускаются в одном-двух экземплярах.
Последовательное программирование AVR есть по сути использование стандартного последовательного интерфейса SPI в специфических
целях, причём следует учитывать, что в некоторых моделях (например,
Atmega64 и Atmega128) контакты собственно SPI с выводами программирования не совпадают.
Процесс последовательного программирования начинается с того,
что на вывод SCK подаётся напряжение уровня «земли», далее на RESET –
короткий положительный импульс, и затем последний также оставляют в
состоянии низкого уровня не менее чем на 20 мс (можно предварительно
подключить эти выводы к низкому уровню, а затем включить питание
47

контроллера). При этом микросхема переходит в режим ожидания команд
программирования. Отсюда понятно, почему снижается помехоустойчивость – такое сочетание уровней вполне может возникнуть в процессе
эксплуатации из-за наводок на выводы разъёма программирования. Правда, исправить ситуацию оказалось довольно просто – установкой дополнительных «подтягивающих» резисторов.
Последовательное программирование поддерживают не все контроллеры AVR из семейства Tiny. В отличие от последовательного, параллельный способ программирования применяется для микросхемы, извлеченной из устройства, поэтому её требуется обязательно устанавливать на
панельку. Параллельные программаторы, как правило, в той или иной
степени универсальны, и подходят для множества различных программируемых чипов, начиная от микросхем ПЗУ (в том числе и компьютерной
BIOS) и заканчивая большинством МК. Например, показанный на
рис. 1.15 популярный AutoProg поддерживает около 4000 типов микросхем. Такие программаторы, естественно, относительно дороги (не самый
дорогой в своем классе AutoProg продаётся почти за 9000 р.), что и понятно – представьте, сколько труда вложено в программное обеспечение с
поддержкой такого количества чипов. Экономически целесообразны они
для тех, кто много работает с различными семействами микросхем, а также для изготовления серийной продукции с отлаженной программой, в
которой разъёмы ISP-систем будут только мешать. Для отладки универсальные программаторы неудобны – приходится часто вытаскивать и
вставлять микросхему в панельку с риском повредить и то и другое, а для
некоторых типов корпусов это может быть вообще исключено, если не
предусмотрено соответствующего переходника.
48
Рис. 1.15. Параллельный программатор AutoProg

Если вы работаете только с одним типом микросхем, но хотите тиражировать отлаженное изделие без лишних разъёмов на плате, то вам
ничего не стоит изготовить отдельный программатор на основе ISPсистемы. Правда, «оживить» чипы AVR, в которых по ошибке были неправильно запрограммированы fuse-биты, отвечающие за источник тактового сигнала, можно только либо с помощью параллельного программатора, либо с помощью схемы с источником внешнего тактового сигнала.
И тот и другой способ программирования не составляет никакого
секрета и подробно излагается в описании любого AVR. Так что в принципе программатор может быть изготовлен самостоятельно – как в виде
аппаратного устройства, обычно подключаемого через СОМ-порт, так и в
чисто программном виде, с подключением кристалла через LPT. Причём
Atmel даже приводит в своих рекомендациях типовую схему простейшего
ISP-программатора – см. «аппноту» AVR910, которая в PDF-формате со-
держит схему, а asm-файлы включают исходные коды «прошивки». Для
программирования таким программатором существует множество бесплатных программ, например PonyPROG.
Конечно, изготовление программатора самостоятельно – дело довольно простое, однако затраченные усилия могут не соответствовать результату. Программатор можно приобрести в самой Atmel, хотя это и нецелесообразно по ряду причин – долго, так как его нужно заказывать «изза океана», и дорого (зато поддержка AVR Studio обеспечена). Дешёвенькое «наколеночное» устройство такого типа можно приобрести рублей за
300 через Интернет, а цена «более фирменных» ISP-систем не выходит за
пределы примерно 30 долларов.
Привлекательны для покупки программаторы под названием
AVR-doper (http://www.obdev.at/products/vusb/avrdoper.html), которые используют разъём USB для подключения к компьютеру. Являясь программным клоном фирменного адаптера STK-500, для программирования
используется интерфейс AVR Studio. Этот программатор можно изготовить самостоятельно, купить готовый в Интернете или набор для самостоятельной сборки.
Программирующий разъём – десятиконтактный игольчатый IDC
(в корпусе) или PLD (бескорпусной), и именно разъём такого типа стал
стандартом, его используют многие ISP, кроме простейшего ISP от самой
Atmel, где разъём минимальный – шестиконтактный (три линии собственно SPI, а также два питания и RESET). Впрочем, всегда можно изготовить
переходник, так как все последовательные программаторы работают по
одним и тем же линиям (в десятиконтактном разъёме «лишние» контакты
используются для разделения сигнальных линий «земляными», так же,
как в соединительном кабеле IDE-интерфейса жёстких дисков).
Внешний вид программирующего разъёма PLD-10 на макетной плате
и разводка его выводов показана на рис. 1.16.
49

Рис. 1.16. Пример расположения программирующего разъёма PLD-10 на
макетной плате и его разводка выводов
Обратите внимание, что отсчёт выводов ведётся не по кругу, как для
микросхем: в нижнем ряду расположены все нечётные выводы, а в верхнем – чётные (это удобно, так как не приходится нарушать нумерацию у
разъёмов с различным числом контактов, когда короткие могут получаться из длинных простым отламыванием лишней части). Естественно, при
отсутствии чехла с прорезью ответная часть может быть присоединена
двумя способами, поэтому первый вывод на плате следует помечать.
Названия выводов на рис. 1.16 соответствуют таковым у контроллера.
50
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
