Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Микропроцессоры и микроЭВМ. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
№ Условие
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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]