Atmega таблица: Новые микроконтроллеры AVR от Microchip – преемники Mega

Содержание

Новые микроконтроллеры AVR от Microchip – преемники Mega

29 декабря 2020

Александр Белов (КОМПЭЛ)

В начале года Microchip анонсировал выход новой линейки 8-битных микроконтроллеров AVR, которая придет на смену контроллерам высокой и средний производительности ATmega. На данный момент в линейку входят серии AVR-DA, AVR-DB и AVR-DD. В статье разобраны отличия новой линейки от ее предшественницы, рассмотрены характеристики новых серий и проведено их сравнение между собой.

Семейство 8-битных микроконтроллеров AVR было создано компанией Atmel в 1996 году. Данные МК имеют гарвардскую архитектуру, то есть исполняемый код и данные находятся в разных адресных пространствах, и систему команд, близкую к идеологии RISC.

В 2016 году компания Microchip – американский производитель электроники, — приобрела компанию Atmel и пополнила свое портфолио 8-битных микроконтроллеров, представленное устройствами с ядром PIC, микроконтроллерами с архитектурой AVR.

Исторически микроконтроллеры с архитектурой AVR делились на три линейки:

ATtiny – это контроллеры начального уровня с небольшим объемом памяти программ – до 32 кбайт в компактных корпусах (до 32-х выводов).

ATmega – контроллеры средней и высокой производительности с объем памяти до 256 кбайт в корпусах до 100 выводов. Последним пополнением этой линейки стала серия ATmega-0 (ее флагман – ATmega4809), выпущенная в 2018 году. Обновление линейки не планируется, дальнейшим развитием линейки ATmega стала новая линейка AVR, с одноименной архитектурой.

ATxmega – устройства с максимальной производительность, до 384 кбайт памяти программ. Последней выпущенной серией стала E5, увидевшая свет в 2013 году. Развитие этой линейки остановлено, поскольку нишу производительных контроллеров заняли 32-битные микроконтроллеры на базе ядер группы ARM Cortex-M.

В начале 2020 года Microchip анонсировал три серии микроконтроллеров, принадлежащих к новой линейке AVR:

Вместе с названием линейки изменилось и обозначение устройств. Маркировка теперь имеет вид «AVRXXYYZZ», где:

  • XX – объем памяти в килобайтах;
  • YY – семейство;
  • ZZ – количество выводов корпуса.

Серия AVR-DA

Серия AVR-DA состоит из 11 устройств с вариантами выбора объема памяти от 32 до 128 кбайт в корпусах 28…64 вывода. Эта серия была выпущена первой, все ее представители уже доступны для заказа. В таблице 1 указан состав серии и параметры микроконтроллеров.

Таблица 1. Состав и характеристики серии AVR-DA

Наименование Частота ядра, МГц Flash, кбайт SRAM, кбайт EEPROM, байт Вы-
воды
12 бит АЦП 10 бит ЦАП Компара-
торы
PTC ZCD USART/SPI/I2C Таймеры  Корпуса
AVR128DA28 24 128 16 512 28 1 1 3 1 1 3/2/1 5 SPDIP, SOIC, SSOP
AVR128DA32 24 128 16 512 32 1 1 3 1 1 3/2/2 5 TQFP, VQFN
AVR128DA48 24 128 16 512 48 1 1 3 1 2 5/2/2 7 TQFP, VQFN
AVR128DA64 24 128 16 512 64 1 1 3 1 3 6/2/2 8 TQFP, VQFN
AVR64DA28 24 64 8 512 28 1 1 3 1 1 3/2/1 5 SPDIP, SOIC, SSOP
AVR64DA32 24 64 8 512 32 1 1 3 1 1 3/2/2 5 TQFP, VQFN
AVR64DA48 24 64 8 512 48 1 1 3 1 2 5/2/2 7 TQFP, VQFN
AVR64DA64 24 64 8 512 64 1 1 3 1 3 6/2/2 8 TQFP, VQFN
AVR32DA28 24 32 4 512 28 1 1 3 1 1 3/2/1 5 SPDIP, SOIC, SSOP
AVR32DA32 24 32 4 512 32 1 1 3 1 1 3/2/2 5 TQFP, VQFN
AVR32DA48 24 32 512 4 48 1 1 3 1 2 5/2/2 6 TQFP, VQFN

Изменения коснулись ядра и его системы питания: ядро может функционировать на увеличенной максимальной частоте 24 МГц во всем диапазоне питающего напряжения 1,8…5,5 В.

Впервые в устройствах AVR появился модуль Zero Cross Detector – детектор пересечения переменным током нулевого уровня. Раньше это была периферия, свойственная только PIC-контроллерам.

АЦП было обновлено: новая версия обеспечивает оцифровку аналогового напряжения с частотой до 130 Гц и разрешением 12-бит с возможностью включения дифференциального режима работы. Аккумулятор был увеличен до 128 семплов. Как и в предыдущей версии, поддерживаются следующие режимы работы:

  • единичное преобразование;
  • режим непрерывного преобразования;
  • режим накопления;
  • режим сравнения с порогом;
  • режим запуска по событию;
  • режим измерения температуры (от встроенного датчика температуры).

В устройствах новой линейки появился модуль ЦАП. Напомним, что контроллеры Mega такового не имели. Преобразователь работает на скорости 140 ksps и имеет разрешение 10 бит.

По сравнению с линейкой ATmega, было увеличено количество следующих модулей периферии:

  • количество модулей USART увеличено до шести;
  • количество аналоговых компараторов увеличено до трех.

Обратим внимание на наличие специфической периферии – Peripheral Touch Controller, сенсорного контроллера, позволяющего реализовать емкостные сенсорные элементы управления – кнопки, слайдеры, спиннеры и 2D-поверхности. Благодаря библиотеке QTouch Library настройка этого модуля сводится к нескольким кликам мыши.

Структурная схема устройств серии AVR-DA изображена на рисунке 1.

Рис. 1. Блок-схема устройств семейства AVR-DA

Для оценки возможностей новой серии и быстрого прототипирования устройств на ее базе компания Microchip выпустила отладочную плату AVR128DA48 Curiosity Nano Evaluation kit, которая изображена на рисунке 2.

Линейка отладочных плат Curiosity Nano – это самые простые отладочные платы производства Microchip. Платы линейки Curiosity Nano содержат стандартный набор компонентов:

  • одну пользовательскую кнопку;
  • один пользовательский светодиод;
  • встроенный программатор/дебаггер с USB-портом.

Данная плата, в дополнение к стандартному набору компонентов, имеет распаянный часовой кварц.

Рис. 2. Отладочная плата AVR128DA48 Curiosity Nano Evaluation kit

Платы Curiosity Nano могут подключаться в качестве процессорного модуля в базовую плату Curiosity Nano Base, которая содержит три порта расширения microBUS, используемые для подключения модулей расширения Click Boards производства MikroElektronika, и один порт расширения Xplained Pro для подключения одноименных модулей расширения Microchip. Базовая плата изображена на рисунке 3.

Рис. 3. Плата Curiosity Nano Base

Серия AVR-DB

Серия AVR-DB состоит из 11 устройств с объемом памяти 32…128 кбайт в корпусах, имеющих 28…64 вывода. На момент написания статьи эта серия выпущена частично. Для заказа доступны устройства с 128 кбайт Flash-памяти. Состав серии и основные характеристики указаны в таблице 2.

Таблица 2. Состав и характеристики серии AVR-DB

Наименование Частота ядра, МГц Flash, кбайт SRAM, кбайт EEPROM, байт Вы-
воды
12 бит АЦП 10 бит ЦАП Компа-раторы Опер. усил-ли Вы-
воды MVIO
ZCD USART/SPI/I2C Таймеры
Корпуса
AVR128DB28 24 128 16 512 28 1 1 3 2 8 1 3/2/1 5 SPDIP, SOIC, SSOP
AVR128DB32 24 128 16 512 32 1 1 3 2 8 1 3/2/2 5 TQFP, VQFN
AVR128DB48 24 128 16 512 48 1 1 3 3 8 2 5/2/2 7 TQFP, VQFN
AVR128DB64 24 128 16 512 64 1 1 3 3 8 3 6/2/2 8 TQFP, VQFN
AVR64DB28 24 64 8 512 28 1 1 3 2 8 1 3/2/1 5 SPDIP, SOIC, SSOP
AVR64DB32 24 64 8 512 32 1 1 3 2 8 1 3/2/2 5 TQFP, VQFN
AVR64DB48 24 64 8 512 48 1 1 3 3 8 2 5/2/2 7 TQFP, VQFN
AVR64DB64 24 64 8 512 64 1 1 3 3 8 3 6/2/2 8 TQFP, VQFN
AVR32DB28 24 32 4 512 28 1 1 3 2 8 1 3/2/1 5 SPDIP, SOIC, SSOP
AVR32DB32 24 32 4 512 32 1 1 3 2 8 1 3/2/2 5 TQFP, VQFN
AVR32DB48 24 32 4 512 48 1 (18) 1 (1) 3 3 8 2 5/2/2 5 TQFP, VQFN

Серия DB очень похожа на уже рассмотренную серию: те же объемы памяти и корпуса, частота ядра и напряжение питания, схожий набор периферии. Однако есть и различия.

В наборе периферии произошла замена – Peripheral Touch Controller серии DA заменили на операционные усилители. Каждый операционный усилитель имеет в петле обратной связи резистивный делитель с настраиваемым соотношением сопротивлений, позволяющий настроить коэффициент усиления без использования внешних элементов. Для повышения коэффициента усиления операционные усилители могут соединяться каскадом.

Следующее отличие от серии DA – поддержка инновационной технологии MVIO, суть которой заключается в том, что Port C получил независимое питание VDDIO2, что позволяет последовательным интерфейсам, выведенным на этот порт, коммуницировать со внешними устройствами, запитанными от напряжения, отличного от питания микроконтроллера. Структурная схема питания изображена на рисунке 4.

Рис. 4. Домены питания в AVR-DB

Модификации подвергся Clock Controller, поддерживающий не только внешний часовой кварц, но и высокочастотные кварцевые резонаторы с частотой до 32 МГц. Обобщенная структурная схема контроллера тактовой частоты изображена на рисунке 5.

Рис. 5. Блок-схема генератора частоты

Для серии ABR-DB доступна отладочная плата AVR128DB48 Curiosity Nano Evaluation kit. На плату добавили кварц 16 МГц и нераспаянный разъем для подключения отдельного питания для Port C. Общий вид платы изображен на рисунке 6.

Рис. 6. Отладочная плата AVR128DB48 Curiosity Nano Evaluation kit

Серия AVR-DD

Данная серия включает в себя 12 устройств с объемами памяти 16…64 кбайт в корпусах с 14….32 выводами. Выпуск серии запланирован на второй квартал 2021 года. Характеристики устройств, входящих в серию, указаны в таблице 3.

Таблица 3. Состав и характеристики серии AVR-DD

Наименование Частота ядра, МГц Flash, кбайт SRAM, кбайт EEPROM, байт Вы-
воды
12 бит АЦП 10 бит ЦАП Компара-
торы
Выводы MVIO ZCD USART/SPI/I2C Таймеры  Корпуса
AVR64DD14 24 64 8 256 14 1 1 1 8 1 2/1/1 4 SOIC
AVR64DD20 24 64 8 256 20 1 1 1 8 1 2/1/1 4 SOIC, VQFN
AVR64DD28 24 64 8 256 28 1 1 1 8 1 2/1/1 5 SPDIP, SOIC, SSOP
AVR64DD32 24 64 8 256 32 1 1 1 8 1 2/1/1 5 TQFP, VQFN
AVR32DD14 24 32 4 256 14 1 1 1 8 1 2/1/1 4 SOIC
AVR32DD20 24 32 4 256 20 1 1 1 8 1 2/1/1 4 SOIC, VQFN
AVR32DD28 24 32 4 256 28 1 1 1 8 1 2/1/1 5 SPDIP, SOIC, SSOP
AVR32DD32 24 32 4 256 32 1 1 1 8 1 2/1/1 5 TQFP, VQFN
AVR16DD14 24 16 2 256 14 1 1 1 8 1 2/1/1 4 SOIC
AVR16DD20 24 16 2 256 20 1 1 1 8 1 2/1/1 4 SOIC, VQFN
AVR16DD28 24 16 2 256 28 1 1 1 8 1 2/1/1 5 SPDIP, SOIC, SSOP
AVR16DD32 24 16 2 256 32 1 1 1 8 1 2/1/1 5 TQFP, VQFN

Серия AVR-DD занимает нишу более компактных устройств с уменьшенным объемом памяти. В ней набор периферии больше не содержит таких специфических модулей, как Peripheral Touch Controller или операционные усилители. В остальном качественный состав периферии не изменился, но количество модулей было уменьшено:

  • один модуль Zero Cross Detector;
  • один компаратор;
  • шесть каналов системы событий;
  • два модуля USART, один SPI и один I2C.

Серию DD c серией DB объединяет поддержка технологии MVIO на Port C и поддержка внешнего кварца высокой частоты.

Сравнение серий DA, DB и DD

Рассмотренные серии поддерживают максимальную частоту ядра 24 МГц во всем диапазоне питающего напряжения 1,8…5,5 В. Таблица 4 позволяет наглядно сравнить характеристики рассмотренных серий.

Таблица 4. Сравнение серий DA, DB и DD

Наименование AVR-DA AVR-DB AVR-DD
Максимальная частота ядра, МГц 24 24 24
Flash-память, кбайт 32… 128 32… 128 16…64
Память SRAM, кбайт 4…16 4…16 2…8
Память EEPROM, байт 512 512 256
Выводы 28…64 28…64 14…32
Выводы I/O 22…54 22…54 11…27
12 бит АЦП (каналы) 1 (10…22) 1 (9…22) 1 (7…23)
10 бит ЦАП (выходы) 1 (1) 1 (1) 1 (1)
Компараторы 3 3 1
Сенсорный контроллер (PTC) 1
Операционные усилители 2…3
Выводы MVIO 8
Детектор перенесения нуля (ZCD) 1…3 1…3 1
Система событий, каналы 8…10 8…10 6
Оконный сторожевой таймер (WWDT) 1 1 1
Конфигурируемая логика (CCL), LUT 1(4-6) 1(4-6) 1(4)
USART/SPI/I2C (3/5/6)/2/(1/2) (3/5/6)/2/(1/2) 2/1/1
Таймер 16 бит 4/6/7 4/6/7 3/4
Таймер 12 бит 1 1 1
Диапазон рабочих температур, °C I = 85, E = 125 I = 85, E = 125 I = 85, E = 125

AVR-DA и DB занимают нишу производительных 8-битных контролеров с обширным набором периферии. Основное различие в том, что серия DA имеет Peripheral Touch Controller, а серия DB — операционные усилители.

Серия DD занимает нишу более компактных, но менее производительных устройств с урезанным набором периферии. Серии DB и DD схожи в том, что имеют поддержку технологии MVIO и внешнего кварца высокой частоты.

В новых сериях применены и другие проверенные технологии Microchip, повышающие надежность, гибкость системы и уменьшающие энергопотребление:

  • Core Independent Peripherals – независимая от ядра периферия, способная продолжить работу даже при переходе контроллера в энергосберегающий режим и отключении ядра;
  • Cyclic Redundancy Check Memory Scan – модуль, позволяющий выявить повреждение кода программы, хранящейся во Flash-памяти;
  • Configurable Custom Logic – модуль настраиваемой пользовательской логики, дающий возможность реализовать несложные цифровые устройства, функционирующие без привлечения процессора;
  • Event System – система событий, позволяющая модулям периферии взаимодействовать друг с другом без участия процессора, в том числе и в спящем режиме.

Средства разработки

Поддержка новых серий включена в интегрированные среды разработки от Microchip:

  • Atmel Studio (сейчас — Microchip Studio) – родная среда разработки для микроконтроллеров AVR. Поддержка новых устройств доступна после установки пакета поддержки устройств (Device Family Pack) AVR-Dx_DFP.
  • MPLAB X IDE – изначально среда разработки для микроконтроллеров PIC. В данный момент поддерживаются как PIC-микроконтроллеры, так и AVR, включая последние серии. Плагин MPLAB Code Configurator позволяет графическое конфигурирование устройства и генерацию оптимизированного кода.
  • Atmel START – облачная онлайн-среда разработки, которая, как и MPLAB Code Configurator, имеет удобные графические средства для настройки модулей периферии и системы в целом. Отметим, что данная среда не поддерживает PIC-микроконтроллеры.

Применения

Рассмотренные серии относятся к контроллерам широкого спектра применений и могут использоваться в различных отраслях, требующих автоматического управления в реальном времени: в бытовой электронике, медицине, промышленной электронике и устройствах интернета вещей в качестве основного вычислителя или вспомогательного устройства.

Новые серии отмечены знаком Functional Safety Ready, что означает, что они могут применяться в приложениях, критичных к отказам: автомобильной и промышленной электронике. По запросу заказчика предоставляется отчет со статистикой отказа контроллера и руководство по обеспечению требований стандартов безопасности.

Обширная экосистема, включающая в себя средства разработки, отладочные платы, техническую документацию и примеры проектов позволяет сократить время, требуемое на проектирование и вывод на рынок нового устройства.

•••

Наши информационные каналы

Страница не найдена

Тактовая частота, МГц

от

до

Блок арифметики с плавающей точкой (FPU) не важно да нет

Поддержка DSP-инструкций не важно да нет

Графический ускоритель, аппаратное декодирование видео не важно да нет

Блок управления памятью (MMU) не важно да нет

Каналы DMA

от

до

Блок защиты памяти (MPU) не важно да нет

Аппаратный блок шифрования не важно да нет

AVR Studio: как написать обработчик прерывания | avr

Микроконтроллеры без использования прерываний практически ничего не стоят. Прерывание (interrupt) получило свое название из того факта, что при срабатывании прерывания по какому-нибудь событию нормальное выполнение программы прерывается, и выполняется особый код — код обработчика прерывания (interrupt handler). Прерывания можно рассматривать просто как подпрограммы, которые приостанавливают нормальный процесс выполнения программы до тех пор, пока код подпрограммы обработчика прерывания не будет завершен. После того, как обработчик прерывания завершит свою работу, ядро микроконтроллера вернется к исполнению основной программы точно в той точке, где она была прервана прерыванием. События прерывания обычно происходят от каких-то внешних асинхронных воздействий на микроконтроллер — например, переключение логического уровня на внешнем выводе порта, либо переполнение регистра таймера, что означает истечение заданного интервала времени, и т. д.

Почему же прерывания так важны? Например, мы могли бы обойтись без прерываний, в бесконечном цикле опрашивая возникновение интересующих нас событий. Такое функционирование программы называется опросом (polling). Но опрос имеет много недостатков и неудобств — к примеру, программа будет тратить на циклы ресурс ядра, который мог быть потрачен на выполнение других действий. Это одна из причин, почему у микроконтроллера есть много источников прерывания, которые могут использоваться при необходимости. Вместо проверки событий на возникновение микроконтроллер имеет возможность прервать нормальный поток программы при возникновении события и переключиться на действия обработчика события прерывания (ISR, interrupt service routine), затем вернуться обратно и продолжить выполнение основной программы.

[Векторы прерывания]

Векторами прерывания называют адреса перехода на обработчик прерывания. Список таких адресов называется таблицей векторов прерываний, и он находится в памяти программ по заранее известному адресу. У микроконтроллеров AVR таблица векторов прерываний находится в самом начале памяти программ FLASH по адресу 0. Содержимое таблицы векторов прерываний определяет программист, когда ему нужно реализовать обработку прерываний.

Каждый вектор прерывания AVR занимает в памяти 2 байта (1 слово кода инструкций AVR), и представляет из себя команду rjmp относительный_адрес. Вот так, например, выглядит на языке ассемблера полностью заполненная таблица прерываний микроконтроллера ATmega16:

$000 rjmp RESET               ;сброс (начало программы)
$001 rjmp INT0_vect           ;внешнее прерывание 0
$002 rjmp INT1_vect           ;внешнее прерывание 1
$003 rjmp TIMER2_COMP_vect    ;прерывание совпадения сравнения таймера 2
$004 rjmp TIMER2_OVF_vect     ;прерывание переполнения таймера 2
$005 rjmp TIMER1_CAPT_vect    ;прерывание события захвата таймера 1
$006 rjmp TIMER1_COMPA_vect   ;прерывание совпадения сравнения A таймера 1
$007 rjmp TIMER1_COMPB_vect   ;прерывание совпадения сравнения B таймера 1
$008 rjmp TIMER1_OVF_vect     ;прерывание переполнения таймера 1
$009 rjmp TIMER0_OVF_vect     ;прерывание переполнения таймера 0
$00A rjmp SPI_STC_vect        ;прерывание завершения передачи SPI
$00B rjmp USART_RXC_vect      ;прерывание завершения приема байта UART
$00C rjmp USART_UDRE_vect     ;прерывание опустошения регистра передачи UART
$00D rjmp USART_TXC_vect      ;прерывание завершения передачи байта UART
$00E rjmp ADC_vect            ;прерывание завершения преобразования АЦП
$00F rjmp EE_RDY_vect         ;прерывание готовности EEPROM
$010 rjmp ANA_COMP_vect       ;прерывание изменения сигнала на выходе компаратора
$011 rjmp TWI_vect            ;прерывание двухпроводного интерфейса TWI (I2C)
$012 rjmp INT2_vect           ;внешнее прерывание 2
$013 rjmp TIMER0_COMP_vect    ;прерывание совпадения сравнения таймера 0
$014 rjmp SPM_RDY_vect        ;прерывание готовности к записи памяти программ

Такая полностью заполненная векторами таблица никогда не применяется. На практике обычно используется только 1..4 прерывания, в этом случае не используемые адреса векторов могут остаться не инициализированными. Обратите внимание, что в левом столбце метками обозначены шестнадцатеричные адреса инструкций, соответствующие байтовые адреса будут в 2 раза больше (потому что инструкция rjmp занимает 2 байта).

В этой статье на примере обработчика прерывания таймера 1 для ATmega16 рассказывается, как организовать обработчик прерывания в проекте GCC. Показаны два варианта реализации — на языке C и ассемблера. В примерах алгоритм работы таймера отличается, но это не важно для рассмотрения методов организации обработчика прерывания.

[Обработчик прерывания на C]

Это самый простой вариант. В данном примере используется следующий алгоритм — основная программа настраивает таймер 1 и запускает обработчик прерывания. Этот обработчик срабатывает раз в секунду и заботится о себе сам, подстраивая величину счетчика TCNT1 (чтобы прерывания происходили точно раз в секунду). Обработчик раз в секунду также декрементирует счетчик времени timer, который устанавливается и отслеживается в основной программе. Прерывание таймера разрешено постоянно (разрешается при старте программы). Таким образом, основная программа может получить любую задержку времени в интервале от 1 до 255 секунд.

Процесс по шагам:

1. Настраиваем таймер и разрешаем прерывание для него. Этот код должен вызываться однократно, при старте программы. Для этого можно написать отдельную процедуру, например:

#include <avr/io.h>
..
 void SetupTIMER1 (void){
    //На частоте тактов 16 МГц прерывание переполнения T/C1
    // произойдет через (счет до 65535):
    // 1 << CS10 4096 mkS (нет прескалера Fclk)
    // 1 << CS11 32.768 mS (Fclk/8)
    // (1 << CS11)|(1 << CS10) 262.144 mS (Fclk/64)
    // 1 << CS12 1048.576 mS (Fclk/256)
    TCCR1B = (1 << CS12);
    TCNT1 = 65536-62439;        //коррекция счетчика, чтобы время было ровно 1 секунда
    /* Разрешение прерывания overflow таймера 1. */
    TIMSK = (1 << TOIE1);}

2. В любом из модулей проекта (можно в общем, где функция main, а можно в отдельном, например timer.c) пишем код обработчика прерывания таймера. Вот пример такого кода:

#include <avr/interrupt.h>#include <avr/io.h>
..
 u8 timer;
 
ISR (TIMER1_OVF_vect){
    //теперь прерывание будет происходить через 62439 тиков
    // таймера 1, что на частоте 16 МГц составит 1 сек.
    TCNT1 = 65536-62439;
    //Далее идет код, который будет работать каждую секунду.
    //Желательно, чтобы этот код был короче.
    if (timer)
        timer--;}

3. В нужном месте разрешаем прерывания программы. Это делается также однократно, после того как сделаны все приготовления:

    sei();

[Обработчик прерывания на ASM]

Этот вариант не многим сложнее, просто организован по-другому. Я его сделал на основе отдельного файла, который содержит только код на языке ассемблера. Алгоритм тут тоже другой — обработчик прерывания срабатывает раз в секунду и сам себя запрещает. Основная программа отслеживает это событие и меняет секундные счетчики (выполняет все действия, которые нужно выполнять раз в секунду), и нова разрешает прерывание. Такой алгоритм позволяет ускорить обработку прерывания, что может быть критично для некоторых задач (например, только так можно организовать точный отсчет времени при использовании библиотеки V-USB). Процесс по шагам:

1. Настраиваем таймер. Это может делать код на C. Все точно так же, как и с обработчиком прерывания на C (см. шаг 1).

2. Готовим файл с нашим кодом обработчика на языке ассемблера. Вот пример кода:

#include <avr/io.h>
    .text
    .global TIMER1_OVF_vect
TIMER1_OVF_vect:
    push    R24
    ldi     R24, 0
    out     _SFR_IO_ADDR(TIMSK), R24
    pop     R24
    reti

Этот код будет работать очень быстро, поскольку короткий. Он почти ничего не делает, только запрещает прерывание от таймера 1 (в регистре TIMSK сбрасываются все флаги, в том числе и нужный нам флаг TOIE1). Запускать прерывание будет основная программа, как только обнаружит, что прерывание запрещено (путем анализа состояния флага TOIE1).

3. В нужном месте разрешаем прерывания программы. Это делается также однократно, после того как сделаны все приготовления:

    sei();

4. В основной программе, в главном цикле main, должен максимально часто вызываться следующий код:

..void main (void){
    ..
    while (1)
    {
        ..
        if (0==(TIMSK & (1 << TOIE1)))
        {
            TCNT1 = ONE_SECOND;
            TIMSK = (1 << TOIE1);
            //далее действия, которые будут происходить 
            // раз в секунду
            ..
        }
        ..
    }}

[Общие замечания]

Можно заметить, что в обоих примерах использовалась именованная константа TIMER1_OVF_vect, которая задает адрес вектора прерывания таймера 1. Имена констант можно узнать во включаемом файле процессора. Для ATmega16, например, это будет файл c:\WinAVR-20080610\avr\include\avr\iom16.h. Чтобы имена стали доступны, не нужно добавлять именно этот файл в проект директивой #include, достаточно добавить #include <avr/io.h> и задать макроопределение, задающее тип процессора (например, MCU = atmega16. Это можно сделать либо в Makefile, либо в свойствах проекта).

При использовании одновременно нескольких прерываний в AVR важно помнить, что прерывания имеют фиксированный, ненастраиваемый приоритет. Чем меньше адрес вектора прерывания, тем приоритет у прерывания выше. Этот приоритет срабатывает, если при выходе из прерывания имеется несколько необработанных флагов прерывания. Прерывание с более высоким приоритетом НЕ может временно приостановить уже работающий обработчик прерывания с меньшим приоритетом, чтобы немедленно выполнить свой код. Работает система примерно так:

— когда общие прерывания разрешены (установлен бит I в регистре SREG, этот бит называют Global Interrupt Enable), то может быть вызвано любое разрешенное прерывание с любым приоритетом. Бит Global Interrupt Enable может быть принудительно сброшен или установлен командами CLI или SEI соответственно.
— для того, чтобы прерывание могло сработать и вызвать свой обработчик, кроме установки бита Global Interrupt Enable необходимо также установить бит разрешения соответствующего прерывания. Для таймеров-счетчиков это биты регистра TIMSK, для интерфейса SPI — бит SPIE в регистре SPCR, и т. д.
— когда срабатывает любое прерывание, то сразу очищается флаг I (Global Interrupt Enable), и автоматически запрещаются все прерывания, пока не произойдет выход из обработчика прерывания. Если во время работы обработчика прерывания возникали условия, при которых должны были сработать другие прерывания, то эти другие прерывания не вызываются, а просто запоминаются соответствующие им флаги (прерывания «откладываются» на будущее). При выходе из обработчика прерывания запомненные флаги прерывания запустят нужный обработчик прерывания в соответствии с назначенным ему приоритетом (если на данный момент имеется несколько отложенных прерываний).
— разработчик может в обработчике прерывания вызвать команду SEI (которая установит флаг Global Interrupt Enable), тем самым разрешив выполнение других прерываний во время работы этого обработчика прерывания. Тогда, если произойдет новое другое прерывание до завершения текущего обработчика (в котором уже была вызвана команда SEI), текущий обработчик прерывания будет приостановлен, адрес возврата в него будет сохранен в стеке и будет вызвано новое прерывание. Таким способом можно обеспечить некое подобие соблюдения приоритета — в низкоприоритетных обработчиках прерывания должна первой стоять команда SEI, а в высокоприоритетных обработчиках команда SEI должна отсутствовать, что обеспечит выполнение этого обработчика полностью.

Отсутствие возможности четко настроить приоритет — довольно серьезный недостаток платформы AVR.

[Ссылки]

1. Как комбинировать программу на Си (C) с кодом ассемблера (ASM).

8-разрядные микроконтроллеры AVR корпорации Atmel: новинки и тенденции развития — Компоненты и технологии

Рис. 1. Спектр предлагаемых микроконтроллеров корпорации Atmel

Встатье рассмотрены новые технологии,
применяемые при производстве микроконтроллеров AVR (picoPower, обновление этой технологии), сплавы, используемые для финишного покрытия выводов,
новинки микроконтроллеров и отладочных
средств.

Технология picoPower

В последние годы усилия фирмы Atmel по
развитию архитектуры AVR были сконцентрированы на мероприятиях по снижению
энергопотребления кристаллов. Разработанные технологии были объединены под общим названием picoPower, а в обозначении
микросхем появился суффикс “P” (например,
ATmega169P).

Оптимизация энергопотребления в энергосберегающих режимах была выбрана приоритетным направлением. Можно выделить
следующее:

  • Снижены токи утечки за счет оптимизации технологического процесса производства кристаллов.
  • Расширен диапазон питающего напряжения микроконтроллеров. Нижний порог питающих напряжений снижен с 2,7 до 1,8 В
    и составляет теперь 1,8–5,5 В. Память (Flash,
    EEPROM, ОЗУ) и периферийные узлы,
    в том числе и аналоговая часть, работают
    при напряжении питания от 1,8 В, что позволяет снизить энергопотребление.
  • На кристалл интегрирован низкочастотный тактовый генератор 32 кГц, потребление которого незначительно по сравнению
    с суммарным энергопотреблением в режиме Power-Save.
  • Предусмотрена возможность отключения
    блока контроля питания (Brown-out Detection,
    BOD) при переходе в режим энергосбережения.

Совершенствование технологического процесса при производстве кристаллов и расширение функциональных возможностей позволили заметно снизить энергопотребление
микроконтроллеров AVR и в активном режиме работы. Из реализованных компанией
Atmel механизмов можно выделить:

  • Отключение тактового сигнала (Clock gating):
    • Возможность останова каждого отдельного периферийного блока микроконтроллера благодаря регистрам снижения
      энергопотребления (Power Reduction
      Register, PRR), обеспечивающим отключение тактового сигнала от периферийных узлов.
    • Содержимое регистров обновляется
      только при изменении входных данных.
  • Питание Flash-памяти включается только
    на время выборки команды (Flash sampling).
  • Добавлены регистры запрещения буфера
    цифрового ввода для линий ввода/вывода
    общего назначения (Digital Input Disable
    Registers, DIDR).

Обновленный


технологический процесс

В 2008 году были представлены новые версии микроконтроллеров с улучшенными показателями энергопотребления, которые получены за счет дополнительного усовершенствования технологического процесса производства микросхем. Обновленный технологический процесс будет использоваться:

  • В микроконтроллерах, выпускаемых по технологии picoPower (в наименовании суффикс “P” будет заменен на суффикс “PA”,
    например, ATmega324PA). Новые версии
    микроконтроллеров будут иметь меньший
    ток потребления: в активном режиме на
    30–45% и в энергосберегающих режимах на
    42–54% (пример приведен в таблице 1).
  • В микроконтроллерах, выпускаемых ранее
    без применения технологии picoPower
    (в наименовании прибавится суффикс “А”,
    например, ATtiny13A). У новых версий
    этих микроконтроллеров ток потребления
    уменьшится: в активном режиме на 12–45%,
    а в энергосберегающих режимах — на
    13–90% (пример приведен в таблице 2).
  • В новых сериях микроконтроллеров (суффикс “A” в наименовании использоваться
    не будет, например, ATtiny48/88).

Таблица 1. Сравнение энергопотребления
ATmega324P и ATmega324PA

Режим Условия ATmega324P ATmega324PA Изменение
Active VCC = 2 В, f = 1 МГц 0,42 мА 0,3 мА –29%
VCC = 3 В, f = 4 МГц 2,4 мА 1,5 мА –38%
VCC = 5 В, f = 8 МГц 8,0 мА 5,2 мА –35%
Idle VCC = 2 В,
f = 1 МГц
0,13 мА 0,06 мА –54%
VCC = 3 В,
f = 4 МГц
0,6 мА 0,35 мА –42%
VCC = 5 В,
f = 8 МГц
2,3 мА 1,3 мА –43%

Таблица 2. Сравнение энергопотребления
ATtiny13 и ATtiny13A

Режим Условия ATtiny13 ATtiny13A Изменение
Active VCC = 1,8 В, f = 1 МГц 240 мкА 190 мкА –20%
VCC = 5,5 В, f = 20 МГц 13 мА 8,8 мА –30%
Idle VCC = 1,8 В, f = 1 МГц 220 мкА 24 мкА –90%
VCC = 5,5 В, f = 20 МГц 4,0 мА 1,7 мА –60%
Reset VCC = 1,8 В, f = 1 МГц 7 мкА 5 мкА –30%
VCC = 5,5 В, f = 20 МГц 2,9 мА 1,25 мА –60%

Для микроконтроллеров, выпускаемых по
обновленному технологическому процессу,
будет использоваться унифицированное наименование. Микроконтроллеры, которые
ранее выходили в двух вариантах исполнения (с диапазоном напряжения питания
4,5–5,5 В и 1,8–5,5 В), теперь имеют один код
для заказа и расширенный диапазон питания
1,8–5,5 В. При этом рекомендуемая рабочая
частота при напряжении питания 1,8 В не
должна превышать 4 МГц. Пример формирования нового унифицированного наименования для ATmega48 приведен в таблице 3.

Таблица 3. Унифицированное наименование
для новой версии микроконтроллера ATmega48

Старые версии Обновленная технология picoPower
ATmega48-20xU
(4,5–5,5 В, 0–20 МГц)
ATmega48PA-xU
(1,8–5,5 В, 0–20 МГц)
ATmega48P-20xU
(4,5–5,5 В, 0–20 МГц)
ATmega48V-10xU
(1,8–5,5 В, 0–10 МГц)
ATmega48PV-10xU
(1,8–5,5 В, 0–10 МГц )

Все микроконтроллеры, которые производятся с применением новых технологий, повыводно и функционально совместимы
с предыдущими версиями. Выпускаются специальные руководства по применению, описывающие различия в кристаллах. Старые
версии микроконтроллеров будут постепенно сниматься с производства. Приведем список анонсированных на середину 2009 года
микроконтроллеров, которые будут выпускаться по обновленной технологии:

  • ATtiny48;
  • ATtiny88;
  • ATtiny13A;
  • ATtiny24A;
  • ATtiny44A;
  • ATtiny861A;
  • ATmega48PA;
  • ATmega88PA;
  • ATmega16A;
  • ATmega32A;
  • ATmega16U2;
  • AT90USB162A;
  • ATmega168PA;
  • ATxmega164A;
  • ATmega165PA;
  • ATmega169PA;
  • ATmega324PA;
  • ATmega328P;
  • ATmega128A;
  • ATmega1284P;
  • ATmega64A.

Финишное покрытие выводов

Еще одна тенденция, которую можно отметить, это все большее использование для
финишного покрытия выводов состава
NiPdAu (никель-палладий-золото). NiPdAu
позволяет уменьшить вероятность возникновения дефекта кристаллических образований («усов») и, соответственно, предохраняет от возникновения короткого замыкания
при использовании микросхем с малым шагом выводов.

Благодаря высокому качеству финишного
покрытия NiPdAu, его использование становится общей тенденцией не только у корпорации Atmel, но и у других производителей. Корпуса с финишным покрытием выводов NiPdAu
полностью соответствуют стандарту RoHS.
Описание химического состава и финишного покрытия выводов в процентном соотношении для различных корпусов микросхем
Atmel можно найти по ссылке: http://www.atmel.com/green/pmdds.asp#NiPdAuPlating.

Условия хранения и пайки микросхем,
включая микросхемы с финишным покрытием NiPdAu, регулируются стандартом JEDEC:
документы J-STD-020D [1] и J-STD-033B.
Наиболее распространенным на данный момент у корпорации Atmel является финишное
покрытие Matte Sn (чистое олово). Поскольку термопрофили, используемые для монтажа компонентов с финишными покрытиями
NiPdAu и Matte Sn, одинаковы, неудобства
при монтаже с переходом на другое финишное покрытие не возникнет.

Финишное покрытие выводов NiPdAu в наименовании микросхемы будет обозначаться
буквой H (для индустриального диапазона), например ATTiny13A-SH вместо ATTiny13A-SU.

Новые микроконтроллеры AVR


в 2009 году

Корпорация Atmel анонсировала в этом году 3 принципиально новых линейки микроконтроллеров в семействе tiny (табл. 4)

Таблица 4. Новые микроконтроллеры AVR

Наименование Flash, кбайт RAM, байт EEPROM, байт VCC, В Корпус Особенности
ATtiny23U/43U 2/4 128/256 64 0,7–5,5 SOIC20, QFN20 Низкопотребляющий (питание от одной батареи ААА)
ATtiny48/88 4/8 256/512 64 1,8–5,5 PDIP28, TQFP32, MLF32, MLF28 Упрощенная версия mega48/88
ATtiny10 1 32 1,8–5,5 SOT23-6 Миниатюрный, для бюджетных
приложений, альтернатива tiny11

Новые микроконтроллеры ATtiny48/88
призваны заполнить промежуток между семействами tiny иmega и представляют собой
упрощенную версию ATmega48/88. Это микроконтроллер в корпусе с 32 выводами, он
содержит интерфейсы TWI (I2C), SPI, 28 линий ввода/вывода общего назначения, 10-разрядный АЦП. Как и все новые микроконтроллеры, он выпускается с использованием
технологии picoPower и содержит регистры
PRR и DIDR, BOD с возможностью отключения в спящем режиме.

Новые микроконтроллеры AVR ATtiny23U/
43U имеют ультранизкий порог питающего
напряжения. Благодаря встроенному импульсному повышающему преобразователю,
они могут работать от 0,7 В, идеально подходят для приложений с батарейным питанием и могут получать питание, например,
от одной батареи типа ААА. Микроконтроллеры ATtiny23U/43U содержат 2K/4K Flashпамяти, 64 байт EEPROM, 128/256 байт ОЗУ,
два 8-разрядных таймера/счетчика, сторожевой таймер, аналоговый компаратор, BOD,
датчик температуры, 10-разрядный АЦП, интерфейсы SPI, USI. Отладка приложений
и программирование (за исключением fuse-
битов) может осуществляться по интерфейсу debugWire.

Новый кристалл AVR ATtiny10 является
первым микроконтроллером, выпущенным
корпорацией Atmel в миниатюрном корпусе
SOT23-6 размером 2,9×1,6 мм, который имеет
всего 6 выводов. Микроконтроллер предназначен для бюджетных приложений и может
служить альтернативой снятому с производства ATtiny11. ATtiny10 содержит 1 кбайт
Flash-памяти программ, 32 байт SRAM, 8-разрядный АЦП, аналоговый компаратор,
16-разрядный таймер/счетчик с ШИМ, сторожевой таймер. Напряжение питания составляет 1,8–5,5 В, максимальная рабочая частота — 12 МГц.

ATtiny10 совместим повыводно с микроконтроллерами семейства PIC10F компании
Microchip. По сравнению с PIC10F, ATtiny10
имеет более высокую степень интеграции
(16-разрядный таймер/счетчик с ШИМ, наличие АЦП и аналогового компаратора, больший объем памяти SRAM), более высокую
производительность.

Программирование микроконтроллера
ATtiny10 осуществляется по 3-проводному
интерфейсу TPI (Tiny Programming Interface)
с помощью стартового набора ATSTK600
и интегрированной среды разработки AVR
Studio (начиная с версии 4.16 и старше). Программатор ATAVRISP2 и внутрисхемный эмулятор ATJTAGICE2 фирмы Atmel не поддерживают интерфейс TPI.

ATtiny10 не является в прямом смысле внутрисхемно-программируемым, тем не менее,
программирование в системе (in-system) возможно. Для программирования по интерфейсу TPI необходимо напряжение 5 В. Если устройство работает от 1,8 В, для программирования необходимо увеличивать это напряжение
до 5 В. Также следует учесть, что при программировании используются 2 линии ввода/вывода и вывод RESET (интерфейс TPI). Внешний программатор должен иметь возможность использовать эти выводы, при том, что
линий ввода/вывода у этого микроконтроллера всего четыре. То есть программирование в системе возможно, но не очень удобно.
В настоящее время Atmel не предлагает своего внешнего программатора для ATtiny10,
программировать микросхему можно только установкой ATtiny10 на плату стартового
набора STK600.

Для серийного производства есть еще один
вариант программирования ATtiny10 — запись прошивки в микроконтроллер ATtiny10
на фабрике Atmel. Такую услугу оказывают
для партий объемом не менее 200 тысяч штук.

Отладочные средства

Стартовый набор STK600

Стартовый набор STK600 может служить
основой для разработчика при работе с 32-разрядными микроконтроллерами UC3A/UC3B
и 8-разрядными AVR (tiny/mega/XMEGA). Он
построен аналогично STK500 для AVR: базовая плата + мезонинный модуль. Базовая
плата содержит: разъемы RS-232, JTAG, USB
(device), mini-USB (OTG), преобразователи
физического уровня CAN и LIN, 8 светодиодов, 8 кнопок, память DataFlash 2 Mбит. Все
порты микроконтроллеров выведены на отдельные разъемы на плате (рис. 2).

Рис. 2. Отладочная плата STK600

Мезонинные платы содержат панели с нулевым усилием (ZIF) для установки микроконтроллера. Для поддержки разных микроконтроллеров в одинаковых корпусах, но с различным расположением выводов, мезонины
устанавливаются в базовую плату через переходные платы (рис. 3).

Рис. 3. Примеры наборов мезонинных плат для STK600

В штатной комплектации (код для заказа
ATSTK600) поставляется базовая плата с мезонинной платой, на которой распаян микроконтроллер ATmega2560 (STK600-ATMEGA2560).
Мезонинные модули для других микроконтроллеров (укомплектованные переходными
платами) заказываются отдельно. Доступные
на момент написания статьи варианты наборов мезонинных плат приведены в таблице 5.

Таблица 5. Варианты мезонинных наборов для STK600

Наименование
мезонинной платы
ZIF-панель
для
корпуса
Управляющая
программа
Поддержи-
ваемые микро-
контроллеры
STK600-DIP универсальная DIP AVR Studio AVR (tiny, mega)
STK600-TQFP32 TQFP32 AVR Studio AVR (tiny, mega)
STK600-TQFP44 TQFP44 AVR Studio AVR (tiny, mega,
XMEGA)
STK600-TQFP48 TQFP48 AVR32
Studio
UC3B/L
STK600-TQFP64 TQFP64 AVR Studio AVR (tiny, mega,
XMEGA)
STK600-TQFP64-2 TQFP64 AVR32
Studio
UC3B
STK600-TQFP100 TQFP100 AVR Studio AVR (tiny, mega,
XMEGA)
STK600-TQFP144 TQFP144 AVR32
Studio
UC3A
STK600-SOIC SOIC20,
SOIC24,
SOIC32
AVR Studio AVR (tiny, mega)
STK600-UC3144 TQFP144 AVR32
Studio
UC3A
STK600-SSOP44 TSSOP44 AVR Studio ATmega32HVB
STK600-UC3-144 TQFP144 AVR32
Studio
UC3A
STK600-MLF64 MLF64 AVR Studio ATXMEGA256A3B
STK600-ATTINY10 SOT23-6 AVR Studio ATtiny10
STK600-tinyX3U * AVR Studio ATtiny43U
STK600-ATMEGA2560 * AVR Studio ATmega2560
Примечание. * — микроконтроллер распаян на плате.

STK600 позволяет осуществлять как последовательное внутрисхемное, так и параллельное высоковольтное программирование.
Последнее доступно для микроконтроллеров,
установленных в STK600. Последовательное
внутрисхемное программирование осуществляется для микроконтроллеров, как установленных в STK600, так и на целевой плате.
Интерфейсы программирования: SPI, TPI,
JTAG или PDI.

Внутрисхемный эмулятор AVRONEKIT

Универсальный внутрисхемный эмулятор
AVRONEKIT (рис. 4) предназначен для всех
микроконтроллеров AVR и AVR32: он поддерживает программирование по интерфейсам
SPI, JTAG, PDI и внутрисхемную отладку по
интерфейсам JTAG, debugWire, PDI и Nexus.

Рис. 4. Внутрисхемный эмулятор AVRONEKIT

В отличие от JTAGICE2 и AVRDragon,
AVRONEKIT содержит буфер трассировки
128 Мбайт и поддерживает высокоскоростное
потоковое или буферизируемое считывание
трассы по интерфейсу Nexus. AVRONEKIT
также позволяет осуществлять запись трассы в момент выполнения программы. Анализ трассы при отладке сегмента кода позволяет в дальнейшем оценить поведение кристалла в реальной системе на максимальных
предусмотренных скоростях.

AVRONEKIT поддерживает функцию Live
debug, позволяющую входить в режим отладки выполняющегося на микроконтроллере
XMEGA приложения (не генерируя RESET
и не меняя содержимого регистров и памяти).

Заключение

Популярная линейка 8-разрядных микроконтроллеров AVR продолжает активно развиваться и усовершенствоваться: снижается
энергопотребление кристаллов, появляются
микроконтроллеры с новыми возможностями и новым функционалом, выпускаются
новые отладочные средства и программные
средства.

Литература

  1. http://www.jedec.org/download/search/JSTD020D-01
  2. Микроконтроллеры AVR и AVR32: перспективные новинки. ООО «ЭФО», 2009.

avr-libc: : Interrupts

Примечание: Это описание прерываний взято из документа Рича Несуолда. См. Благодарности.

В различных компиляторах обработка прерываний реализована по-разному, так как язык C старается оставаться подальше от машинно-зависимых подробностей. В среде WinAVR используется предустановленная таблица векторов прерываний, содержащая адреса соответствующих подпрограмм обслуживания с заранее определенными именами. Для каждой такой подпрограммы в этом библиотечном файле определен макрос: ISR(). Этот макрос регистрирует и помечает некоторую функцию как обработчик прерывания. Например, так выглядит определение обработчика для прерывания от АЦП.

Если происходит неожиданное прерывание (прерывания разрешены, а никакого обработчика не установлено, что обычно указывает на ошибку), то по умолчанию происходит сброс микроконтроллера. Во избежание этого, следует перекрыть библиотечную функцию__vector_default, что можно сделать с помощью макроса ISR().

Аппаратные средства AVR сбрасывают флаг глобального разрешения прерываний в регистре SREG перед вводом вектора прерывания. Таким образом, дальнейшие прерывания запрещаются до выхода из обработчика обслуживаемого прерывания (до команды RETI, которая генерируется компилятором в конце обработки прерывания). По этой причине, программы обработки прерывания обычно не вкладывают друг в друга. Для большинства программ обработки прерывания, это - желательное поведение, для некоторых это даже требуется, чтобы предотвратить бесконечные рекурсивные прерывания (подобные UART).

Однако в редких случаях необходимо как можно раньше установить флаг глобального разрешения прерываний. Это можно сделать, используя sei () в начале программы обработки прерывания, но и в этом случае все еще остаются несколько команд в сгенерированной компилятором вводной части, с запрещёнными вложенными прерываниями. Компилятор можно проинструктировать, чтобы вставить право команды SEI в начале программы обработки прерывания, используя следующий путь:

где XXX_vect допустимое имя вектора прерывания для рассматриваемого типа MCU (рассмотрено ниже).

Прерывание выбрано, если снабжено одним из имён нижеприведённой таблицы.

В последних версиях WinAVR допустимы две формы имён векторов. Одна форма использует имена, типа SIG_XXX — это была единственная доступная форма в avr-libc до версии 1.2.x. Начиная с avr-libc версии 1.4.0, добавилась вторая форма имен вектора прерывания, XXX_vect. Где XXX соответствует векторному имени, как описано в datasheet-e соответствующего устройства (и в файлах Atmel) с пробелами, замененными символом подчеркивания, и исключены другие не алфавитно-цифровые символы. Использование суффикса _vect применено, для того чтобы улучшить совместимость с другими компиляторами C, доступным для AVR. Форма SIG_XXX в будущем может стать осуждаемой, так что использовать её в новых проектах не рекомендуется.

Макрокоманда ISR() не может осуществить побуквенную проверку переданного ей параметра. Компилятор генерирует предупреждение лишь, если обнаруживает подозрительнее имя ISR() функции, такое, после которого, макрозамена начинается не с «__vector_».

- запрещает прерывания, сбрасывая флаг глобального разрешения прерываний.

- разрешает прерывания, устанавливая флаг глобального разрешения прерываний.

- обработка прерывания, выполняется с первоначально заблокированными глобальными прерываниями.

vector — должен быть одним из имён вектора прерывания, которые допустимы для применяемого MCU.

- устаревший вариант, аналог - макрокоманды ISR. Не используйте SIGNAL() в новых программах. Вместо этого используйте ISR().

- пустая функция обработки прерывания. Она не сгенерирует никакого кода пролога или эпилога, и только возвратит из поиска и хранения информации. Не определяйте тело функции, поскольку функция сделает это за Вас.

Определяет vector указывающий на тот же самый вектор прерывания что и target_vector. Тем самым может использоваться единственное выполнение вектора прерывания, чтобы обслужить несколько источников прерывания. Не определяйте тело функции, поскольку функция сделает это за Вас.

Этот марос поддержан только в последних версиях AVR-GCC, (GCC 4.2 или исправленной GCC 4.1.x).

Векторное имя

Старое векторное имя

Описание

Применим для устройства

ADC_vect

SIG_ADC

аналого-цифровое преобразование завершено

AT90S2333, AT90S4433, AT90S4434, AT90S8535, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny13, ATtiny15, ATtiny26, ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85, ATtiny261, ATtiny461, ATtiny861, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

ANALOG_COMP_0_vect

SIG_COMPARATOR0

Аналоговый компаратор 0

AT90PWM3, AT90PWM2, AT90PWM1

ANALOG_COMP_1_vect

SIG_COMPARATOR1

Аналоговый компаратор 1

AT90PWM3, AT90PWM2, AT90PWM1

ANALOG_COMP_2_vect

SIG_COMPARATOR2

Аналоговый компаратор 2

AT90PWM3, AT90PWM2, AT90PWM1

ANALOG_COMP_vect

SIG_COMPARATOR

Аналоговый компаратор

AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

ANA_COMP_vect

SIG_COMPARATOR

Аналоговый компаратор

AT90S1200, AT90S2313, AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, ATmega16, ATmega161, ATmega162, ATmega163, ATmega32, ATmega323, ATmega8, ATmega8515, ATmega8535, ATtiny11, ATtiny12, ATtiny13, ATtiny15, ATtiny2313, ATtiny26, ATtiny28, ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85, ATtiny261, ATtiny461, ATtiny861

CANIT_vect

SIG_CAN_INTERRUPT1

CAN Передача завершена или ошибка

AT90CAN128, AT90CAN32, AT90CAN64

EEPROM_READY_vect

SIG_EEPROM_READY, SIG_EE_READY

 

ATtiny2313

EE_RDY_vect

SIG_EEPROM_READY

EEPROM Готовый

AT90S2333, AT90S4433, AT90S4434, AT90S8535, ATmega16, ATmega161, ATmega162, ATmega163, ATmega32, ATmega323, ATmega8, ATmega8515, ATmega8535, ATtiny12, ATtiny13, ATtiny15, ATtiny26, ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85, ATtiny261, ATtiny461, ATtiny861

EE_READY_vect

SIG_EEPROM_READY

EEPROM Готовый

AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega406, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

EXT_INT0_vect

SIG_INTERRUPT0

Внешний Запрос на прерывание 0

ATtiny24, ATtiny44, ATtiny84

INT0_vect

SIG_INTERRUPT0

Внешнее Прерывание 0

AT90S1200, AT90S2313, AT90S2323, AT90S2333, AT90S2343, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega406, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8515, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny11, ATtiny12, ATtiny13, ATtiny15, ATtiny22, ATtiny2313, ATtiny26, ATtiny28, ATtiny45, ATtiny25, ATtiny85, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

INT1_vect

SIG_INTERRUPT1

Внешний Запрос на прерывание 1

AT90S2313, AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega32, ATmega323, ATmega406, ATmega64, ATmega8, ATmega8515, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny2313, ATtiny28, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

INT2_vect

SIG_INTERRUPT2

Внешний Запрос на прерывание 2

AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega32, ATmega323, ATmega406, ATmega64, ATmega8515, ATmega8535, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

INT3_vect

SIG_INTERRUPT3

Внешний Запрос на прерывание 3

AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega406, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

INT4_vect

SIG_INTERRUPT4

Внешний Запрос на прерывание 4

AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

INT5_vect

SIG_INTERRUPT5

Внешний Запрос на прерывание 5

AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

INT6_vect

SIG_INTERRUPT6

Внешний Запрос на прерывание 6

AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

INT7_vect

SIG_INTERRUPT7

Внешний Запрос на прерывание 7

AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

IO_PINS_vect

SIG_PIN, SIG_PIN_CHANGE

Внешний Запрос на прерывание 0

ATtiny11, ATtiny12, ATtiny15, ATtiny26

LCD_vect

SIG_LCD

LCD Начало Фрейма

ATmega169, ATmega169P, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega649, ATmega6490

LOWLEVEL_IO_PINS_vect

SIG_PIN

Ввод низкого уровня на Порту B

ATtiny28

OVRIT_vect

SIG_CAN_OVERFLOW1

CAN Переполненный Таймер

AT90CAN128, AT90CAN32, AT90CAN64

PCINT0_vect

SIG_PIN_CHANGE0

прерывание по изменению уровня на выводе параллельного порта 0

ATmega162, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega406, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny13, ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

PCINT1_vect

SIG_PIN_CHANGE1

прерывание по изменению уровня на выводе параллельного порта 1

ATmega162, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega406, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny24, ATtiny44, ATtiny84, AT90USB162, AT90USB82

PCINT2_vect

SIG_PIN_CHANGE2

прерывание по изменению уровня на выводе параллельного порта 2

ATmega3250, ATmega3290, ATmega3290P, ATmega6450, ATmega6490, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644

PCINT3_vect

SIG_PIN_CHANGE3

прерывание по изменению уровня на выводе параллельного порта 3

ATmega3250, ATmega3290, ATmega3290P, ATmega6450, ATmega6490, ATmega324P, ATmega164P, ATmega644P, ATmega644

PCINT_vect

SIG_PIN_CHANGE, SIG_PCINT

 

ATtiny2313, ATtiny261, ATtiny461, ATtiny861

PSC0_CAPT_vect

SIG_PSC0_CAPTURE

PSC0 Случай захвата

AT90PWM3, AT90PWM2, AT90PWM1

PSC0_EC_vect

SIG_PSC0_END_CYCLE

PSC0 Конечный Цикл

AT90PWM3, AT90PWM2, AT90PWM1

PSC1_CAPT_vect

SIG_PSC1_CAPTURE

PSC1 Случай захвата

AT90PWM3, AT90PWM2, AT90PWM1

PSC1_EC_vect

SIG_PSC1_END_CYCLE

PSC1 Конечный Цикл

AT90PWM3, AT90PWM2, AT90PWM1

PSC2_CAPT_vect

SIG_PSC2_CAPTURE

PSC2 Случай захвата

AT90PWM3, AT90PWM2, AT90PWM1

PSC2_EC_vect

SIG_PSC2_END_CYCLE

PSC2 Конечный Цикл

AT90PWM3, AT90PWM2, AT90PWM1

SPI_STC_vect

SIG_SPI

прерывание от SPI

AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8515, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

SPM_RDY_vect

SIG_SPM_READY

память программ готова

ATmega16, ATmega162, ATmega32, ATmega323, ATmega8, ATmega8515, ATmega8535

SPM_READY_vect

SIG_SPM_READY

память программ готова

AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega406, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

TIM0_COMPA_vect

SIG_OUTPUT_COMPARE0A

Таймер/Счетчик Совпадение A

ATtiny13, ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85

TIM0_COMPB_vect

SIG_OUTPUT_COMPARE0B

Таймер/Счетчик Совпадение B

ATtiny13, ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85

TIM0_OVF_vect

SIG_OVERFLOW0

Таймер/Счетчик 0 Переполнение

ATtiny13, ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85

TIM1_CAPT_vect

SIG_INPUT_CAPTURE1

Таймер/Счетчик 1 Захват

ATtiny24, ATtiny44, ATtiny84

TIM1_COMPA_vect

SIG_OUTPUT_COMPARE1A

Таймер/Счетчик 1 Совпадение A

ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85

TIM1_COMPB_vect

SIG_OUTPUT_COMPARE1B

Таймер/Счетчик 1 Совпадение B

ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85

TIM1_OVF_vect

SIG_OVERFLOW1

Таймер/Счетчик 1 Переполнение

ATtiny24, ATtiny44, ATtiny84, ATtiny45, ATtiny25, ATtiny85

TIMER0_CAPT_vect

SIG_INPUT_CAPTURE0

прерывание по захвату на входе

ATtiny261, ATtiny461, ATtiny861

TIMER0_COMPA_vect

SIG_OUTPUT_COMPARE0A

Таймер/Счетчик 0 Совпадение A

ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny2313, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

TIMER0_COMPB_vect

SIG_OUTPUT_COMPARE0B, SIG_OUTPUT_COMPARE0_B

Таймер/Счетчик 0 Совпадение B

AT90PWM3, AT90PWM2, AT90PWM1, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny2313, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

TIMER0_COMP_A_vect

SIG_OUTPUT_COMPARE0A, SIG_OUTPUT_COMPARE0_A

Таймер/Счетчик 0 Совпадение A

AT90PWM3, AT90PWM2, AT90PWM1

TIMER0_COMP_vect

SIG_OUTPUT_COMPARE0

Таймер/Счетчик 0 Совпадение

AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8515, ATmega8535

TIMER0_OVF0_vect

SIG_OVERFLOW0

Таймер/Счетчик 0 Переполнение

AT90S2313, AT90S2323, AT90S2343, ATtiny22, ATtiny26

TIMER0_OVF_vect

SIG_OVERFLOW0

Таймер/Счетчик 0 Переполнение

AT90S1200, AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8515, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny11, ATtiny12, ATtiny15, ATtiny2313, ATtiny28, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

TIMER1_CAPT1_vect

SIG_INPUT_CAPTURE1

Таймер/Счетчик 1 Захват

AT90S2313

TIMER1_CAPT_vect

SIG_INPUT_CAPTURE1

Таймер/Счетчик 1 Захват

AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8515, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny2313, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

TIMER1_CMPA_vect

SIG_OUTPUT_COMPARE1A

Таймер/Счетчик 1 совпадение A

ATtiny26

TIMER1_CMPB_vect

SIG_OUTPUT_COMPARE1B

Таймер/Счетчик 1 совпадение B

ATtiny26

TIMER1_COMP1_vect

SIG_OUTPUT_COMPARE1A

Таймер/Счетчик 1 совпадение A

AT90S2313

TIMER1_COMPA_vect

SIG_OUTPUT_COMPARE1A

Таймер/Счетчик1 Совпадение A

AT90S4414, AT90S4434, AT90S8515, AT90S8535, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8515, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny2313, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

TIMER1_COMPB_vect

SIG_OUTPUT_COMPARE1B

Таймер/Счетчик1 Совпадение B

AT90S4414, AT90S4434, AT90S8515, AT90S8535, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8515, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny2313, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

TIMER1_COMPC_vect

SIG_OUTPUT_COMPARE1C

Таймер/Счетчик 1 Совпадение C

AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

TIMER1_COMPD_vect

SIG_OUTPUT_COMPARE0D

Таймер/Счетчик 1 Совпадение D

ATtiny261, ATtiny461, ATtiny861

TIMER1_COMP_vect

SIG_OUTPUT_COMPARE1A

Таймер/Счетчик 1 Совпадение A

AT90S2333, AT90S4433, ATtiny15

TIMER1_OVF1_vect

SIG_OVERFLOW1

Таймер/Счетчик 1 Переполнение

AT90S2313, ATtiny26

TIMER1_OVF_vect

SIG_OVERFLOW1

Таймер/Счетчик 1 Переполнение

AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, AT90PWM3, AT90PWM2, AT90PWM1, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8515, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, ATtiny15, ATtiny2313, ATtiny261, ATtiny461, ATtiny861, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

TIMER2_COMPA_vect

SIG_OUTPUT_COMPARE2A

Таймер/Счетчик 2 Совпадение A

ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

TIMER2_COMPB_vect

SIG_OUTPUT_COMPARE2B

Таймер/Счетчик 2 Совпадение A

ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

TIMER2_COMP_vect

SIG_OUTPUT_COMPARE2

Таймер/Счетчик 2 Совпадение

AT90S4434, AT90S8535, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8535

TIMER2_OVF_vect

SIG_OVERFLOW2

Таймер/Счетчик 2 Переполнение

AT90S4434, AT90S8535, AT90CAN128, AT90CAN32, AT90CAN64, ATmega103, ATmega128, ATmega16, ATmega161, ATmega162, ATmega163, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega32, ATmega323, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega8, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

TIMER3_CAPT_vect

SIG_INPUT_CAPTURE3

Таймер/Счетчик 3

Захват

AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega162, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

TIMER3_COMPA_vect

SIG_OUTPUT_COMPARE3A

Таймер/Счетчик 3 Совпадение A

AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega162, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

TIMER3_COMPB_vect

SIG_OUTPUT_COMPARE3B

Таймер/Счетчик 3 Совпадение B

AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega162, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

TIMER3_COMPC_vect

SIG_OUTPUT_COMPARE3C

Таймер/Счетчик 3 Совпадение C

AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

TIMER3_OVF_vect

SIG_OVERFLOW3

Таймер/Счетчик 3 Переполнение

AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega162, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

TIMER4_CAPT_vect

SIG_INPUT_CAPTURE4

Таймер/Счетчик 4 Захват

ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561

TIMER4_COMPA_vect

SIG_OUTPUT_COMPARE4A

Таймер/Счетчик 4 Совпадение A

ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561

TIMER4_COMPB_vect

SIG_OUTPUT_COMPARE4B

Таймер/Счетчик 4 Совпадение B

ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561

TIMER4_COMPC_vect

SIG_OUTPUT_COMPARE4C

Таймер/Счетчик 4 Совпадение C

ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561

TIMER4_OVF_vect

SIG_OVERFLOW4

Таймер/Счетчик 4 Переполнение

ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561

TIMER5_CAPT_vect

SIG_INPUT_CAPTURE5

Таймер/Счетчик 5 Совпадение

ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561

TIMER5_COMPA_vect

SIG_OUTPUT_COMPARE5A

Таймер/Счетчик 5 Совпадение A

ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561

TIMER5_COMPB_vect

SIG_OUTPUT_COMPARE5B

Таймер/Счетчик 5 Совпадение B

ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561

TIMER5_COMPC_vect

SIG_OUTPUT_COMPARE5C

Таймер/Счетчик 5 Совпадение C

ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561

TIMER5_OVF_vect

SIG_OVERFLOW5

Таймер/Счетчик 5 Переполнение

ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561

TWI_vect

SIG_2WIRE_SERIAL

2-проводный последовательный интерфейс (I2C)

AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega16, ATmega163, ATmega32, ATmega323, ATmega406, ATmega64, ATmega8, ATmega8535, ATmega168, ATmega48, ATmega88, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

TXDONE_vect

SIG_TXDONE

Transmission Done, Bit Timer Flag 2 Interrupt

AT86RF401

TXEMPTY_vect

SIG_TXBE

Transmit Buffer Empty, Bit Itmer Flag 0 Interrupt

AT86RF401

UART0_RX_vect

SIG_UART0_RECV

UART0, Приём закончен

ATmega161

UART0_TX_vect

SIG_UART0_TRANS

UART0, Передача закончена

ATmega161

UART0_UDRE_vect

SIG_UART0_DATA

UART0 опустошение регистра данных

ATmega161

UART1_RX_vect

SIG_UART1_RECV

UART1, Приём закончен

ATmega161

UART1_TX_vect

SIG_UART1_TRANS

UART1, Передача закончена

ATmega161

UART1_UDRE_vect

SIG_UART1_DATA

UART1 опустошение регистра данных

ATmega161

UART_RX_vect

SIG_UART_RECV

UART, Приём закончен

AT90S2313, AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, ATmega103, ATmega163, ATmega8515

UART_TX_vect

SIG_UART_TRANS

UART, Передача закончена

AT90S2313, AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, ATmega103, ATmega163, ATmega8515

UART_UDRE_vect

SIG_UART_DATA

UART опустошение регистра данных

AT90S2313, AT90S2333, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, ATmega103, ATmega163, ATmega8515

USART0_RXC_vect

SIG_USART0_RECV

USART0, Приём закончен

ATmega162

USART0_RX_vect

SIG_UART0_RECV

USART0, Приём закончен

AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega329, ATmega329P, ATmega64, ATmega645, ATmega649, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644

USART0_TXC_vect

SIG_USART0_TRANS

USART0, Передача закончена

ATmega162

USART0_TX_vect

SIG_UART0_TRANS

USART0, Передача закончена

AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega3250, ATmega329, ATmega329P, ATmega3290, ATmega3290P, ATmega64, ATmega645, ATmega6450, ATmega649, ATmega6490, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644

USART0_UDRE_vect

SIG_UART0_DATA

USART0 опустошение регистра данных

AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega162, ATmega165, ATmega165P, ATmega169, ATmega169P, ATmega325, ATmega329, ATmega329P, ATmega64, ATmega645, ATmega649, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644

USART1_RXC_vect

SIG_USART1_RECV

USART1, Приём завершен

ATmega162

USART1_RX_vect

SIG_UART1_RECV

USART1, Приём завершен

AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

USART1_TXC_vect

SIG_USART1_TRANS

USART1, Передача закончена

ATmega162

USART1_TX_vect

SIG_UART1_TRANS

USART1, Передача закончена

AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

USART1_UDRE_vect

SIG_UART1_DATA

USART1, опустошение регистра данных

AT90CAN128, AT90CAN32, AT90CAN64, ATmega128, ATmega162, ATmega64, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega324P, ATmega164P, ATmega644P, ATmega644, AT90USB162, AT90USB82, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646

USART2_RX_vect

SIG_USART2_RECV

USART2, Приём завершен

ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561

USART2_TX_vect

SIG_USART2_TRANS

USART2, Передача закончена

ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561

USART2_UDRE_vect

SIG_USART2_DATA

USART2 опустошение регистра данных

ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561

USART3_RX_vect

SIG_USART3_RECV

USART3, Приём завершен

ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561

USART3_TX_vect

SIG_USART3_TRANS

USART3, Передача закончена

ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561

USART3_UDRE_vect

SIG_USART3_DATA

USART3 опустошение регистра данных

ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561

USART_RXC_vect

SIG_USART_RECV, SIG_UART_RECV

USART, Приём завершен

ATmega16, ATmega32, ATmega323, ATmega8

USART_RX_vect

SIG_USART_RECV, SIG_UART_RECV

USART, Приём завершен

AT90PWM3, AT90PWM2, AT90PWM1, ATmega3250, ATmega3290, ATmega3290P, ATmega6450, ATmega6490, ATmega8535, ATmega168, ATmega48, ATmega88, ATtiny2313

USART_TXC_vect

SIG_US

 

 

 

Управление флагом глобального разрешения прерываний

 

Флаг глобального разрешения прерываний расположен в регистре состояния (SREG).

 

#define 

sei()

 

#define 

cli()

 

 

Макроопределения для написания функций обработки прерываний

 

 

 

#define 

ISR(vector)

 

#define 

SIGNAL(vector)

 

#define 

EMPTY_INTERRUPT(vector)

 

#define 

ISR_ALIAS(vector, target_vector)

 

Прерывания в микроконтроллере atmega328p. Что это такое? Как им пользоваться?

Прерывание (Interrupt) – сигнал, сообщающий процессору о наступлении какого-либо события. При этом выполнение текущей последовательности команд приостанавливается и управление передаётся процедуре обработки прерывания, соответствующая данному событию, после чего исполнение кода продолжается ровно с того места где он был прерван (возвращение управления).

Процедура обработки прерывания (Interrupt Service Routine) – это ни что иное как функция/подпрограмма, которую следует выполнить при возникновении определенного события. Будем использовать именно слово “процедура”, для того чтобы подчеркнуть ее отличие от всех остальных функций.

Главное отличие процедуры от простых функций состоит в том что вместо обычного “возврата из функции” (ассемблерная команда RET), следует использовать “возврат из прерывания” (ассемблерная команда RETI) – “RETurn from Interrupt“.

Свойства AVR прерываний:

  • У каждого периферийного устройства, что входит в состав AVR микроконтроллеров, есть как минимум один источник прерывания (Interrupt source). Ко всем этим прерываниям следует причислить и прерывание сброса – Reset Interrupt, предназначение которого отличается от всех остальных.
  • За каждым прерыванием, строго закреплен вектор (ссылка) указывающий на процедуру обработки прерывания (Interrupt service routine). Все векторы прерываний, располагаются в самом начале памяти программ и вместе формируют “таблицу векторов прерываний” (Interrupt vectors table).
  • Каждому прерыванию соответствует определенный “бит активации прерывания” (Interrupt Enable bit). Таким образом, чтобы использовать определенное прерывание, следует записать в его “бит активации прерывания” – лог. единицу. Далее, независимо от того активировали Вы или нет определенные прерывания, микроконтроллер не начнет обработку этих прерываний, пока в “бит всеобщего разрешения прерываний” (Global Interrupt Enable bit в регистре состояния SREG) не будет записана лог. единица. Также, чтобы запретить все прерывания (на неопределенное время), в бит всеобщего разрешения прерываний следует записать – лог. нуль.

Прерывание Reset, в отличие от всех остальных, нельзя запретить. Такие прерывания еще называют Non-maskable interrupts.

  • У каждого прерывания есть строго определенный приоритет. Приоритет прерывания зависит от его расположения в “таблице векторов прерываний”. Чем меньше номер вектора в таблице, тем выше приоритет прерывания. То есть, самый высокий приоритет имеет прерывание сброса (Reset interrupt), которое располагается первой в таблице, а соответственно и в памяти программ. Внешнее прерывание INT0, идущее следом за прерыванием Reset в “таблице векторов прерываний”, имеет приоритет меньше чем у Reset, но выше чем у всех остальных прерываний и т.д.

Таблица векторов прерываний, кроме вектора Reset, может быть перемещена в начало Boot раздела Flash памяти, установив бит IVSEL в регистре GICR. Вектор сброса также может быть перемещен в начало Boot раздела Flash памяти, путем программирования фьюз бита – BOOTRST.

Рис.1 Таблица векторов прерываний ATmega

Микроконтроллеры AVR: Прерывания

Прерывания прекращают работу основной программ для того чтобы выполнить более приоритетную, определяемую внутренними или внешними событиями, влияющими на работу микроконтроллера. При этом в стек записывается содержимое счетчика команд, а в сам счетчик записывается вектор прерывания, по которому находится команда безусловного перехода к подпрограмме обработки прерывания. После выполнения подпрограммы обработки прерывания, в счетчик команд загружается сохраненное значение из стека и выполнение основной программы продолжается с того места, где оно остановилось.

Таблица векторов прерывания располагается в памяти программ, начиная с адреса 0x0002, либо в области загрузчика. Приоритет прерывания зависит также от его расположения в таблице векторов прерывания: чем меньше адрес, тем выше приоритет прерывания.

Регистр MCUCR:

7

6

5

4

3

2

1

0

BODS

IVSEL

IVCE


Бит IVCEL (1) указывает где будет располагаться таблица векторов прерывания:

  • 0 — по адресу 0x0002
  • 1 — по адресу начала загрузчика + 0x0002 (подробнее тут)

Бит IVCE (0) разрешает изменение бита IVCEL в течении 4 машинных циклов после установки его в 1.

Разрешение обработки прерываний осуществляется установкой 1 в бит I (7) регистра SREG:

7

6

5

4

3

2

1

0

I

T

V

Z

C


Таблица векторов прерывания микроконтроллера ATmega328 выглядит следующим образом:

  • 0x0000   RESET — сброс
  • 0x0002   INT0 — внешнее прерывание 0
  • 0x0004   INT1 — внешнее прерывание 0
  • 0x0006   PCINT0 — прерывание по изменению состояния нулевой группы выводов
  • 0x0008   PCINT1 — прерывание по изменению состояния первой группы выводов
  • 0x000A   PCINT2 — прерывание по изменению состояния второй группы выводов
  • 0x000C   WDT — прерывание от сторожевого таймера
  • 0x000E   TIMER2 COMPA — прерывание от таймера/счетчика T2 при совпадении с A
  • 0x0010   TIMER2 COMPB — прерывание от таймера/счетчика T2 при совпадении с B
  • 0x0012   TIMER2 OVF — прерывание по переполнению таймера/счетчика T2
  • 0x0014   TIMER1 CAPT — прерывание от таймера/счетчика T1 по записи
  • 0x0016   TIMER1 COMPA — прерывание от таймера/счетчика T1 при совпадении с A
  • 0x0018   TIMER1 COMPB — прерывание от таймера/счетчика T2 при совпадении с B
  • 0x001A   TIMER1 OVF — прерывание по переполнению таймера/счетчика T1
  • 0x001C   TIMER0 COMPA — прерывание от таймера/счетчика T0 при совпадении с A
  • 0x001E   TIMER0 COMPB — прерывание от таймера/счетчика T0 при совпадении с B
  • 0x0020   TIMER0 OVF — прерывание по переполнению таймера/счетчика T0
  • 0x0022   SPI, STC — прерывание по окончанию передачи модуля SPI
  • 0x0024   USART, RX — прерыванию по окончанию приема модуля USART
  • 0x0026   USART, UDRE — прерывание по опустошению регистра данных модуля USART
  • 0x0028   USART, TX — прерывание по окончанию приема модуля USART
  • 0x002A   ADC — прерывание по завершению преобразования АЦП
  • 0x002C   EE READY — прерывание по готовности памяти EEPROM
  • 0x002E   ANALOG COMP — прерывание от аналогового компаратора
  • 0x0030   TWI — прерывание от модуля I2C (TWI)
  • 0x0032   SPM READY — прерывание по готовности flash памяти

Таблицы скорости передачи AVR

900 6 000
32,768 кГц
бод UBRR % погрешности
300 6 2,5
600 2 12,1
1200 1 17,2
2400 0 134,4
9600 0 368.8
14400 0 603,1
19200 0 837,5
28800 0 1306.2
0 2712,5
76800 0 3650,0
115200 0 5525,0
1 МГц
Бод UBRR % погрешности
300 207 0.2
600 103 0,2
1200 51 0,2
2400 25 0,2
4800 9000 9000 1217 9000 9000
6 7,5
14400 3 7,8
19200 2 7,8
28800 1 7.8
38400 1 22,9
57600 0 7,8
76800 0 22,9
1,2288 МГц
Бод UBRR % погрешности
300 255 0,0
600 127 0.0
1200 63 0,0
2400 31 0,0
4800 15 0,0
00 00 00 00
4 6,2
19200 3 0,0
28800 2 12,5
38400 1 0.0
57600 0 25,0
76800 0 0,0
115200 0 50,0
3 144009 0,0 3 144009 0,0 3 144009
1,8432 МГц
Бод UBRR % погрешности
300 383 0,0
600 191 0,0
1200 95 0.0
2400 47 0,0
4800 23 0,0
9600 11 0,0
5 0,0
28800 3 0,0
38400 2 0,0
57600 1 0.0
76800 1 33,3
115200 0 0,0
2 1 1
2 МГц
Бод UBRR % погрешности
300 416 0,1
600 207 0,2
1200 103 0,2
2400
4800 25 0,2
9600 12 0,2
14400 8 3,7
1
3 7,8
38400 2 7,8
57600 1 7,8
76800 1 9
115200 0 7,8
2,4576 МГц
Бод UBRR % погрешности
300 511 0,0
600 255 0,0
1200 127 0,0
2400
31 0.0
9600 15 0,0
14400 10 3,1
19200 7 0,0
28000 280009 3 0,0
57600 2 12,5
76800 1 0,0
115200 0 25.0
34 38000
3,2768 МГц
Бод UBRR % ошибки
300 682 0,0
600 340 0,1
1200 170 0,2
2400 2400
42 0,8
9600 20 1.6
14400 13 1,6
19200 10 3,1
28800 6 1,6
38000 3 12,5
76800 2 12,5
115200 1 12,5
3.579545 МГц
Бод UBRR % погрешности
300 745 0,0
600 372 0,0
1200 185 0,2
2400 2400 46 0,8
9600 22 1,3
14400 15 3.0
19200 11 3,0
28800 7 3,0
38400 5 3,0
576004
576004 576004 2 3,0
115200 1 3,0
3 48009
3,6864 МГц
Бод UBRR % погрешности
300 767 0.0
600 383 0,0
1200 191 0,0
2400 95 0,0
9004 0,0
23 0,0
14400 15 0,0
19200 11 0,0
28800 7 0.0
38400 5 0,0
57600 3 0,0
76800 2 0,0
4 МГц
Бод UBRR % погрешности
300 832 0,0
600 416 0.1
1200 207 0,2
2400 103 0,2
4800 51 0,2
00 0,2
00 96000 16 2,1
19200 12 0,2
28800 8 3,7
38400 6 7.5
57600 3 7,8
76800 2 7,8
115200 1 7,8
4,1 МГц
Бод UBRR % погрешности
300 873 0,0
600 436 0,0
1200 217 0.2
2400 108 0,2
4800 54 0,7
9600 26 1,1
0004 9004 9009 13 2,5
28800 8 1,1
38400 6 2,5
57600 4 9.9
76800 2 12,1
115200 1 12,1
4 19200 3,0 1
4,433619 МГц
Бод UBRR % погрешности
300 923 0,0
600 461 0,0
1200 230 0,0
2400
4800 57 0,5
9600 28 0,5
14400 18 1,3
1
1
9 3,9
38400 6 3,0
57600 4 3,9
76800 3 10.9
115200 1 16,9
4,608 МГц
Бод UBRR % погрешности
300 959 0,0
600 479 0,0
1200 239 0,0
2400 9000 9000
59 0.0
9600 29 0,0
14400 19 0,0
19200 14 0,0
28000 0,0
28000 7 6,7
57600 4 0,0
76800 3 6,7
115200 2 0
0,0
4,9152 МГц
Бод UBRR % погрешности
300 1023 0,0
600 511 0,0
1200 255 0,0
2400
2400 2400 63 0,0
9600 31 0.0
14400 20 1,6
19200 15 0,0
28800 10 3,1
38000 0,09 4 6,2
76800 3 0,0
115200 2 12,5
5 МГц
Бод UBRR % погрешности
300 1041 0.0
600 520 0,0
1200 259 0,2
2400 129 0,2
009 0,2
009 0,29 32 1,4
14400 21 1,4
19200 15 1,7
28800 10 1.4
38400 7 1,7
57600 4 7,8
76800 3 1,7
5,0688 МГц
Бод UBRR % погрешности
300 1055 0,0
600 527 0.0
1200 263 0,0
2400 131 0,0
4800 65 0,0
00 96000
00
21 0,0
19200 16 3,0
28800 10 0,0
38400 7 3.0
57600 5 9,1
76800 3 3,0
115200 2 9,1
9000
6 МГц
Бод UBRR % погрешности
300 1249 0,0
600 624 0,0
1200 312 0.2
2400 155 0,2
4800 77 0,2
9600 38 0,2
000 000 000 000 19 2,4
28800 12 0,2
38400 9 2,4
57600 6 7.5
76800 4 2,4
115200 2 7,8
0 1 1
6,144 МГц
Бод UBRR % погрешности
300 1279 0,0
600 639 0,0
1200 319 0,0
900 15000
4800 79 0,0
9600 39 0,0
14400 26 1,2
1
12 2,5
38400 9 0,0
57600 6 5,0
76800 4 0.0
115200 2 10,0
3
7,3728 МГц
Бод UBRR % ошибки
300 1535 0,0
600 767 0,0
1200 383 0,0
0,0
000 0,09 95 0.0
9600 47 0,0
14400 31 0,0
19200 23 0,0
28000
28000 0 11 0,0
57600 7 0,0
76800 5 0,0
115200 3 0.0
0,29
8 МГц
Бод UBRR % погрешности
300 1666 0,0
600 832 0,0
1200 416 0,1
2400
103 0,2
9600 51 0.2
14400 34 0,8
19200 25 0,2
28800 16 2,1
38400
8 3,7
76800 6 7,5
115200 3 7,8
000 000
9 МГц
Бод UBRR % погрешности
300 1874 0.0
600 937 0,1
1200 468 0,1
2400 233 0,2
58 0,7
14400 38 0,2
19200 28 1,0
28800 19 2.4
38400 14 2,4
57600 9 2,4
76800 6 4,4
000 ,4
9,216 МГц
Бод UBRR % погрешности
300 1919 0,0
600 959 0.0
1200 479 0,0
2400 239 0,0
4800 119 0.0
39 0,0
19200 29 0,0
28800 19 0,0
38400 14 0.0
57600 9 0,0
76800 7 6,7
115200 4 0,0
9000 000
10 МГц
Бод UBRR % погрешности
300 2082 0,0
600 1041 0,0
1200 520 0.0
2400 259 0,2
4800 129 0,2
9600 64 0,2
32 1,4
28800 21 1,4
38400 15 1,7
57600 10 1.4
76800 7 1,7
115200 4 7,8
000
11,0592 МГц
Бод UBRR % погрешности
300 2303 0,0
600 1151 0,0
1200 575 0,0
900 28000 0
4800 143 0,0
9600 71 0,0
14400 47 0,0
23 0,0
38400 17 0,0
57600 11 0,0
76800 8 0.0
115200 5 0,0
12 МГц
Бод UBRR % погрешности
300 2499 0,0
600 1249 0,0
1200 624 0,0
000 000 000
155 0.2
9600 77 0,2
14400 51 0,2
19200 38 0,2
28000 28000 28000 19 2,4
57600 12 0,2
76800 9 2,4
115200 6 7.5
3400 0,09
12,288 МГц
Бод UBRR % погрешности
300 2559 0,0
600 1279 0,0
1200 639 0,0
000 0,0
2400 9000 0,09 159 0,0
9600 79 0.0
14400 52 0,6
19200 39 0,0
28800 26 1,2
12 2,5
76800 9 0,0
115200 6 5,0
14.318181 МГц
Бод UBRR % погрешности
300 2982 0,0
600 1490 0,0
1200 745 0,0
2400 9000 0,09 185 0,2
9600 92 0,2
14400 61 0.2
19200 46 0,8
28800 30 0,2
38400 22 1,3
57600
576009 3,0
576009 11 3,0
115200 7 3,0
14,746 МГц
Бод UBRR % погрешности
300 3071 0.0
600 1535 0,0
1200 767 0,0
2400 383 0,0
95 0,0
14400 63 0,0
19200 47 0,0
28800 31 0.0
38400 23 0,0
57600 15 0,0
76800 11 0,0
16 МГц
Бод UBRR % погрешности
300 3332 0,0
600 1666 0.0
1200 832 0,0
2400 416 0,1
4800 207 4800 207
68 0,6
19200 51 0,2
28800 34 0,8
38400 25 0.2
57600 16 2,1
76800 12 0,2
115200 8 3,7
0004
18 МГц
Бод UBRR % погрешности
300 3749 0,0
600 1874 0,0
1200 937 0.1
2400 468 0,1
4800 233 0,2
9600 116 9600 116 0,2
58 0,7
28800 38 0,2
38400 28 1,0
57600 19 2.4
76800 14 2,4
115200 9 2,4
0
18,432 МГц
Бод UBRR % погрешности
300 3839 0,0
600 1919 0,0
1200 959 0,0
900 4700
4800 239 0,0
9600 119 0,0
14400 79 0,0
39 0,0
38400 29 0,0
57600 19 0,0
76800 14 0.0
115200 9 0,0
20 МГц
Бод UBRR % погрешности
300 4166 0,0
600 2082 0,0
1200 1041 0,0
000 9000
259 0.2
9600 129 0,2
14400 86 0,2
19200 64 0,2
28000 28000
28000 32 1,4
57600 21 1,4
76800 15 1,7
115200 10 1.4
3000 0,0 38
30 МГц
Бод UBRR % погрешности
300 6249 0,0
600 3124 0,0
1200 1562 0,0
000
000
390 0,1
9600 194 0.2
14400 129 0,2
19200 97 0,4
28800 64 0,2
38000
38000 32 1,4
76800 23 1,7
115200 15 1,7
32.768 МГц
Бод UBRR % погрешности
300 6826 0,0
600 3412 0,0
1200 1706 0,0
000 0,0
000 0,09 426 0,1
9600 212 0,2
14400 141 0.2
19200 106 0,3
28800 70 0,2
38400 52 0,6
0009 26 1,2
115200 17 1,2
0
40 МГц
Бод UBRR % погрешности
300 8332 0.0
600 4166 0,0
1200 2082 0,0
2400 1041 0,0
259 0,2
14400 173 0,2
19200 129 0,2
28800 86 0.2
38400 64 0,2
57600 42 0,9
76800 32 1,4

Криптография с открытым ключом на основе эллиптических кривых для AVR

Содержание:

Общая информация

CRS-AVR010X-ECC криптографическое программное обеспечение реализует цифровую подпись ECDSA и алгоритм ECDH.Поддерживает 8-битные микроконтроллеры AVR производства пользователя Atmel. Поскольку требуются сложные вычисления, мы настоятельно рекомендуем использовать ПО только для микроконтроллеров ATmega.

Кроме того, программное обеспечение предлагает реализацию CRS-AVR020X-RBG генератор случайных битов, основанный на свойствах аналого-цифрового Конвертер. Следовательно, функциональность программного обеспечения является полной только при использовании вместе с микроконтроллеры со встроенным преобразователем.

В зависимости от конфигурации для реализации CRS-AVR010X-ECC требуется от 5 до 8 Кбайт флэш-памяти микроконтроллера и от 750 до 900 Байт памяти SRAM.

Уровень криптографической защиты

Программное обеспечение доступно в четырех версиях, каждая из которых предлагает разный уровень криптографическая защита. В таблице ниже представлена ​​взаимосвязь между реализованными область эллиптической кривой и уровень обеспечиваемой защиты. Каждая строка таблицы соответствует равному уровню защиты. Например: криптографическая мощь домена secp160r1 равна мощности 80-битного ключевого симметричного шифра, а мощность 1024-битного ключа RSA.

Домен Ключевые биты ECDSA / ECDH Биты симметричного ключа шифрования Ключевые биты RSA
secp160r1 160 80 1024
secp192r1 192 96 1536 0009
secp256r1 256 128 3072

Используемые криптографические домены широко известны и были опубликованы в Стандарт SEC 2.

Однако выбор наиболее подходящего домена для конкретного приложения не является легкое задание. В первую очередь следует решить, отдавать ли приоритет скорости или до уровня безопасности. Домен secp160r1 является самым быстрым, но обеспечивает более низкую уровень защиты по сравнению с secp192r1, secp224r1 и secp256r1. Таблица ниже представлены прогнозы, сделанные Национальным институтом стандартов и технологий. (NIST) относительно периода времени, до которого Ожидается, что определенные домены обеспечат безопасность.

Домен Срок службы безопасности
сек.

Время выполнения отдельных операций доступно в разделе под названием часов работы .

Время действия

В таблице ниже представлено время работы для определенных доменов.

Операция Домен 8 МГц 12 МГц
ECDSA / ECDH secp160r1 2.4 [с] 1,6 [с]
ECDSA / ECDH secp192r1 3,3 [с] 2,2 [с]
ECDSA / ECDH secp224r1 4,7 [с] 3,2 [с]
ECDSA / ECDH secp256r1 9,6 [с] 6,4 [с]

Работа подписи ECDSA может быть ускорена за счет использования дополнительных объем памяти. В таблице ниже представлены необходимые объем памяти и время работы для завершение подписи для определенных доменов.

Operacja Домен 8 МГц 12 МГц Дополнительная память
ECDSA secp160r1 1,1 [с] 0,8 [с] 6400 [B]
ECDSA secp192r1 1,4 [s] 1,0 [s] 9216 [B]
ECDSA secp224r1 1.9 [с] 1,3 [с] 12544 [B]
ECDSA secp256r1 3,4 [s] 2,3 [s] 16384 [B]

сборка — Почему компоновщик ассемблера AVR считает, что моя таблица данных находится по неправильному адресу?

MCU: ATmega1284
Программист: JTAGICE3
IDE: Atmel Studio 7.0.2397
Язык: ассемблер AVR

У меня во флеш-памяти есть постоянная таблица данных.Компоновщик думает, что он расположен по адресу 0x0090, поэтому, когда я пишу инструкции по сборке, чтобы попытаться загрузить адрес таблицы, они загружают 0x0090. Проблема в том, что таблица на самом деле находится по адресу 0x0120. Поэтому, когда я пытаюсь получить доступ к таблице, я получаю мусор.

