Buderus-trade.ru

Теплотехника Будерус
3 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

16 битный счетчик avr

16 битный счетчик avr

В этой статье будет рассмотрено использование таймеров в МК и способ подсоединения кнопок к нему.Сначала немного теории.

В МК ATMega16 есть три таймера/счетчика – два 8-битных (Timer/Counter0, Timer/Counter2) и один 16-битный (Timer/Counter1). Каждый из них содержит специальные регистры, одним из которых является счетный регистр TCNTn (n – это число 0, 1 или 2). Каждый раз, когда процессор выполняет одну команду, содержимое этого регистра увеличивается на единицу (либо каждые 8, 64, 256 или 1024 тактов). Потому он и называется счетным. Помимо него, есть еще и регистр сравнения OCRn (Output Compare Register), в который мы можем сами записать какое-либо число. У 8-битного счетчика эти регистры 8-битные. По мере выполнения программы содержимое TCNTn растет и в какой-то момент оно совпадет с содержимым OCRn. Тогда (если заданы специальные параметры) в регистре флагов прерываний TIFR (Timer/Counter Interrupt Flag Register) один из битов становится равен единице и процессор, видя запрос на прерывание, сразу же отрывается от выполнения бесконечного цикла и идет обслуживать прерывание таймера. После этого процесс повторяется.

Ниже представлена временная диаграмма режима CTC (Clear Timer on Compare). В этом режиме счетный регистр очищается в момент совпадения содержимого TCNTn и OCRn, соответственно меняется и период вызова прерывания.

Это далеко не единственных режим работы таймера/счетчика. Можно не очищать счетный регистр в момент совпадения, тогда это будет режим генерации широтно-импульсной модуляции, который мы рассмотрим в следующей статье. Можно менять направление счета, т. е. содержимое счетного регистра будет уменьшаться по мере выполнения программы. Также возможно производить счет не по количеству выполненных процессором команд, а по количеству изменений уровня напряжения на «ножке» T0 или T1 (режим счетчика), можно автоматически, без участия процессора, менять состояние ножек OCn в зависимости от состояния таймера. Таймер/Счетчик1 умеет производить сравнение сразу по двум каналам – А или В.

Далее представлена функциональная схема таймера/счетчика0:

Для запуска таймера нужно выставить соответствующие биты в регистре управления таймером TCCRn (Timer/Counter Control Register), после чего он сразу же начинает свою работу.

Мы рассмотрим лишь некоторые режимы работы таймера. Если вам потребуется работа в другом режиме, то читайте Datasheet к ATMega16 – там все подробнейше по-английски написано, даны даже примеры программ на С и ассемблере (недаром же он занимает 357 страниц печатного текста!).

Теперь займемся кнопками.

Если мы собираемся использовать небольшое количество кнопок (до 9 штук), то подключать их следует между «землей» и выводами какого-либо порта микроконтроллера. При этом следует сделать эти выводы входами, для чего установить соответствующие биты в регистре DDRx и включить внутренний подтягивающий резистор установкой битов в регистре PORTx. При этом на данных «ножках» окажется напряжение 5 В. При нажатии кнопки вход МК замыкается на GND и напряжение на нем падает до нуля (а может быть и наоборот – вывод МК замкнут на землю в отжатом состоянии). При этом меняется регистр PINx, в котором хранится текущее состояние порта (в отличие от PORTx, в котором установлено состояние порта при отсутствии нагрузки, т. е. до нажатия каких-либо кнопок). Считывая периодически состояние PINx, можно определить, что нажата кнопка.

Читайте так же:
Счетчик пробега тойота камри

ВНИМАНИЕ! Если соответствующий бит в регистре DDRx будет установлен в 1 для вашей кнопки, то хорошее нажатие на кнопку может привести к небольшому пиротехническому эффекту – возникновению дыма вокруг МК. Естественно, МК после этого придется отправить в мусорное ведро…

Перейдем к практической части. Создайте в IAR новое рабочее пространство и новый проект с именем, например, TimerButton. Установите опции проекта так, как это описано в предыдущей статье. А теперь наберем следующий небольшой код.

Давайте посмотрим, как это работает. В функциях init_timern задаются биты в регистрах TCCRn, OCRn и TIMSK, причем такой способ может кому-нибудь показаться странным или незнакомым. Придется объяснить сначала, что означает запись «(1 © KERNELCHIP 2006 — 2021

16 битный счетчик avr

AVR — семейство восьмибитных микроконтроллеров, ранее выпускавшихся фирмой Atmel, затем — Microchip. Год разработки — 1996.

Содержание

История создания архитектуры AVR [ править | править код ]

Идея разработки нового RISC-ядра принадлежит двум студентам Norwegian University of Science and Technology (NTNU) из норвежского города Тронхейма — Альфу Богену (Alf-Egil Bogen) и Вегарду Воллену (Vegard Wollen). В 1995 году Боген и Воллен решили предложить американской корпорации Atmel, которая была известна своими чипами с Flash-памятью, выпускать новый 8-битный RISC-микроконтроллер и снабдить его Flash-памятью для программ на одном кристалле с вычислительным ядром.

Идея была одобрена Atmel Corp., и было принято решение незамедлительно инвестировать в данную разработку. В конце 1996 года был выпущен опытный микроконтроллер AT90S1200, а во второй половине 1997 г. корпорация Atmel приступила к серийному производству нового семейства микроконтроллеров, к их рекламной и технической поддержке.

Новое ядро было запатентовано и получило название AVR. Существует несколько трактовок данной аббревиатуры. Кто-то утверждает, что это Advanced Virtual RISC, другие полагают, что не обошлось здесь без Alf Egil Bogen Vegard Wollan RISC.

Описание архитектуры [ править | править код ]

Микроконтроллеры AVR имеют гарвардскую архитектуру (программа и данные находятся в разных адресных пространствах) и систему команд, близкую к идеологии RISC. Процессор AVR имеет 32 8-битных регистра общего назначения, объединённых в регистровый файл. В отличие от «идеального» RISC, регистры не абсолютно ортогональны:

  • Некоторые команды работают только с регистрами r16…r31. К ним относятся команды, работающие с непосредственным операндом: ANDI/CBR, ORI/SBR, CPI, LDI, LDS (16-бит), STS (16-бит), SUBI, SBCI, а также SER и MULS;
  • Команды, увеличивающие и уменьшающие 16-битное значение (в тех моделях, где они доступны) с непосредственным операндом (ADIW, SBIW), работают только с одной из пар r25:r24, r27:r26 (X), r29:r28 (Y), или r31:r30 (Z);
  • Команда копирования пары регистров (в тех моделях, где доступна) работает только с соседними регистрами, начинающимися с нечётного (r1:r0, r3:r2, …, r31:r30);
  • Результат умножения (в тех моделях, в которых есть модуль умножения) всегда помещается в r1:r0. Также только эта пара используется в качестве операндов для команды самопрограммирования (где доступна);
  • Некоторые варианты команд умножения принимают в качестве аргументов только регистры из диапазона r16…r23 (FMUL, FMULS, FMULSU, MULSU).

Система команд [ править | править код ]

Система команд микроконтроллеров AVR весьма развита и насчитывает в различных моделях от 90 до 135 [1] различных инструкций.

Большинство команд занимает только 1 ячейку памяти (16 бит).

Читайте так же:
Плата за проверку счетчиков законна

Большинство команд выполняется за 1 такт.

Всё множество команд микроконтроллеров AVR можно разбить на несколько групп:

  • команды логических операций;
  • команды арифметических операций и команды сдвига;
  • команды операции с битами;
  • команды пересылки данных;
  • команды передачи управления;
  • команды управления системой.

Управление периферийными устройствами осуществляется через адресное пространство данных. Для удобства существуют «сокращённые команды» IN/OUT.

Семейства микроконтроллеров [ править | править код ]

  • tinyAVR (ATtinyxxx):
      до 16 КБ; SRAM до 512 Б; EEPROM до 512 Б;
    • Число линий ввода-вывода 4-18 (общее количество выводов 6-32);
    • Ограниченный набор периферийных устройств.
    • Флеш-память до 256 КБ; SRAM до 16 КБ; EEPROM до 4 КБ;
    • Число линий ввода-вывода 23-86 (общее количество выводов 28-100);
    • Аппаратный умножитель;
    • Расширенная система команд и периферийных устройств.
    • Флеш-память до 384 КБ; SRAM до 32 КБ; EEPROM до 4 КБ;
    • Четырёхканальный DMA-контроллер;
    • Инновационная система обработки событий.

    Как правило, цифры после префикса обозначают объём встроенной flash-памяти (в КБ) и модификацию контроллера. А именно — максимальная степень двойки, следующая за префиксом, обозначает объём памяти, а оставшиеся цифры определяют модификацию (напр., ATmega128 — объём памяти 128 КБ; ATmega168 — объём памяти 16 КБ, модификация 8; ATtiny44 и ATtiny45 — память 4 КБ, модификации 4 и 5 соответственно). [ источник не указан 3406 дней ]

    На основе стандартных семейств выпускаются микроконтроллеры, адаптированные под конкретные задачи:

    • со встроенными интерфейсами USB, CAN, контроллером LCD;
    • со встроенным радиоприёмопередатчиком — серии ATAxxxx, ATAMxxx;
    • для управления электродвигателями — серия AT90PWMxxxx;
    • для автомобильной электроники;
    • для осветительной техники.

    Кроме указанных выше семейств, ATMEL выпускает 32-разрядные микроконтроллеры семейства AVR32, которое включает в себя подсемейства AT32UC3 (тактовая частота до 66 МГц) и AT32AP7000 (тактовая частота до 150 МГц).

    Версии контроллеров [ править | править код ]

    AT (mega/tiny)xxx — базовая версия.
    ATxxxL — версии контроллеров, работающих на пониженном (Low) напряжении питания (2,7 В).
    ATxxxV — версии контроллеров, работающих на низком напряжении питания (1,8 В).
    ATxxxP — малопотребляющие версии (до 100 нА в режиме Power-down), применена технология picoPower (анонсированы в июле 2007), повыводно и функционально совместимы с предыдущими версиями.
    ATxxxA — уменьшен ток потребления, перекрывается весь диапазон тактовых частот и напряжений питания двух предыдущих версий (также, в некоторых моделях, добавлены новые возможности и новые регистры, но сохранена полная совместимость с предыдущими версиями). Микроконтроллеры «А» и «не-А» обычно имеют одинаковую сигнатуру, что вызывает некоторые трудности, так как Fuse-bit’ы отличаются.

    Номер модели дополняется индексом, указывающим вариант исполнения. Цифры (8,10,16,20) перед индексом означают максимальную частоту, на которой микроконтроллер может стабильно работать при нормальном для него напряжении питания).

    Первая буква индекса означает вариант корпуса:

    АТxxx-P — корпус DIP
    АТxxx-A — корпус TQFP
    АТxxx-J — корпус PLCC
    АТxxx-M — корпус MLF
    АТxxx-MA — корпус UDFN/USON
    АТxxx-C — корпус CBGA
    АТxxx-CK — корпус LGA
    АТxxx-S — корпус EIAJ SOIC
    АТxxx-SS — узкий корпус JEDEC SOIC
    АТxxx-T — корпус TSOP
    АТxxx-TS — корпус SOT-23 (ATtiny4/5/9/10)
    АТxxx-X — корпус TSSOP

    Следующая буква означает температурный диапазон и особенности изготовления:

    АТxxx-xC — коммерческий температурный диапазон (0 °C — 70 °C)
    АТxxx-xA — температурный диапазон −20 °C — +85 °C, с использованием бессвинцового припоя
    АТxxx-xI — индустриальный температурный диапазон (-40 °C — +85 °C)
    АТxxx-xU — индустриальный температурный диапазон (-40 °C — +85 °C), с использованием бессвинцового припоя
    АТxxx-xH — индустриальный температурный диапазон (-40 °C — +85 °C), с использованием NiPdAu
    АТxxx-xN — расширенный температурный диапазон (-40 °C — +105 °C), с использованием бессвинцового припоя
    АТxxx-xF — расширенный температурный диапазон (-40 °C — +125 °C)
    АТxxx-xZ — автомобильный температурный диапазон (-40 °C — +125 °C)
    АТxxx-xD — расширенный автомобильный температурный диапазон (-40 °C — +150 °C)

    последняя буква R означает упаковку в ленты (Tape & Reel) для автоматизированных систем сборки.

    Устройства ввода-вывода МК [ править | править код ]

    МК AVR имеют развитую периферию:

    • До 86 многофункциональных, двунаправленных GPIO линий ввода-вывода, объединённых в 8-битные порты ввода-вывода. В зависимости от программно-задаваемой конфигурации регистров, могут независимо друг от друга работать в режиме «сильного» драйвера, выдающего или принимающего (на «землю») ток до 40 мА, что достаточно для подключения светодиодных индикаторов. Любой из выводов портов может быть сконфигурирован на «ввод» либо в свободном состоянии, либо с использованием встроенного подтягивающего (на плюс) резистора.
    • До 3 внешних источников прерываний (по фронту, срезу, или уровню) и до 32 по изменению уровня на входе.
    • В качестве источника тактовых импульсов может быть выбран:
      • керамический или кварцевый резонатор (не у всех моделей);
      • внешний тактовый сигнал;
      • калиброванный внутренний RC-генератор (частота 1, 2, 4, 8 МГц, а также, для некоторых моделей ATtiny — 4,8, 6.4, 9.6 МГц и 128 кГц).
      • сигналы JTAG (TMS, TDI, TDO, и TCK) мультиплексированы на порт ввода-вывода. Режим работы — JTAG или порт — задаётся соответствующим битом в регистре fuses. МК AVR поставляются с включённым интерфейсом JTAG.
      • программируемый коэффициент усиления перед АЦП 1, 10 и 200 (в дифференциальном режиме);
      • в качестве опорного напряжения могут выступать: напряжение питания, внешнее напряжение, или внутреннее некалиброванное опорное напряжение около 2,56 В (для моделей, имеющих минимальное напряжение питания от 2,7 В и выше) либо 1,1 В (с минимальным напряжением питания 1,8 В).
      • двухпроводной интерфейс TWI, совместимый с I²C;
      • универсальный синхронно/асинхронный приёмопередатчик UART/USART;
      • синхронный последовательный порт Serial Peripheral Interface (SPI).

      Примечание: не все периферийные устройства могут быть включены программно. Некоторые из них предварительно должны быть активированы битами в регистрах Fuses, которые могут быть изменены только программатором.

      ATtiny2313 — низкопотребляющий AVR микроконтроллер фирмы ATMEL с 2 КБ Flash памяти, программируемой в системе

      ATtiny2313 — 8-битный КМОП микроконтроллер с AVR RISC архитектурой. Выполняя команды за один цикл, ATtiny2313 достигает производительности 1 MIPS при частоте задающего генератора 1 МГц, что позволяет разработчику оптимизировать отношение потребления к производительности.

      Технические характеристики: 2 КБ программируемой в системе Flash память программы, 128 байтную EEPROM память данных, 128 байтное SRAM (статическое ОЗУ), 18 линий ввода-вывода общего применения, 32 рабочих регистра общего назначения, однопроводный интерфейс для встроенного отладчика, два гибких таймера/счетчика со схемами сравнения, внутренние и внешние источники прерывания, последовательный программируемый USART, универсальный последовательный интерфейс с детектором стартового условия, программируемый сторожевой таймер со встроенным генератором и три программно инициализируемых режима пониженного потребления.

      В режиме Idle останавливается ядро, но ОЗУ, таймеры/счетчики и система прерываний продолжают функционировать. В режиме Power-down регистры сохраняют свое значение, но генератор останавливается, блокируя все функции прибора до следующего прерывания или аппаратного сброса. В Standby режиме задающий генератор работает, в то время как остальная часть прибора бездействует. Это позволяет очень быстро запустить микропроцессор, сохраняя при этом в режиме бездействия мощность.

      Высокоплотная энергонезависимая память ИС обеспечивается технологией изготовления памяти компании ATMEL. Встроенная ISP Flash позволяет перепрограммировать память программы в системе через последовательный SPI интерфейс или обычным программатором энергонезависимой памяти. Объединив в одном кристалле 8-битное RISC ядро с самопрограммирующейся в системе Flash памятью, ATtiny2313 стал мощным микроконтроллером, который дает большую гибкость разработчику микропроцессорных систем.

      AVR RISC архитектура:
      — 120 команд, большинство которых выполняется за один тактовый цикл,
      — 32×8-битных рабочих регистра общего применения,
      — полностью статическая архитектура;
      Энергонезависимая память программ и данных:
      — 2 КБ самопрограммируемой в системе Flash памяти программы, обеспечивающей 10 000 циклов записи/стирания,
      — 128 байт программируемой в системе EEPROM памяти данных, обеспечивающей 100 000 циклов записи/стирания,
      — 128 байт встроенной SRAM памяти,
      — программируемая защита от считывания Flash памяти программы и EEPROM памяти данных;
      Периферия:
      — один 8-разрядный таймер/счетчик с отдельным предделителем,
      — один 16-разрядный таймер/счетчик с отдельным предделителем, схемой сравнения, схемой захвата и двумя каналами ШИМ,
      — встроенный аналоговый компаратор,
      — программируемый сторожевой таймер со встроенным генератором,
      — USI — универсальный последовательный интерфейс,
      — полнодуплексный UART;
      Специальные характеристики микроконтроллера:
      — встроенный отладчик debugWIRE,
      — внутрисистемное программирование через SPI порт,
      — внешние и внутренние источники прерывания,
      — режимы пониженного потребления Idle, Power-down и Standby,
      — усовершенствованная схема формирования сброса при включении,
      — программируемая схема обнаружения кратковременных пропаданий питания,
      — встроенный откалиброванный генератор;
      Порты ввода-вывода и корпусное исполнение:
      — 18 программируемых линий ввода-вывода,
      — 20-выводной PDIP, 20-выводной SOIC и 20-контактный MLF корпус;
      Диапазон напряжения питания:
      — 1,8 — 5,5 В (ATtiny2313V),
      — 2,7 — 5,5 В (ATtiny2313);
      Рабочая частота:
      — ATtiny2313V: 0-4 МГц @ 1,8-5,5 В, 0-10 МГц @ 2,7-5,5 В,
      — ATtiny2313: 0-10 МГц @ 2,7-5,5 В, 0-20 MHz @ 4,5-5,5 В;
      Потребление
      — Активный режим: 300 мкА при частоте 1 МГц и напряжении питания 1,8 В,
      20 мкА при частоте 32 кГц и напряжении питания 1,8 В,
      — Режим пониженного потребления
      0.5 мкА при напряжении питания 1,8 В.

      16-битный таймер в режиме AVR CTC

      Я пытаюсь достичь этого с помощью платы Arduino Uno ( ATmega328 , 16 MHz)., поэтому я поискал в интернете и придумал что-то вроде этого:

      Я пытаюсь достичь частоты 1 kHz,, чтобы иметь возможность создавать интервалы длиной в пару миллисекунд.

      Вот почему я выбрал значение сравнения равным 15999 (то есть 16000-1), а прескалер-равным 1, так что я получаю (по крайней мере, то, что я считаю правильным вычислением):

      Проблема теперь в том, что, хотя Serial.println(TCNT1) показывает мне числа, подсчитанные до 16000, обратно к нулю, до 16000, обратно к нулю. Serial.println(Time) просто считает до 8, и он просто перестает считать, хотя TCNT1 все еще считает.

      Я думал о каком-то переполнении где — то, но я не мог думать о том, где; единственное, что я пришел к выводу, что значение сравнения может быть слишком большим, что-как я думаю-очевидно, не так, так как 2^16 -1=65.535>15999 .

      Если я, например, сделаю прескалер, скажем 64, и оставлю значение сравнения, Time будет считаться ожидаемым. Поэтому мне интересно: почему ISR() перестает вызываться при значении 8, но работает при вызове прескалера?

      2 ответа

      • Почему загрузчики для x86 сначала используют 16-битный код?

      Я читал какой-то код загрузчиков для x86. Первая часть этих загрузчиков обычно пишется с использованием газа. Они используют .code16, чтобы сказать газу генерировать 16-битный код. Однако я обнаружил, что 32-битный код исполняется в реальном режиме. Почему они используют 16-битный код? Является ли.

      Я должен создать 32-битный сумматор, но я не знаю, как создать 32-битный регистр из 8-битных регистров, которые используются AVR ATmega169 в assembly.

      Я не уверен, но в зависимости от версии Arduino, которую вы используете, вызов println будет заблокирован. Если вы вызовете его быстрее, чем он может завершиться в вашем ISR, стек переполнится.

      Если вы хотите получить более высокое разрешение, возможно, попробуйте изменить результат getMicroseconds в вашем Loop() . Вы должны циклировать в Loop() гораздо быстрее, чем один раз в миллисекунду.

      Если вы хотите сделать что-то один раз в миллисекунду, захватите начальные микросекунды, а затем вычтите их из текущих микросекунд в условном выражении в вашей функции Loop() . Когда вы увидите более 1000, выполните задание.

      Похоже, что разрешение таймера было слишком большим для моего Arduino Uno (16 MHz). Выбор более низкого разрешения (т. е. более высокого значения сравнения) исправил проблему для меня.

      Похожие вопросы:

      Я смотрел на битовое описание режима генерации сигналов в таблице данных Atmega328. У меня есть два сомнения. 1. Что такое обновление OCRx at (помечено 1 на прилагаемом изображении). OCRx пишется.

      Я хотел бы знать, как мы можем варьировать рабочий цикл в режиме CTC в микроконтроллере AVR. В режиме CTC частота может быть изменена с помощью регистра OCR0A (Timer0), предполагающего некоторое.

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

      Я читал какой-то код загрузчиков для x86. Первая часть этих загрузчиков обычно пишется с использованием газа. Они используют .code16, чтобы сказать газу генерировать 16-битный код. Однако я.

      Я должен создать 32-битный сумматор, но я не знаю, как создать 32-битный регистр из 8-битных регистров, которые используются AVR ATmega169 в assembly.

      У меня есть AVR MCU. Сейчас я играю с таймером. Что мне нужно ? У меня есть таймер, отсчитывающий с некоторой частотой. В каждом прерывании я увеличиваю переменную, и где-то мне нужно проверить.

      У меня есть чип atmega168a. Я использую Counter 0 для переключения PORTC с помощью подпрограмм прерывания ISR(TIMER0_COMPA_vect) и ISR(TIMERB_COMPA_vect) . Я хотел бы активировать 16-bit timer .

      Я попытался создать прерывание таймера CTC на своей плате ATmega32U4 leonardo. Когда я постоянно проверяю значение OCF1A , у меня нет проблем с обнаружением, когда выход достигает желаемого.

      Я новичок в программировании устройств AVR, в попытке отойти от неэффективных функций блокировки _ms_delay() и _us_delay() я пробовал программировать с помощью встроенных таймеров для управления.

      Я изучаю Программирование AVR, используя книгу под названием Make: AVR programming. Я пытался понять, что происходит на периферии. То, что делает следующая программа, — это переключение pin-кода с.

      голоса
      Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector