- •Встраиваемые микроконтроллеры avr-8
- •Санкт-Петербург 2013 Содержание
- •Часть 1. Архитектура мк (л2, л3)
- •Понятия мк для встраиваемых приложений и семейства мк. Семейство avr-8
- •Структура и архитектура мк
- •Тактирование, процессор и арифметико-логическая группа команд
- •Структура и адресация памяти программ. Ветвления, циклы, подпрограммы, и группа команд передачи управления
- •Структура и адресация памяти данных. Группа команд передачи данных
- •Порты ввода/вывода. Типовая схема включения мк. Структура управляющей программы, поллинг.
- •Часть 2. Процесс проектирования устройств на мк (л4, л5)
- •2.1. Этапы процесса проектирования устройств на мк
- •2.2.Техническое задание и разработка алгоритма (блок-схемы)
- •2.3. Языки программирования и синтаксическая проверка проекта
- •2.4. Средства загрузки кодов программ и данных (программаторы)
- •2.5. Средства отладки для выявления логических и схемотехнических ошибок
- •2.6. Подключение индикаторов и клавиатуры
- •Часть 3. Ввод/вывод в мпу
- •3.1. Понятие и характеристики интерфейса
- •3.2. Внутрисистемные интерфейсы в мпу
- •3.3 Параллельный порт avr
- •3.4. Внешняя магистраль памяти данных avr мк
- •3.5. Принцип и средства ввода/вывода по прерываниям.
- •3.6. Принцип прямого доступа к памяти
- •Часть 4. Прерывания (л8)
- •4.1. Механизм прерываний в avr и его программирование
- •4.2. Входы прерываний inTx и pcinTx.
- •Часть 5. Таймеры/счетчики
- •5.1. Задачи формирования и измерения временных интервалов
- •5.2. Принципы программного формирования/измерения временного интервала
- •5.3. Таймер/счетчик с прерыванием по переполнению
- •5.4. Таймер/счетчик с дополнительными узлами захвата и сравнения
- •Часть 6. Задачи и устройства аналогового ввода/вывода (л12, л13)
- •6.1. Задачи аналогового ввода и вывода
- •6.2. Встроенный аналоговый компаратор
- •6.3. Встроенный многоканальный ацп
- •6.4. Встроенный цап
- •Часть 7. Задачи и устройства последовательного интерфейса (л14, л15)
- •7.1. Принципы и преимущества последовательного интерфейса
- •7.2. Функции встроенного контроллера последовательного интерфейса
- •7.3. Протокол и контроллер трехпроводного синхронного пи (spi)
- •7.4. Устройство контроллера i2c и его применение
- •7.5 Цап с последовательным интерфейсом
- •7.6. Устройство контроллера u(s)art и его применение
- •7.7. Сетевые протоколы и их стандартизация
- •7.8. Открытый протокол Modbus
- •История
- •Введение
- •Категории кодов функций
- •Модель данных
- •Стандартные функции протокола Modbus
- •Запись одного значения
- •Запись нескольких значений
- •Контроль ошибок в протоколе Modbus rtu
- •Rtu фрейм
- •Логические ошибки
- •Стандартные коды ошибок
Тактирование, процессор и арифметико-логическая группа команд
Тактирование, энергопотребление и сброс
Работа всех цифровых узлов МК начиная с процессора и кончая блоками ввода/вывода, требует тактирования для синхронизации выполняемых действий.
Частота тактирования fclk для каждой конкретной модели имеет предельное верхнее значение fclk_max, значительное превышение которого ведет к перегреву кристалла и увеличивает вероятность сбоев. Работа на частоте равной или близкой к fclk_max обеспечивает максимальную производительность процессора и узлов ввода/вывода.
Значение fclk_max в общем случае зависит от диапазона допустимого напряжения питания МК. Например в диапазоне питания 4.5...5.5 В значение fmax для AT90S8515 составляет 8 МГц, а для ATmega164A – 20 МГц. При снижении нижнего предела напряжения питания до 2.7 В предельная частота должна быть в два раза ниже – 4 и 10 МГц соответственно.
Выбор частоты влияет на энергопотребление МК – с ростом частоты растет ток потребления. Это определяется КМОП технологией МК: статический ток потребления почти отсутствует, присутствует емкостной ток переключения транзисторных ячеек: I = U / Xc = Vcc * 2π fclk * C, где C – эквивалентная емкость МК, зависящая от режима работы и состава работающих периферийных блоков. Это актуально для мобильных приложений с питанием от химических источников (аккумулятор или "батарейка"). Данная формула не учитывает составляющую тока выходов МК, номинальные значения которых может достигать 20 мА на один выход.
В задачах управления некоторые узлы и функции предъявляют повышенные требования к стабильности и точности поддержания заданного значения частоты тактирования fclk. В первую очередь это относится к модулям таймера/счетчика и контроллера асинхронной последовательной связи типа U(S)ART.
Современные МК поддерживают несколько способов тактирования, смена способа выполняется с использованием устройства загрузки ("программатора") через биты конфигурации (Fuse-биты).
Как правило, при поставке эти биты обеспечивают выбор тактирования от встроенного RC-генератора. Недостатки такого способа заключаются в невысокой стабильности (влияние напряжения питания и температуры) и точности (разброс параметров R и C). Варианты МК с калиброванными значениями R и C обеспечивают разброс не хуже 1%.
Альтернативой встроенного тактирования являются способы с внешним тактированием, что требует использования одного или двух выводов МК. В МК подсемейства ATtiny с малым числом выводов (8, 20) приходится искать компромисс, так как не используемые для тактирования выводы можно использовать как входы/выходы общего назначения.
Самый распространенный вариант внешнего тактирования - использование кварцевого резонатора, требует двух выводов XTAL1, XTAL2 (см. рис. 2.1).
Варианты с использованием одного входа тактирования XTAL1 сводятся к использованию внешней RC-цепи или внешнего тактового генератора. Стоимость такого генератора сравнима со стоимостью «младших» моделей МК.
Энергопотребление современных МК достаточно мало – мощность P = 5 В * (10...300) мА = 50...1500 мВт при максимальной частоте тактирования. Для работы в мобильных приложениях, а также при реализации функции часов реального времени актуальны режимы пониженного энергопотребления. Они основаны на программном отключении ряда или большинства блоков МК (режим "сна") и последующей активации по внутреннему или внешнему сигналу (прерывания). Это позволяет снизить потребляемый ток на 1...3 порядка и иметь весьма малое время пробуждения.
Не следует забывать и о снижении частоты тактирования для снижения энергопотребления. Современные модели МК кроме выбора способа тактирования битами конфигурации позволяют программно менять коэффициент деления частоты или переключаться на альтернативные источники тактирования – RC- генератор сторожевого таймера (около 1 МГц) или генератор часов реального времени (обычно 32768 Гц).
Сброс МК - это процедура при старте или рестарте (прекращении выполнении программы), состоящая из трех автоматически выполняемых этапов:
1) этап пуска и установления работы тактового генератора; время определяется состоянием специальных Fuse-битов от единиц микросекунд (для внешнего тактового генератора) до десятков миллисекунд (для тактирования с использованием RC или кварцевого резонатора);
2) этап предустановки регистров процессора и РВВ (РСФ) в заданное начальное состояние (несколько машинных тактов); это обеспечивает строго определенное состояние устройств ввода/вывода;
3) счетчик команд устанавливается на нулевой адрес памяти программ и процессор переходит к выполнению программы.
Напомним, что содержимое энергозависимой памяти данных (ОЗУ и РОН) при сбросе не инициализируется – это забота программиста.
Процедура сброса в AVR МК выполняется автоматически в следующих случаях:
1) штатное включение питания – по нарастанию напряжения питания выше заданного уровня [Power-On Reset];
2) переход уровня напряжения на входе RESET из ВЫСОКОГО в НИЗКИЙ; ВЫСОКИЙ уровень используется для подключения программатора/отладчика, реже – для кнопки сброса;
3) переполнение сторожевого таймера [WatchDog] – используется для борьбы с зависанием, то есть с непредусмотренным зацикливанием программы, механизм может быть запрещен специальным Fuse-битом или программой;
4) снижение напряжения питания ниже заданного уровня [Brown-Out Detector], данный механизм выбирается Fuse-битом ;
5) сброс по интерфейсу JTAG, данный механизм выбирается соответствующим Fuse-битом.
Процессор с точки зрения программиста представлен рядом явно адресуемых регистров (файл 8-битных регистров общего назначения R0…R31, регистр состояния Status REGister и регистр указатель стека Stack Pointer) и неявно используемого регистра счетчик команд [Program Counter]. Старшие шесть РОН R26…R31 используются как три 16 битных указателя: X = R26:R27, Y = R28:R29, Z = R30:R31, здесь «:» - знак конкатенации, обозначающий для указателя X, что в R26 хранится старшая, а в R27 – младшая часть адреса. Все три указателя используются при адресации памяти данных SRAM, для адресации к памяти программ FlashROM используется только указатель Z.
Регистр состояния SREG содержит битовые флаги, отражающие результаты арифметико-логических операций и влияющие на ход выполнения программ: SREG.0 = C [Carry] – перенос в С из старшего 7-го разряда при сложении или заем из С при вычитании; SREG.1 = Z [Zero] – нулевой результат; SREG.2 = N [Negative] – отрицательный результат; SREG. 3 = V [oVerflow] – переполнение дополнительного кода (для чисел со знаком) и т. д.
Указатель стека SP [Stack pointer] используется в механизме вызова подпрограмм для хранения адреса возврата и, при необходимости, данных. Детально этот механизм будет рассмотрен в следующих разделах.
Содержимое регистра счетчика команд PC служит для адресации очередной команды в ПП. Оно автоматически увеличивается на единицу или двойку при выполнении команд арифметико-логической группы и группы передачи данных (число 1 или 2 определяется по длине самой команды). Если же встречается команда перехода (ветвления), содержимое счетчика команд изменяется в соответствии с указанием самой команды.
На рис. 1.2 приведена структура ядра МК, включающая память программ FlashROM, память данных SRAM, процессор AVR CPU и внутреннюю магистраль адресного пространства памяти данных с 8-разрядной шиной данных ШД8.
Рис. 1.2. Ядро и процессор
В состав процессора кроме перечисленных выше программно доступных элементов входят:
- арифметико-логическое устройство АЛУ - выполняет команды обработки данных, то есть собственно вычисления, поэтому определяет вычислительную производительность;
- регистр команд [Instruction Register] используется для размещения кода исполняемой команды; декодер команды [Instruction Decoder] анализирует формат команды, выделяет из нее код операции (КОП) и группы бит адресации данных или адресации в памяти программ. Адресация данных требует 4 или 5 бит для выбора РОН, 6 бит для области РВВ, от 9 до 16 бит в области SRAM;
- устройство управления (УУ) под управлением тактовых импульсов fclk реализует последовательное выполнение команд, в современных МП - конвейерное выполнение нескольких команд.
Выполнение каждой команды требует выполнения последовательности действий, называемой машинным циклом.
1. Выборка команды по адресу указателя команды и прибавление 1 или 2 к значению указателя PC + 1/2 PC.
2. Декодирование кода команды.
3. Выполнение команды, включающее возможную выборку данных и/или запись результата в указанную ячейку, а для команд перехода – модификация указателя команды PC.
В МП с конвейерными принципом выполнения команд под временем цикла понимают темп выполнения команд. Например, при 4-х этапном конвейере время выполнения короткой команды составляет 4 цикла, но темп выполнения программы составляет одну команду за цикл. Исключение составляют команды перехода, нарушающие последовательное наращивание адреса команды. Темп их выполнения "сбивает" работу конвейера и увеличивает темп выполнения до 4 циклов соответственно.
Арифметико-логическая группа команд
Системы счисления и форматы данных
В 8-разрядных МК основным форматом данных является байт [byte], состоящий из 8 бит [bit] данных. Часть регистров представляют объединение двух байт в одно слово [word], еще реже встречаются адресные указатели из трех байт.
Как известно, один бит (двоичный разряд) может принимать только два значения: 0 (или "НИЗКИЙ", то есть сигнал с напряжением близким к нулю питания GND) и 1 (или "ВЫСОКИЙ", то есть сигнал с напряжением близким к напряжению питания +VCC).
При использовании данных в формате байта диапазон представляемых целых чисел зависит от интерпретации двоичного эквивалента. Если подразумеваются целые числа без знака, то диапазон представлен от 0 до 255 = 28 - 1. Для чисел со знаком диапазон от -128 = -27 до +127 = 27 - 1, старший (7-ой разряд) выступает как знаковый (0 - положительное число, 1 - отрицательное), отрицательные числа представлены в двоично-дополнительном коде. Такой способ представления удобен тем, что для выполнения операций сложения и вычитания как над числами со знаком, так и для чисел без знака подходят одинаковые машинные команды.
Для операций умножения и деления беззнаковых и знаковых чисел требуются разные команды или алгоритмы.
Трансляторы языка С/С++ используют для работы с байтом тип данных char, со словом - тип int, с двойным словом (4 байта) - тип long. Для обозначения беззнаковых чисел добавляется прилагательное unsigned, для знаковых - signed.
Для представления констант в исходных текстах программ используются как десятичные числа (по умолчанию), так и их двоичные (префикс 0b) или шестнадцатеричные (префиксы 0x или $, или суффикс h) эквиваленты. Например, 12 = 0х0С = 0b00001100. Использование двоичного и шестнадцатеричного форматов удобно при работе с отдельными двоичными разрядами и при работе с адресами.
В Приложении 1 подробно рассмотрены системы счисления и форматы представления чисел.
Особенностью арифметико-логических группы команд в МК AVR является то, что в качестве операндов используются только регистры общего назначения. Это упрощает адресацию и позволяет выполнять почти все команды за один машинный цикл.
Большинство команд этой группы выполняются за 1 машинный цикл, имеют формат 1 слово (2 байта) и изменяют биты регистра состояния SREG.
Код команды (16 двоичных разрядов – слово [word]) состоит из кода операции и поля адресации одного или двух операндов. Для адресации одного РОН (R0…R31) достаточно 5 двоичных разрядов (25 = 32). В некоторых командах для экономии поля адресации используется только 4 разряда, что позволяет адресовать только 16 старших РОН R16 … R31. Под константу в коде команды отводится 6 (26 = 64) или 8 разрядов (28 = 256).
Арифметико-логические команды выполняют различные операции над знаковыми и беззнаковыми числами форматом 1 байт (8 бит). Исключение составляют команды, в мнемонику которых входит буква W – они оперируют с двухбайтными операндами, размещаемыми в смежных регистрах, например, r25:24. Все операции производятся только над регистрами общего назначения (т. е. используется так называемая регистровая адресация) и/или константой (абсолютная адресация).
Подгруппа арифметических команд.
Подгруппа команд арифметических операций выполняет такие базовые действия, как сложение (ADD, ADC, ADIW), вычитание (SUB, SUBI, SBC, SBCI, SBIW), инкремент (прибавление единицы – INC), и декремент (вычитание единицы – DEC). Важно отметить, что все эти команды с равным успехом применимы как к беззнаковым целым в формате 1 байт с диапазоном от 0 до 255 = 0xFF, так и к знаковым в двоично-дополнительном коде (от –128 = 0x80 до +127 = 0x7F).
Команды сложения и вычитания могут работать как с числами без знака (0...255), так и с числами со знаком в двоично-дополнительном формате (-128...+127) - это одни и теже команды, разница заключается лишь в интерпретации результата, для чего дополнительно используются биты-признаки регистра состояния SREG.
Например, при выполнении операции сложения беззнаковых чисел 250 = 0xfa = 0b1111'1010 и 8 = 0x08 = 0b0000'1000 результат будет 250 + 8 = 257 = 0x0102 = 0b1'0000'0010. Он не помещается в один байт, поэтому в регистре-приемнике будет число 0х02, единица из 8-го бита результата разместится в бите С [Carry] регистра SREG, выполняя роль признака переноса. H-флаг уст-ся.
При выполнении сложения чисел со знаком тому же двоичному числу 0xfa = 0b1111'1010 соответствует отрицательное десятичное -6, результат сложения -6 + 8 = 2, С = 1 означает заем.
2 – 8 = -6: r16=2, r17=8, sub r16,r17, r16=0xfa , 1: H,S,N,C
Сложение и вычитание многобайтных чисел выполняются побайтно начиная с младших байтов.
Команда деления отсутствует во всех МК серии AVR, умножения – в подгруппах Tiny и Classic.
Микроконтроллеры подсемейства MEGA выполняют операции умножения (MUL, MULS, MULSU, FMUL, FMULS, FMULSU) целых и дробных чисел форматом один байт с учетом и без учета знака. Умножение знаковых и беззнаковых чисел требует разных команд, отдельную группу составляют команды умножения дробных чисел.
В отсутствии команд умножения, для умножения многобайтных чисел и для выполнения операций деления используются алгоритмы с командами арифметических сдвигов. Команды сдвига вправо (ASR) или влево (LSL) эквивалентны делению на 2 и умножению на 2 соответственно.
Подгруппа логических команд.
AND, ANDI, OR, ORI, EOR, COM, NEG, SBR, CBR,
Первую подгруппу образуют однооперандные команды, изменяющие содержание указанного РОН:
- COM инвертирует каждый бит, эквивалент операции С “~”, например, из числа 0x01 = 0b00000001 получим 0xfe = 0b11111110;
- NEG меняет знак числа в двично-дополнительном коде, например, из числа 0x01 = 1получим 0xff = - 1.
- CBR обнуляет все биты, например, из числа 0x01 получим 0x00;
- SBR устанавливает в «1» все биты, например из числа 0x01 получим 0xff.
Вторая подгруппа образована двухоперандными командами поразрядной обработки, в командах с суффиксом xxxI второй операнд представлен 8-битной константой в теле команды, в остальных оба операнда находятся в РОН:
- AND и ANDI выполняют операцию «поразрядное логическое И»: результат «1» только если оба бита «1», эквивалент операции С “&”; например, R0 = 0b01101001, R1 = 0b00001111, после команды AND R0, R1 результат R0 = 0b00001001;
- OR и ORI выполняют операцию «поразрядное логическое ИЛИ»: результат «1», если хотя бы один бит «1», эквивалент операции С “|”; например, R0 = 0b01101001, R1 = 0b00001111, после команды OR R0, R1 результат R0 = 0b01101111;
- EOR выполняет операцию «поразрядное логическое исключающее ИЛИ» (иначе «сумма по модулю 2»): результат «1» если оба бита не совпадают, эквивалент операции С “¬”; например, R0 = 0b01101001, R1 = 0b00001111, после команды EOR R0, R1 результат R0 = 0b01100110.
Подгруппа команд сдвига.
ASR, LSL, LSR, ROL, ROR, SWAP
При сдвигах содержимое двоичных разрядов адресуемого РОН сдвигается на один разряд:
- вправо [right], Rd[n+1] Rd[n], n = 0…6, команды ASR, LSR, ROR,
- или влево [left], Rd[n] Rd[n+1], n = 6…0, команды LSL, ROL.
По порядку сдвигов 7-го и 0-го битов различают:
- циклический сдвиг [ROx], когда содержимое РОН сдвигается «по кругу» через 9-ый бит C [SREG.Carry], ROL: C Rd[0], Rd[7] C, ROR: C Rd[7], Rd[0] C,
- логический сдвиг [LSx], когда выдвигаемый бит помещается в SREG.C, а вдвигаемый равен нулю, эквивалент операции С “<<”или “>>”;
- арифметический сдвиг вправо ASR, который отличается от LSR тем, что копируется содержимое старшего знакового разряда, что удобно при выполнении деления на 2 чисел со знаком.
Особняком стоит команда SWAP, при выполнении которой меняются местами тетрады (старшие и младшие 4 бита).