Почему компоновщик думает, что таблица данных расположена по адресу, отличному от того, по которому она фактически программируется?

Вот определение таблицы.

  .cseg
.выровнять 16
  lcd_init_table: .db \
  0xEF, 0x03, 0x03, 0x80, 0x02, \
  0xCF, 0x03, 0x00, 0xC1, 0x30, \
  0xED, 0x04, 0x64, 0x03, 0x12, 0x81, \
  0xE8, 0x03, 0x85, 0x00, 0x78, \
  0xCB, 0x05, 0x39, 0x2C, 0x00, 0x34, 0x02, \
  0xF7, 0x01, 0x20, \
  0xEA, 0x02, 0x00, 0x00, \
  0xC0, 0x01, 0x23, \
  0xC1, 0x01, 0x10, \
  0xC5, 0x02, 0x3e, 0x28, \
  0xC7, 0x01, 0x86, \
  0x36, 0x01, 0x48, \
  0x37, 0x01, 0x00, \
  0x3A, 0x01, 0x55, \
  0xB1, 0x02, 0x00, 0x18, \
  0xB6, 0x03, 0x08, 0x82, 0x27, \
  0xF2, 0x01, 0x00, \
  0x26, 0x01, 0x01, \
  0xE0, 0x0F, 0x0F, 0x31, 0x2B, 0x0C, 0x0E, 0x08, 0x4E, 0xF1, 0x37, 0x07, 0x10, 0x03, 0x0E, 0x09, 0x00, \
  0xE1, 0x0F, 0x00, 0x0E, 0x14, 0x03, 0x11, 0x07, 0x31, 0xC1, 0x48, 0x08, 0x0F, 0x0C, 0x31, 0x36, 0x0F, \
  0x11, 0x80, \
  0x29, 0x80, \
  0x00, 0x00
  

Я хочу получить доступ к таблице с помощью инструкции AVR ELPM, как показано ниже…

 ; Загрузить регистр Z с адресом таблицы
  ldi zh, lcd_init_table >> 8
  ldi zl, lcd_init_table & 0xFF
  clr r16
  из RAMPZ, r16

  lcd_init_loop:
  elpm r16, Z +; команда загрузки
  tst r16
  breq lcd_init_done
  call lcd_write_cmd; записать команду на ЖК-дисплей
  elpm r16, Z +; ожидание загрузки и число аргументов
  mov r17, r16
  andi r16, 0x7F; извлечь num_args
  breq lcd_init_skip_args
  call lcd_write_bytes_from_mcu_rom; записать байты ROM на ЖК-дисплей
  lcd_init_skip_args:
  andi r17, 0x80; извлечь флаг ожидания
  breq lcd_init_loop; если установлен флаг ожидания...
  ldi r16, 150; подождать 150 мс
  позвонить wait_ms
  jmp lcd_init_loop; вернуться в цикл инициализации
  lcd_init_done:
  

Проблема в том, что когда я пытаюсь загрузить в регистр Z адрес lcd_init_table, я получаю значение 0x0090. Файл карты подтверждает, что 0x0090 — это то место, где компоновщик считает, что таблица расположена.

  CSEG lcd_init_table 00000090
  

Проблема в том, что стол на самом деле не находится там. Шестнадцатеричный файл показывает, что на самом деле он находится по адресу 0x0120.Программирование MCU и просмотр флэш-памяти с помощью окна памяти подтверждает, что таблица действительно находится на 0x0120.

Если я жестко закодирую загрузку адреса в зависимости от местоположения в шестнадцатеричном файле, то код будет работать, как задумано. Проблема в том, что я не могу этого сделать, поскольку таблица может перемещаться, когда я добавляю / удаляю код. Я мог бы найти таблицу по явному адресу с помощью директивы .org, но это всего лишь пластырь, и я хотел бы решить настоящую проблему.

 ; Загрузить регистр Z с адресом таблицы
  лди ж, 0x01
  ldi zl, 0x20
  

Настройки программатора устройства следующие.

Параметры компилятора следующие.

Учебные пособия по

AVR — Работа с SRAM

Как мы видели в предыдущем руководстве, стандартные регистры ввода-вывода имеют специальный набор инструкций для доступа к ним. Однако при доступе к расширенным регистрам ввода-вывода и SRAM необходимо использовать более общий набор инструкций, показанный в таблице ниже.

Мнемоника Описание
лд загрузка напрямую из области данных
л.д. непрямая нагрузка
ldd нагрузка непрямая со смещением
пет хранить прямо в пространстве данных
ул косвенный магазин
std магазин непрямого смещения

Выделение места в SRAM

Пространство может быть выделено директивой.byte, за которым следует количество выделяемых байтов, например

 . Байт 4; выделить 4 байта  

Чтобы выделить место в SRAM, необходимо использовать директиву .dseg, чтобы указать сегмент данных . Например, 2 байта на кусок могут быть выделены в начале SRAM для меток var1 и var2 следующим образом

  .dseg
.org SRAM_START
var1: .byte 2; выделить 2 байта для var1
var2: .byte 2; выделить 2 байта для var2  

Выше директива.org используется для установки местоположения .dseg в SRAM_START, адрес, определенный во включаемом файле. Метки var1 и var2 затем используются для обозначения адреса памяти данных, по которому выделяется пространство.

Обратите внимание, что мы не можем записывать значения в память данных при программировании микросхемы, мы можем только выделить для них место и инициализировать их во время выполнения. Значения могут быть записаны в SRAM без выделения места, но приведенное выше дает нам значимые метки для данных, которые мы храним, и позволяет нам отслеживать, сколько SRAM мы используем.

Прямая загрузка и хранение

Первый метод доступа к данным в расширенном вводе-выводе и SRAM называется прямой . Прямой доступ означает, что адрес, который вы хотите загрузить или сохранить, предоставляется вместе с самой инструкцией.

Для прямого доступа используются следующие инструкции: lds — загрузка непосредственно из пространства данных и sts — сохранение прямо в пространство данных . lds и sts вызываются с адресом памяти данных и регистром общего назначения, например.г.

  lds r0, TWDR; загрузить TWDR в r0
стс TWDR, r16; записать r16 в TWDR  

Регистр TWDR находится в режиме расширенного ввода-вывода, поэтому мы не можем использовать вход и выход для доступа к нему, как раньше. Вместо этого мы должны использовать lds и sts. Почти все регистры, управляющие периферийными устройствами (например, UART, I2C), находятся в режиме расширенного ввода-вывода, поэтому к ним можно получить доступ только с помощью этих инструкций.

lds и sts поддерживают любой из 32 рабочих регистров общего назначения в качестве операндов и могут получить доступ к пространству памяти данных объемом до 64 КБ.

Примечание: Использование lds и sts с r0 по r15 стоит на один такт больше и занимает больше места в программной памяти, чем использование с r16 по r31. По возможности используйте в качестве операндов от r16 до r31.

lds и sts могут использоваться для записи и хранения данных, которые мы разместили в SRAM. Например,

  .dseg
.org SRAM_START
var: .byte 2

...

ldi r16,0xAA; загрузить r16 с помощью 0xAA
ldi r17,0x55; загрузить r17 с помощью 0x55

sts var, r16; хранить 0x55AA в
ст вар + 1, п17; вар

lds r0, var; загрузить var в
lds r1, var + 1; r1: r0
  

Выше мы выделяем 2 байта для var в SRAM, инициализируем его значением 0x55AA, а затем загружаем в r1: r0.

Непрямая загрузка и хранение

Другой метод доступа к данным в расширенном вводе-выводе и SRAM называется косвенным . Косвенный доступ осуществляется за счет использования указателя . Напомним, что среди рабочих регистров общего назначения есть три специальных регистра, называемых указателями X, Y и Z. Мы можем получить доступ к памяти данных, загрузив адрес в один из этих указателей. При вызове инструкций непрямого доступа будет извлечено содержимое ячейки памяти данных , на которую указывает указатели X, Y или Z.

Например, инструкции ld и st могут использоваться для доступа к данным с указателем X как

  .dseg
.org SRAM_START
var: .byte 1

...

ldi r16,0xFF; загрузить 0xFF в r16

ldi XL, LOW (var); инициализировать указатель X
ldi XH, HIGH (var); по адресу var

ст X, r16; сохранить r16 в var

ld r0, X; загрузить r0 с помощью var
  

Выше младший и старший байты указателя X загружаются с адресом интересующего нас места в пространстве данных, var.Затем вызываются ld и st с указателем X в качестве операнда.

То же самое можно сделать с указателем Y

  ldi YL, LOW (var); инициализировать указатель Y
ldi YH, HIGH (var); по адресу var

ул Y, r16; сохранить r16 в var

ld r0, Y; загрузить r0 с помощью var
  

И указатель Z

  ldi ZL, LOW (var); инициализировать указатель Z
ldi ZH, HIGH (var); по адресу var

ст Z, r16; сохранить r16 в var

ld r0, Z; загрузить r0 с помощью var
  

Пост-инкремент и пре-декремент

Если необходимо получить доступ к последовательным байтам в памяти данных, указатели X, Y и Z могут быть автоматически увеличены после вызова инструкции путем размещения + рядом с указателем в операнде, т.е.е.

  st X +, r16; сохранить r16 в X и увеличить указатель
ст Y +, r17; сохранить r17 в Y и увеличить указатель
ст Z +, r18; сохранить r18 в Z и увеличить указатель
  

Указатели также могут быть уменьшены на перед вызовом инструкции, поместив — перед указателем в операнде, т. Е.

  st -X, r16; сохранить r16 в X и уменьшить указатель
st -Y, r17; сохранить r17 в Y и уменьшить указатель
ст -Z, r18; сохранить r18 в Z и уменьшить указатель
  

Эта функция чрезвычайно полезна, поскольку избавляет вас от необходимости перезагружать указатели каждый раз, когда вам нужно получить доступ к данным.Например, 4 байта могут быть сохранены в области данных, а затем считаны как

  .dseg
.org SRAM_START
var: .byte 4

...

ldi r16,0x01; загрузить 0x01 в r16
ldi r17,0x23; загрузить 0x23 в r17
ldi r18,0x45; загрузить 0x45 в r18
ldi r19,0x67; загрузить 0x67 в r19

ldi XL, LOW (var); инициализировать указатель X
ldi XH, HIGH (var); по адресу var

ст X +, r16; сохранить r16 в var + 0 и увеличить указатель
ст X +, r17; сохранить r17 в var + 1 и увеличить указатель
ст X +, r18; сохранить r18 в var + 2 и увеличить указатель
st X +, r19; сохранить r19 в var + 3 и увеличить указатель

ld r3, -X; указатель декремента и загрузка var + 3 в r3
ld r2, -X; указатель декремента и загрузка var + 2 в r2
ld r1, -X; указатель декремента и загрузка var + 1 в r1
ld r0, -X; указатель декремента и загрузка var + 0 в r0
  

Рабочий объем

Указатели Y и Z поддерживают дополнительную функцию, заключающуюся в том, что они могут быть смещены на 63 байта перед адресом, которым они инициализированы.Это делается с помощью инструкций ldd — косвенная загрузка со смещением и sts — косвенная загрузка со смещением.

  ldd r0, Y + 0; загрузить r0 указателем Y
ldd r1, Y + 1; загрузить r1 указателем Y + 1

стандартное Z + 0, r0; загрузить r0 в указатель Z
стандартное Z + 1, r1; загрузить r1 в Z указатель + 1
  

Смещение полезно для доступа к последовательным ячейкам памяти данных без изменения значения, загруженного в указатель, на случай, если оно понадобится позже.

Ответьте на следующие короткие вопросы о Atmel AVR

Расшифрованный текст изображения: Ответьте на следующие короткие вопросы о прерываниях Atmel AVR. (Подсказка: ниже представлена ​​информация из справочного руководства, которая поможет вам ответить на вопросы.) 1. Atmel AVR имеет несколько источников прерываний, всеми из которых можно управлять с помощью флага I в регистре кода состояния. а. Флажок I активен-высокий или активен-низкий? То есть какое состояние флага I указывает на то, что прерывания разрешены? б.Какая единственная инструкция кода операции делает активным флаг прерывания (разрешает прерывания)? (Подсказка: на основании вашего предыдущего ответа, следует ли вам УСТАНОВИТЬ или ОЧИСТИТЬ флаг I?) 2. Когда происходит прерывание, ЦП ищет местоположение подпрограммы обслуживания прерывания в таблице. (Часть таблицы скопирована ниже.) Адреса в таблицах указывают на память данных или память команд? 3. Где находится вектор прерывания для прерывания запроса внешнего прерывания 1? (Подсказка: см. Таблицу ниже.) 4.Какая инструкция должна быть в конце каждой процедуры обслуживания прерывания? 5. Какая структура данных используется для сохранения состояния процессора при приеме прерывания? 6. В системе обработки прерываний Atmel AVR состояние процессора сохраняется автоматически, или же подпрограмма обслуживания прерывания отвечает за сохранение и восстановление состояния? 7. Помимо регистров общего назначения, какой регистр необходимо сохранять и восстанавливать, чтобы прерывания не мешали нормальному выполнению основной программы? N 3 4 8 Информация из Справочного руководства Atmega 328PB: 15.1 Векторы прерывания в ATmega328PB Таблица 15-1. Векторы сброса и прерывания в векторе ATmega328PB Нет адреса программы Источник Определение прерывания 1 0x0000 Внешний вывод RESET, сброс при включении, сброс после отключения питания и сброс системы сторожевого таймера Ox0002 INTO Внешний запрос прерывания Ox0004 INT1 Внешний запрос прерывания 1 Ox0006 PCINTO Запрос прерывания изменения контакта o 5 0x0008 PCINT1 запрос прерывания смены контакта 1 6 0x000A PCINT2 запрос прерывания смены контакта 2 7 Ox0000 WDT Watchdog Time-out Interrupt 0x000E TIMER2_COMPA Timer / Counter2 Match Match A 0x0010 TIMER2_COMPB Timer / Coutner2 Compare Match B 10 Ox0012 TIMER_COMPB Timer / Coutner2 Compare Match B 10 Ox0012 TIMER_1400 Counter Timer / Counter1 Capture Event 12 0x0016 TIMER1_COMPA Timer / Counter1 Compare Match A 13 Ox0018 TIMER1_COMPB Timer / Coutner1 Compare Match B 14 0x001A TIMER1_OVF Таймер / счетчик 1 Переполнение 15 0x001C TIMERO_COMPA Timer / Countero00 Matchout 16 TIMERO_COMPA Timer / Counteror00 Matchout A Timer / Countero00 Matchout 16 TIMERO_COMPA Timer / Countero00 Matching A TIMERO_COMPA Timer / Countero00 Match 16 A TIMERO_COMPA Timer / Countero00 Matching A TIMERO_COMPA Timer / Countero00 Matching A TIMERO_COMPA Timer / Countero00 Match 16 Ox0020 TIMERO_OVF Переполнение таймера / счетчика 18 Ox0022 SPIO STC SPI1 Последовательная передача завершена 1 9 0x0024 USARTO_RX USARTO Rx Complete 20 Ox0026 USARTO_UDRE USARTO, регистр данных пуст 21 Ox0028 USARTO_TX USARTO, Tx Complete

Предыдущий вопрос Следующий вопрос

Введение в ATmega328 — инженерные проекты

Всем привет! Я надеюсь, что вы все будете в полном порядке и весело проведете время.Сегодня я собираюсь подробно рассказать о Introduction to ATmega328. ATmega328 — это микроконтроллер Advanced Virtual RISC (AVR). Он поддерживает 8-битную обработку данных. ATmega-328 имеет внутреннюю флеш-память 32 КБ.

ATmega328 имеет электрически стираемую программируемую постоянную память (EEPROM) емкостью 1 КБ. Это свойство показывает, если электропитание, подаваемое на микроконтроллер, отключено, даже тогда он может хранить данные и может предоставлять результаты после подачи электропитания.Кроме того, ATmega-328 имеет 2 КБ статической оперативной памяти (SRAM). Другие характеристики будут объяснены позже. ATmega 328 имеет несколько различных функций, которые делают его самым популярным устройством на сегодняшнем рынке. Эти функции включают усовершенствованную архитектуру RISC, хорошую производительность, низкое энергопотребление, счетчик реального времени с отдельным генератором, 6 контактов PWM, программируемый последовательный USART, блокировку программирования для безопасности программного обеспечения, пропускную способность до 20 MIPS и т. Д. Более подробная информация о ATmega 328 будет приводится ниже в этом разделе.

Введение в ATmega328

  • ATmega328 — это 8-разрядный 28-контактный микроконтроллер AVR, произведенный Microchip, соответствует архитектуре RISC и имеет программную память флэш-памяти объемом 32 КБ.
  • Atmega328 — это микроконтроллер, используемый в базовых платах Arduino, то есть Arduino UNO, Arduino Pro Mini и Arduino Nano.
  • Он имеет EEPROM памяти объемом 1 КБ, а его память SRAM составляет 2 КБ.
  • Он имеет 8 контактов для операций АЦП, которые в совокупности образуют PortA (PA0 — PA7).
  • Он также имеет 3 встроенных таймера, два из которых — 8-битные, а третий — 16-битный.
  • Вы, должно быть, слышали об Arduino UNO, UNO основана на микроконтроллере atmega328. Это сердце ООН. 🙂
  • Он работает в диапазоне от 3,3 В до 5,5 В, но обычно мы используем стандартное напряжение 5 В.
  • Его превосходные характеристики включают экономичность, низкое рассеивание мощности, блокировку программирования в целях безопасности, счетчик реального времени с отдельным генератором.
  • Обычно используется в приложениях для встраиваемых систем.Вы должны взглянуть на эти примеры встроенных систем из реальной жизни, мы можем спроектировать их все, используя этот микроконтроллер.
  • В следующей таблице показаны полные характеристики ATmega328:
C C C C C 10-битный PDFP32 QFN / MLF32-pad QFN / MLF 9 0004 8-битный x 2 и 16-битный x 1 Производитель
Характеристики ATmega328
Число контактов 28
ЦП RISC8 9000 Рабочее напряжение 9000 AV9R 9000 1,8 — 5,5 В
Программная память 32 КБ
Тип программной памяти Flash
SRAM 2048 байтов
Количество каналов АЦП 8
Выводы ШИМ 6
Компаратор 1
Выводы (4)
Генератор до 20 МГц
Таймер (3)
Расширенный сброс при включении Да
Таймер включения питания Да
Контакты ввода / вывода 23
Microchip
SPI Да
I2C Да
Сторожевой таймер Да
Обнаружение сбоев
USI (Универсальный последовательный интерфейс) Да
Минимальная рабочая температура От -40 C до +85 C

Контакты ATmega328

  • ATmega-328 — микроконтроллер AVR с восемью ) всего контактов.
  • Все контакты в хронологическом порядке перечислены в таблице, показанной на рисунке ниже.
Теперь давайте подробно рассмотрим распиновку Atmega328:

Распиновка ATmega328

  • По схеме распиновки мы можем понять конфигурации контактов любого электронного устройства, поэтому вы работаете над любым инженерным проектом, тогда вы должны сначала прочтите распиновку компонентов.
  • Схема выводов
  • ATmega328 показана на рисунке ниже:

Выводы ATmega328 Описание

  • Функции, связанные с выводами, должны быть известны для правильного использования устройства.
  • Выводы
  • ATmega-328 разделены на разные порты, которые подробно описаны ниже.
  • VCC — цифровой источник напряжения.
  • AVCC — вывод напряжения питания аналого-цифрового преобразователя.
  • GND обозначает землю и имеет 0 В.
    • Порт A состоит из контактов от PA0 до PA7. Эти контакты служат аналоговым входом для аналого-цифровых преобразователей. Если аналого-цифровой преобразователь не используется, порт A действует как восьмиразрядный двунаправленный порт ввода / вывода.
    • Порт B состоит из контактов от PB0 до PB7. Этот порт является 8-битным двунаправленным портом, имеющим внутренний подтягивающий резистор.
    • Порт C состоит из контактов от PC0 до PC7. Выходные буферы порта C имеют симметричные характеристики привода с возможностью источника, а также с высоким потреблением.
    • Порт D состоит из контактов от PD0 до PD7. Это также 8-битный порт ввода / вывода, имеющий внутренний подтягивающий резистор.
  • Все порты AVR показаны на рисунке ниже.
  • AREF — это аналоговый опорный вывод для аналого-цифрового преобразователя.
  • Итак, это краткое описание всех контактов микроконтроллера AVR ATmega328.

Архитектура ATmega328

  • Архитектура устройства представляет информацию о конкретном устройстве.
  • Архитектура
  • ATmega-328 показана на рисунке ниже.

Память ATmega328

  • ATmega 328 имеет три типа памяти:
    • Флэш-память: 32 КБ. Это программируемое постоянное запоминающее устройство (ПЗУ). Это энергонезависимая память.
    • SRAM: 2 КБ. — статическая оперативная память. Это энергозависимая память, т.е. данные будут удалены после отключения источника питания.
    • EEPROM: 1 КБ. — это электрически стираемая программируемая постоянная память.
  • Области памяти
  • AVR показаны на рисунке ниже.

Регистры ATmega328

  • ATmega-328 имеет тридцать два (32) регистра общего назначения (GP).
  • Все эти регистры являются частью статической оперативной памяти (SRAM).
  • Все регистры представлены на рисунке ниже.

Пакеты ATmega328

  • Различные версии одного и того же устройства обозначаются разными пакетами этого устройства.
  • Каждая упаковка имеет разные размеры, чтобы их можно было легко различить.
  • Пакеты
  • ATmega 328 приведены в таблице, приведенной на рисунке ниже.

Блок-схема ATmega328

  • Блок-схема показывает внутреннюю схему и последовательность выполнения программы любого устройства.
  • Блок-схема
  • ATmega 328 показана на рисунке ниже.

ATmega328 Возможности

  • Для выполнения любой задачи мы можем выбрать устройство на основе его характеристик. т.е. совпадают ли его функции для получения желаемых результатов или нет.
  • Некоторые из основных характеристик микроконтроллера AVR ATmega328 показаны в таблице, приведенной на рисунке ниже.

ATmega328 и Arduino

  • ATmega328 — это микроконтроллер, используемый в плате Arduino UNO.
  • Когда мы загружаем код в Arduino UNO, он фактически загружается в микроконтроллер Atmega328.
  • Программный драйвер, называемый загрузчиком, предварительно установлен во флеш-памяти микроконтроллера Atmega328, что делает его совместимым с Arduino IDE.
  • AVR Atmega328, подключенный к Arduino, показан на рисунке ниже:

Контакты ATmega328 и Arduino

  • Контакты ATmega328 подключены к соответствующим контактам Arduino.
  • Их связь друг с другом показана на схеме выводов, показанной на рисунке ниже.
  • Аналоговые выводы обведенной секции состоят из выводов Arduino, которые подключены к соответствующим выводам микроконтроллера AVR ATmega-328.
  • Я написал обе булавки друг напротив друга, это поможет легко понять.
  • Если вы хотите работать с этой платой Arduino, вы должны попробовать эти проекты Arduino для начинающих, они помогут вам заполучить Arduino.

Приложения Atmega328

  • Полный пакет, включающий ATmega 328 и Arduino, можно использовать в нескольких различных реальных приложениях.
  • Может использоваться в проектах встраиваемых систем.
  • Может также использоваться в робототехнике.
  • Квадрокоптер и даже небольшой авиалайнер тоже может быть сконструирован через него.
  • Системы контроля и управления питанием также могут быть подготовлены с помощью этого устройства.
  • Я разработал эту систему домашней безопасности с использованием Arduino UNO, вам стоит взглянуть на нее.

Как начать работать с Atmega328

  • Если вы хотите начать работу с этим микроконтроллером, я бы посоветовал вам сделать это с помощью Arduino.
  • Преимущество использования Arduino заключается в том, что вы можете использовать все его встроенные библиотеки, что значительно упростит работу.
  • После разработки вашего проекта на Arduino, затем спроектируйте базовую схему Atmega-328, которая довольно проста, и я обсуждал выше.
  • Теперь вы должны быть осторожны при использовании его контактов, контакты Atmega328 и Arduino обсуждались выше.
  • Еще одна вещь, о которой следует упомянуть, это то, что прежде чем работать с оборудованием, вы должны сначала спроектировать его Proteus Simulation.
  • Загрузите библиотеку Arduino для Proteus и создайте на ней свой проект.
  • Как только вы убедитесь, что все в порядке, спроектируйте его схему на плате Wero или PCB (печатная плата), и ваш проект будет готов. 🙂
В учебном пособии Введение в ATmega328 представлено подробное обсуждение базового использования ATmega 328. Я полностью предоставил все необходимые сведения об использовании микроконтроллера AVR.Если у вас возникнут проблемы, вы можете в любое время задать их нам в комментариях. Наша команда всегда готова помочь вам, ребята. Я поделюсь со всеми вами другими удивительными темами в своих следующих уроках. Так что пока позаботьтесь 🙂

Память AVR — Справка разработчика

Микроконтроллеры AVR построены с использованием модифицированной Гарвардской архитектуры. Это означает, что пространство флэш-памяти программ находится на отдельной адресной шине, чем статическая оперативная память (SRAM). Есть две шины данных, одна для доступа ко всем данным и шина ввода / вывода с ограниченным доступом к небольшому участку памяти.

Микроконтроллеры AVR содержат встроенную в систему перепрограммируемую флэш-память для хранения программ. Поскольку все инструкции AVR имеют ширину 16 или 32 бита, флэш-память организована как 32K x 16. В целях безопасности программного обеспечения пространство памяти флэш-программ разделено на две секции — секцию загрузчика и секцию прикладной программы в устройстве. Типичный срок службы флэш-памяти составляет не менее 10 000 циклов записи / стирания. Таблицы констант могут быть размещены во всем адресном пространстве памяти программ с помощью инструкции загрузки памяти программ (LPM).Существует также библиотека функций, облегчающих эту задачу. Библиотека AVR Libc

.

Данные электрически стираемая программируемая постоянная память (EEPROM) организована как отдельное пространство данных, в котором можно читать и записывать отдельные байты. Доступ от ЦП к EEPROM осуществляется через регистры адреса EEPROM , регистр данных EEPROM и регистр управления EEPROM . EEPROM выдерживает не менее 100 000 циклов записи / стирания.

Доступ к данным можно получить через стандартную шину данных .Имеется вторичная шина ввода / вывода для быстрого прямого доступа к выбранным местам.

Память данных состоит из:

  • Регистры
  • Память ввода / вывода
  • Расширенная память ввода / вывода (зависит от устройства)
  • Внутренняя SRAM

Регистровое пространство — состоит из 32 рабочих 8-битных регистров общего назначения (R0-R31).

Память ввода / вывода — содержит адресное пространство для периферийных функций, таких как регистры управления и другие функции ввода / вывода.

Расширенная память ввода-вывода — Некоторым микроконтроллерам AVR с большим количеством периферийных устройств требуется больше места, чем может адресовать память ввода-вывода, поэтому часть SRAM используется в качестве расширенной памяти ввода-вывода для обработки дополнительных регистров управления периферийными устройствами и другого ввода-вывода. O функции.

Внутренняя SRAM (память данных) — используется для временного хранения промежуточных результатов и переменных в программном приложении.

Имеется пять различных режимов адресации шины данных (не вход / выход) для памяти данных:

  • Прямая — Прямая адресация распространяется на все пространство данных.
  • Косвенная — В регистровом файле регистры с R26 по R31 содержат регистры указателя косвенной адресации.
  • Косвенный со смещением — Косвенный со смещением режим достигает 63 адресных ячеек от базового адреса, заданного Y- или Z-регистром.
  • Косвенный с предварительным декрементом — Адресные регистры X, Y и Z уменьшаются.
  • Косвенный с постинкрементом — Адресные регистры X, Y и Z увеличиваются.

Входная / выходная шина данных

Эта шина данных имеет прямой доступ к 64-байтовой секции памяти ввода-вывода (не расширенной) с использованием адресов от 0x00 до 0x1F. К этой памяти также можно получить доступ по стандартной шине данных, используя смещение адреса 0x20 в команде доступа.

Все ячейки ввода / вывода (память ввода / вывода и расширенная память ввода / вывода) могут быть доступны инструкциям сборки LD / LDS / LDD и ST / STS / STD с использованием стандартной шины данных. Данные передаются между 32 рабочими регистрами общего назначения и пространством ввода-вывода.

Регистры ввода / вывода в диапазоне адресов шины ввода / вывода 0x00-0x1F (память ввода / вывода) имеют прямой битовый доступ с использованием инструкций SBI и CBI. В этих регистрах значение отдельных битов можно проверить с помощью инструкций SBIS и SBIC.

Три регистра ввода-вывода общего назначения, регистр ввода-вывода общего назначения 0/1/2 (GPIOR 0/1/2) находятся в верхней части памяти ввода-вывода (0x020-0x022). Эти регистры могут использоваться для хранения любой информации, и они особенно полезны для хранения глобальных переменных и флагов состояния.Эти регистры имеют прямой битовый доступ с использованием инструкций SBI, CBI, SBIS и SBIC через шину данных In / Out. Остальные регистры ввода-вывода начинаются после регистров ввода-вывода общего назначения.

Шина данных AVR имеет ширину 8 бит, поэтому доступ к 16-битным регистрам требует атомарных операций. К этим регистрам необходимо обращаться побайтово с помощью двух операций чтения или записи. 16-битные регистры подключены к 8-битной шине, а временный регистр — через 16-битную шину.

Для операции записи старший байт 16-битного регистра должен быть записан перед младшим байтом.Затем старший байт записывается во временный регистр. Когда записывается младший байт 16-битного регистра, временный регистр копируется в старший байт 16-битного регистра в том же тактовом цикле.

Для операции чтения младший байт 16-битного регистра должен быть прочитан перед старшим байтом. Когда ЦП считывает младший байт регистра, старший байт 16-битного регистра копируется во временный регистр в том же тактовом цикле, что и младший байт.Когда читается старший байт, он затем читается из временного регистра.

Это гарантирует, что младший и старший байты 16-битных регистров всегда доступны одновременно при чтении или записи регистра.

.

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *