Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Периферийные устройства МК. Аппаратные функции МК.
В современных микроконтроллерах помимо процессора, который можно сравнить с ядром микроконтроллера, существует еще большое количество периферийных устройств, связанных с процессором. Использование периферийных устройств позволяет упростить реализацию тех или иных функций управления, позволяет не использовать вычислительные ресурсы процессора для решения некоторых задач. Количество выводов общего назначения в совокупности с разветвленностью периферийных устройств МК – основные составляющие стоимости современных контроллеров. В данной главе будут рассмотрены некоторые аппаратные функции МК (аппаратные – не задействующие ресурсов процессора). Прерывание Прерывание (англ. interrupt) — сигнал, сообщающий процессору о наступлении какого-либо события. При этом выполнение текущей последовательности команд приостанавливается и управление передаётся обработчику прерывания, который реагирует на событие и обслуживает его, после чего возвращает управление в прерванный код.
В зависимости от источника возникновения сигнала прерывания делятся на: асинхронные или внешние (аппаратные) — события, которые исходят от внешних источников (например, периферийных устройств) и могут произойти в любой произвольный момент: сигнал от таймера, сетевой карты или дискового накопителя, нажатие клавиш клавиатуры, движение мыши; внутренние — события в самом процессоре как результат нарушения каких-то условий при исполнении машинного кода: деление на ноль или переполнение, обращение к недопустимым адресам или недопустимый код операции; программные (частный случай внутреннего прерывания) — инициируются исполнением специальной инструкции в коде программы. Программные прерывания как правило используются для обращения к функциям встроенного программного обеспечения (firmware), драйверов и операционной системы. Маскирование В зависимости от возможности запрета внешние прерывания делятся на: маскируемые — прерывания, которые можно запрещать установкой соответствующих битов в регистре маскирования прерываний (в x86-процессорах — сбросом флага IF в регистре флагов); немаскируемые (англ. Non maskable interrupt, NMI) — обрабатываются всегда, независимо от запретов на другие прерывания. К примеру, такое прерывание может вызвать сбой в микросхеме памяти. Обработчики прерываний обычно пишутся таким образом, чтобы время их обработки было как можно меньшим, поскольку на время их работы могут не обрабатываться другие прерывания, а если их будет много (особенно от одного источника), то они могут теряться. Приоритезация До окончания обработки прерывания обычно устанавливается запрет на обработку этого типа прерывания, чтобы процессор не входил в цикл обработки одного прерывания. Приоритезация означает, что все источники прерываний делятся на классы и каждому классу назначается свой уровень приоритета запроса на прерывание. Приоритеты могут обслуживаться как относительные и абсолютные. Относительное обслуживание прерываний означает, что если во время обработки прерывания поступает более приоритетное прерывание, то это прерывание будет обработано только после завершения текущей процедуры обработки прерывания. Абсолютное обслуживание прерываний означает, что если во время обработки прерывания поступает более приоритетное прерывание, то текущая процедура обработки прерывания вытесняется, и процессор начинает выполнять обработку вновь поступившего более приоритетного прерывания. После завершения этой процедуры процессор возвращается к выполнению вытесненной процедуры обработки прерывания. Перехват прерывания — изменение обработчика прерывания на свой собственный. Вектор прерывания — закреплённый за устройством номер, который идентифицирует соответствующий обработчик прерываний. Векторы прерываний объединяются в таблицу векторов прерываний. Местоположение таблицы зависит от типа и режима работы процессора. Программное прерывание — синхронное прерывание, которое может осуществить программа с помощью специальной инструкции.
Аппаратные прерывания Прерывание – операция, которая прекращает нормальный ход программы для выполнения приоритетной задачи, определяемой внутренним или внешним событием микроконтроллера. При возникновении прерывания микроконтроллер сохраняет в стеке содержимое счетчика команд PC и загружает в него адрес соответствующего вектора прерывания. По этому адресу, как правило, находится команда безусловного перехода к подпрограмме обработки прерывания. Последней командой подпрограммы обработки прерывания должна быть команда RETI, которая осуществляет возврат в основную программу и восстановление предварительно сохраненного счетчика команд. Иными словами при возникновении события, которое может вызвать разрешенное в данный момент времени прерывание (список таких событий приведен в описании МК, в разделе «Interrupts» (таблица " Reset and Interrupt Vectors" )) и при глобальном разрешении прерываний (бит7 в регистре SREG " установлен" ), выполнение программы МК останавливается, сохраняются (запоминаются) место остановки и некоторые нужные данные, бит7 в регистре SREG обнуляется, очищается флаг сработавшего прерывания и затем происходит вызов и выполнение функции обработчика данного прерывания. Поскольку основными источниками прерываний являются различные периферийные устройства микроконтроллеров, количество прерываний зависит от конкретной модели. Аппаратные прерывания (interrupts) – очень важная функция МК. Она используется в тех случаях, когда необходима максимально быстрая реакция на те или иные события (приход данных по каналу связи, например, USART, завершение АЦП, переполнение таймера и т.д.). От момента наступления события до начала выполнения функции обработчика прерывания проходит не менее 4 тактов процессора. Т.е. скорость реакции на прерывание напрямую зависит от частоты, на которой работает МК. В МК ATtmega за обработку прерываний отвечает регистр под названием SREG. Биты этого регистра отвечают как за отдельные прерывания, так и за прерывания в целом. Бит7 данного регистра называется " I ". Если этот бит равен " 1" (установлен), то глобально разрешены прерывания – значит, могут возникать разрешенные индивидуально прерывания. Если этот бит равен " 0" (бит сброшен, очищен), то глобально запрещены прерывания – значит, любые события не вызывают прерывания программы. Флаг прерывания - это просто бит, который становится " 1" (устанавливается) при возникновении события, которое может вызвать прерывание независимо от того разрешены ли прерывания глобально (установленным битом 7 в SREG) или индивидуально - т.е. флаг устанавливается даже если прерывание не обрабатывалось программой и не было разрешено. Если программа находится в функции обработчике прерывания и в этой функции не был установлен бит SREG.7, то другие события, вызывающие прерывания, не могут уже вызвать прерывание программы и их обработку. Иными словами, если при обработке прерывания был сброшен бит регистра SREG.7, то прерывания, возникающие в этот момент времени, обрабатываться не будут. Функции – обработчики прерываний стремятся сделать как можно более простыми, поскольку при сложной функции – обработчике прерываний, может возникнуть ситуация накопления прерываний, и МК не будет успевать возвращаться в основную программу. Таким образом, одной из важнейших проблем при использовании аппаратных прерываний является проблема организации четкого алгоритма программы, а также продумывания действий МК во времени. Если возникнет несколько разрешенных прерываний одновременно, то первым будет выполняться то, которое выше в списке векторов прерываний МК в таблице " Reset and Interrupt Vectors" описания МК. Соответственно по мере отработки накопившихся и разрешенных прерываний их флаги будут очищаться. В то же время флаги неразрешенных прерываний не очистятся пока программа этого не сделает записью в них числа 0. Прерывания могут быть разрешены или запрещены как индивидуально, так и все сразу (глобально). Для того, чтобы глобально запретить прерывания можно использовать команду #asm(" cli" ), чтобы глобально разрешить прерывания - #asm(" sei" ). В управляющих программах, как правило, сразу после начала процедуры main прерывания запрещаются глобально и разрешаются только после первоначальной конфигурации МК. Это связано с тем, что прерывание может возникнуть уже на этапе первоначальной настройки МК, что может привести к неправильной работе устройства или даже выходу устройства из строя. В МК AVR и других, прерывания могут возникать по многим событиям: - изменение уровня на некоторых ножках МК - " 0" на некоторых ножках МК - переполнение таймеров - " насчитывание" таймером определенного значения - завершение АЦП преобразования - изменение уровня на выходе компаратора - события в USART и т.д. Пример объявления функций обработки прерываний в CodeVision: interrupt [прерывание] void adc_isr(void) { код выполняемый при возникновении прерывания, разрешенного локально (значит, индивидуально - в данном примере это прерывание по завершении АЦП) и если прерывания разрешены глобально - т.е. бит I в SREG установлен. } В заключение следует отметить, что все прерывания могут быть легко настроены с использованием ГНК компилятора. Механизм настройки и работы прерываний будет рассмотрен в примере под названием «Обработка прерываний. Работа с таймерами», а также в последующих разделах книги. Таймеры Таймер (от англ. Timer) — в информатике средство обеспечения задержек и измерения времени средствами компьютера. Главной характеристикой таймера является его точность — минимальный гарантированно выдерживаемый интервал времени. По этому параметру таймеры делят на: малоточные (ошибка измерения может достигать 0, 1 с) точные (ошибка измерения не превышает 0, 001 с) сверхточные (ошибка измерения не превышает 10− 6 c)
Существуют два вида таймеров: Аппаратные таймеры функционируют независимо от центрального процессора и в момент срабатывания посылают прерывание. Программные таймеры реализуются за счёт выполнения в цикле заданного количества одинаковых «пустых» операций. При фиксированной частоте работы процессора это позволяет точно определять прошедшее время. Главными минусами такого метода являются: зависимость количества итераций цикла от типа и частоты процессора, невозможность выполнения других операций во время задержки.
Сторожевой таймер (контрольный таймер, англ. Watchdog timer) — аппаратно реализованная схема контроля за зависанием системы. Представляет собой таймер, который периодически сбрасывается контролируемой системой. Если сброса не произошло в течение некоторого интервала времени, происходит принудительная перезагрузка системы. В некоторых случаях сторожевой таймер может посылать системе сигнал на перезагрузку («мягкая» перезагрузка), в других же — перезагрузка происходит аппаратно (например, замыканием контактов кнопки Reset). Автоматизированные системы, не использующие оператора человека, хотя тоже подвержены ошибкам, зависаниям и другим сбоям (в т.ч. аппаратным), с использованием сторожевых таймеров увеличивают стабильность работы - нет необходимости ручного сброса. Поэтому наиболее частое использование их — встроенные системы различного назначения. В МК 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, можно определить, что нажата кнопка. С таймером вроде все понятно. Но для чего он используется? Рассмотрим бесконечный цикл while(1) в main(). В этом цикле проверяется состояние кнопок путем анализа содержимого регистра PINB. А зачем там стоит задержка на 50 мс? Это устранение т. н. «дребезга клавиш». Дело в том, что при нажатии на кнопку происходит удар одного контакта о другой, и, поскольку контакты металлические, удар этот упругий. Контакты, пружиня, замыкаются и размыкаются несколько раз, несмотря на то, что палец сделал лишь одно нажатие. Это приводит к тому, что МК фиксирует несколько нажатий. Давайте рассмотрим график зависимости напряжения на выходе PC0 от времени. Он может выглядеть так: Точка А – момент нажатия кнопки. Он может быть зафиксирован МК. Затем идут несколько замыканий и размыканий (их может и не быть, а может быть и 12 штук – это явление можно считать случайным). В точке B контакт уже надежно зафиксирован. Между A и B в среднем около 10 мс. Наконец, в точке D происходит размыкание. Как же избавиться от этого неприятного явления? Оказывается, очень просто. Нужно зафиксировать момент нажатия кнопки (точка А), через какое-то время, например, 50 мс (точка С) проверить, что кнопка действительно нажата, сделать действие, соответствующее этой кнопке и ждать момент ее отпускания (точка D). То есть нужно сделать паузу от А до С, такую, чтобы весь «дребезг» оказался внутри этой паузы. А попробуйте теперь убрать строчку, формирующую задержку, откомпилировать программу и зашить ее в МК. Путем простых нажиманий на кнопки сможете легко убедиться, что все эти «мучения» не были напрасными. А что же делать, если к МК нужно подключить, скажем, 40 кнопок? Ведь у него всего лишь 32 вывода. Казалось бы, никак. На самом деле это возможно. В таком случае используют алгоритм, называемый стробированием. Для этого нужно кнопки соединить в виде матрицы, как это показано на рисунке (рисунок взят из книги Мортона «МК AVR, вводный курс», где написано про программирование AVR на ассемблере). При подаче на вывод PB0 лог. 1 (+5В), а на выводы PB1 и PB2 лог. 0 разрешается обработка кнопок 1, 4 и 7. После этого состояние каждой из них можно узнать, проверив напряжение на одном из выводов PB3..PB5. Таким образом, подавая последовательно на выводы PB0..PB2 лог. 1, можно определить состояние всех кнопок. Понятное дело, что выводы PB0..PB2 должны быть выходами, а PB0..PB2 входами. Чтобы определить, какое количество выводов потребуется для массива из Х кнопок, нужно найти пару сомножителей Х, сумма которых наименьшая (для нашего случая с 40 кнопками это будут числа 5 и 8). Это означает, что к одному МК можно подключить до 256 кнопок (а с применение дешифраторов и того больше, но о дешифраторах потом). Лучше сделать меньшее число выводов выходами, а большее – входами. В этом случае опрос всех строк матрицы займет меньше времени. Подобный способ подключения (стробирование) свойственен не только для кнопок. Там можно подключать самые разнообразные устройства, начиная от матриц светодиодов и заканчивая микросхемами flash-памяти.
Таймеры являются одним из важнейших и наиболее часто использующихся устройств периферии МК. В электронных устройствах таймеры могут выполнять несколько функций, например, использоваться для отсчета и измерения временных интервалов, как счетчики внешних событий, как модуляторы ШИМ сигналов, как часы реального времени (асинхронный режим работы). Количество таймеров зависит от конкретной модели МК. Микроконтроллеры семейства в зависимости от модели имеют в своем составе от двух до шести таймеров/счетчиков общего назначения.
Таблица 2. Таймеры/счетчики общего назначения
Как видно из таблицы, во всех МК семейства есть, по крайней мере, 2 таймера/счетчика общего назначения – T0 и T1. Таймер/счетчик T0 имеет минимальный набор функций, который, тем не менее, зависит от модели МК. В одних моделях он может использоваться только для отсчета и измерения временных интервалов или как счетчик внешних событий. В других моделях к этим функциям добавляется возможность генерации сигналов с широтно-импульсной модуляцией (ШИМ) фиксированной разрядности (один или два канала), а также возможность работать в асинхронном режиме в качестве часов реального времени (в моделях ATmega64x/128x). Таймер/счетчик Т1 тоже может использоваться для отсчета временных интервалов и как счетчик внешних событий. Кроме того, он может осуществлять запоминание своего состояния по внешнему сигналу. Как и таймер/счетчик ТО, он может работать в качестве 2- или 3-канального широтно-импульсного модулятора, но уже переменной разрядности. Количество каналов ШИМ зависит от модели. Таймер/счетчик Т2 практически полностью аналогичен таймеру/счетчику ТО. Во всех моделях, кроме ATmega64x/128x, таймер/счетчик Т2 может работать в асинхронном режиме. Таймеры/счетчики ТЗ...Т5 по функциональным возможностям идентичны таймеру/счетчику Т1. В составе всех микроконтроллеров семейства имеется также сторожевой таймер, являющийся непременным атрибутом всех современных микроконтроллеров. Этот таймер позволяет избежать несанкционированного зацикливания программы, возникающего по тем или иным причинам, таким образом, сторожевой таймер может использоваться для защиты МК от зависания. Каждый таймер/счетчик использует один или более выводов микроконтроллера. Как правило, эти выводы — линии портов ввода/вывода общего назначения, а функции, реализуемые этими выводами при работе совместно с таймерами/счетчиками, являются их альтернативными функциями. Все выводы микроконтроллеров, используемые таймерами/счетчиками общего назначения, приведены в спецификации контроллера. Там же указаны функции этих выводов. При этом следует помнить, что при использовании альтернативных функций линий портов ввода/вывода, необходимо, как правило, самостоятельно сконфигурировать эти выводы в соответствии с их функциональным назначением. При использовании компилятора Code Vision настройка таймеров на тот или иной режим работы, а также конфигурация выводов МК может быть осуществлена интерактивно с помощью ГНК. Алгоритм работы с таймерами предполагает использование прерываний, например, при переполнении таймера. В старых моделях для разрешения/запрещения прерываний от таймеров/счетчиков использовалось от одного до двух регистров ввода/вывода. В новых моделях число таких регистров C...6) равно числу счетчиков в конкретной модели. Точно так же дело обстоит и с регистрами, содержащими флаги прерываний. Названия и адреса всех этих регистров можно узнать по соответствующим таблицам в описании МК. Здесь лишь отметим, что для разрешения какого-либо прерывания от таймера/счетчика необходимо установить в 1 соответствующий бит регистра TIMSK (TIMSKn) /ETIMSK и, разумеется, флаг I регистра SREG. Конкретное название регистра, отвечающего за прерывание для того или иного таймера, также можно найти в описании используемого в конструкции МК. |
Последнее изменение этой страницы: 2019-03-20; Просмотров: 402; Нарушение авторского права страницы