Конфигурирование портов ввода/вывода
Как уже было отмечено, порты имеют всего две возможности по конфигурированию: - задание направления передачи данных (вход или выход); - подключение/отключение внутреннего подтягивающего резистора. Направление передачи данных определяется содержимым регистра передачи данных DDRx. Если разряд DDRхn - этого регистра установлен в "1", соответствующий n-й вывод порта является выходом. Если же разряд DDRxn этого регистра сброшен в "0", соответствующий вывод порта является входом. А вот управление подтягивающим резистором осуществляется с помощью регистра данных порта PORTx. Если разряд Рхn регистра PORTx установлен в "1" и соответствующий вывод порта является входом, между этим выводом и проводом питания подключается подтягивающий резистор. Чтобы отключить подтягивающий резистор, необходимо либо сбросить соответствующий разряд регистра PORTx, либо сделать вывод порта выходом.
Таблица 3.3 – Влияние регистров DDRx и PORTx на конфигурацию выводов портов
Примеры конфигурирования Предположим, что все выводы 8-разрядного порта А определены как выходы и требуется установить младшие 4 разряда в "1", а старшие 4 разряда – в "0". Это можно осуществить путем записи в этот порт соответствующего значения, как показано ниже.
; Программа вывода числа 0Fh из порта А include "8515def.inc" rjmp RESET ;Reset Handle ;------------------------------------------------------------------- RESET: ;задание направления передачи ldi r 0,$ FF ;запись числа F Fh в регистр r 0 out DDRA , r 0 ;запись числа F Fh в регистр DDRA ;запись числа 0Fh в порт А ldi r0,$0F ;запись числа 0Fh в регистр r 0 out PORTA ,r0 ;запись числа 0Fh в порт А (0..3=«1», 4. .7=«0»)
Теперь предположим, что все выводы порта А определены как входы и требуется узнать их состояние. Это осуществляется следующим образом:
;Программа чтения состояния выводов порта А include "8515 def . inc " rjmp RESET ;Reset Handle ;------------------------------------------------------------------- RESET: ;задание направления передачи ldi r 0,$ FF out DDRA , r 0 ;запись числа 0Fh в порт А ldi r0,$0F ;запись числа 0Fh в регистр r 0 out PORTA ,r0 ;запись числа 0Fh в порт А (0..3=«1», 4. .7=«0») ;формирование задержки nop ;пустая операция in r 0, PINA ;в регистре r 0 - сигналы на выводах порта А Приведенные примеры сознательно упрощены. Все выводы используются либо только как входы, либо только как выходы. Разумеется, можно задать конфигурацию каждого вывода независимо от остальных, так что в одном порту будут находиться одновременно как входы, так и выходы.
Исследование таймера
Большинство задач управления, которые реализуются с помощью МК, требуют исполнения их в реальном времени. Под этим понимается способность системы получить информацию о состоянии управляемого объекта, выполнить необходимые расчетные процедуры и выдать управляющие воздействия в течение интервала времени, достаточного для желаемого изменения состояния объекта. Возлагать функции формирования управления в реальном масштабе времени только на центральный процессор неэффективно, так как это занимает ресурсы, необходимые для расчетных процедур. Поэтому в большинстве современных МК используется аппаратная поддержка работы в реальном времени с использованием таймера (таймеров). Модули таймеров служат для приема информации о времени наступления тех или иных событий от внешних датчиков событий, а также для формирования управляющих воздействий во времени. Рассмотрим принципы построения и режимы работы таймеров на примере восьмиразрядных универсальных микроконтроллеров AVR семейства Classic.
3.4.1 Таймеры микроконтроллеров AVR семейства Classic Микроконтроллеры семейства Classic, в зависимости от модели, имеют в своем составе от одного до трех таймеров общего назначения – T0, T1, T2 и один сторожевой таймер WDT, обеспечивающий перезапуск микроконтроллера при зацикливании программ. В таблице 3.4 приведен состав таймеров микроконтроллеров семейства Classic, а в таблице 3.5 – выводы, используемые таймерами. 8-разрядный таймер Т0 имеется во всех моделях. Он может использоваться только для отсчета и измерения временных интервалов или как счетчик внешних событий. При переполнении счетного регистра таймера генерируется запрос на прерывание. 16-разрядный таймер Т1 и 8-разрядный таймер Т2 за счет введения дополнительных аппаратных средств входного захвата (input capture – IС) и выходного сравнения (output compare – ОС) обладают более широкими возможностями реализации алгоритмов реального времени. Эти таймеры также могут использоваться в качестве широтно-импульсных модуляторов. Таймер Т2, кроме того, может работать в асинхронном (относительно тактового сигнала микроконтроллера) режиме. В микроконтроллере АТ90С8534 8-разрядный таймера/счетчика Т0 и 16-разрядный Т1 функционально идентичны и могут использоваться только для формирования временных интервалов.
Каждый таймер/счетчик (кроме таймеров/счетчиков в АТ90С8534) использует один или более выводов портов ввода/вывода микроконтроллера. При совместном использовании линий портов ввода/вывода с таймерами/счетчиками необходимо самостоятельно сконфигурировать выводы в соответствии с их функциональным назначением (вход/выход).
Таблица 3.5 – Выводы, используемые таймерами/счетчиками
* Выделенный вывод микроконтроллера (не линия порта ввода/вывода).
3.4.2 Таймер Т0 8-разрядный таймер/счетчик Т0 может использоваться для формирования временных интервалов или для подсчета числа внешних событий. Структурная схема таймера Т0 приведена на рисунке 3.5. В состав таймера входят: регистр управления (TCCR0); счетный регистр (TCNT0); блок управления таймером. Флаг переполнения счетного регистра таймера T0V0 находится в регистре флагов прерываний таймеров TIFR. Разрешение и запрещение прерываний от таймера Т0 осуществляются установкой/сбросом флага T0IE0 регистра TIMSK. Счетный регистр таймера TCNT0 доступен в любой момент времени как для чтения, так и для записи. При записи в регистр TCNT0 во время работы таймера счет будет продолжен в следующем за командой записи машинном цикле. После подачи напряжения питания в регистре TCNT0 находится нулевое значение.
Рисунок 3.5 – Структурная схема таймера/счетчика Т0
При переходе таймера из состояния "$FF" в состояние "$00" устанавливается флаг T0V0 регистра TIFR и генерируется запрос на прерывание. Разрешение прерывания осуществляется установкой в "1" разряда T0IE0 регистра TIMSK при установленном флаге общего разрешения прерываний I регистра SREG. Таймер Т0 может работать в двух режимах: 1. Режим таймера. В этом режиме на вход таймера поступают импульсы тактового сигнала микроконтроллера (непосредственно или через предделитель). 2. Режим счетчика событий. В этом режиме инкремент содержимого счетного регистра производится по активному фронту сигнала на входе ТО микроконтроллера. Выбор режима работы (источника тактового сигнала), а также запуск и остановка таймера осуществляются с помощью разрядов CS02...CS00 регистра управления таймером TCCR0 (рисунок 3.6), расположенного по адресу $33 ($53). Соответствие между состоянием этих разрядов и режимом работы таймера/счетчика приведено в таблице 3.6. Остальные разряды регистра доступны только для чтения и содержат "0". При использовании таймера в режиме счета внешних событий необходимо помнить, что сигнал, присутствующий на выводе Т0, синхронизируется с частотой тактового генератора микроконтроллера (состояние вывода Т0 считывается по нарастающему фронту внутреннего тактового сигнала). Поэтому для обеспечения корректной работы таймера от внешнего сигнала промежуток времени между соседними импульсами должен быть больше периода тактового сигнала микроконтроллера.
Обратите внимание, что инкремент содержимого счетного регистра таймера/счетчика при работе в режиме счета внешних событий производится даже в том случае, если вывод Т0 сконфигурирован как выход. Эта особенность дает пользователю возможность программно управлять процессом счета.
3.4.3 Таймер Т1 16-разрядный таймер/счетчик Т1 реализует следующие функции: - формирование временных интервалов (аналогично функции таймера Т0); - подсчет числа внешних событий (аналогично функции таймера Т0); - входной захвата (input capture – IС) – сохранение текущего состояния таймера в отдельном РВВ по внешнему сигналу; - выходного сравнения (output compare – ОС) – формирование прерывания при равенстве содержимого счетного регистра заданному значению; - генерация ШИМ-сигнала. Существует три варианта рассматриваемого таймера/счетчика в зависимости от модели микроконтроллера. Рассмотрим структуру таймера Т1 микроконтроллера AT90S8515 (рисунок 3.7). В состав таймера входят четыре 16-разрядных регистра (счетный регистр TCNT1, регистр захвата ICR1, регистры сравнения OCR1А и OCR1В), 16-разрядный компаратор, два 8-разрядных управляющих регистра TCCR1А и TCCR1B, а также блок управления таймером. Два других варианта имеют сокращенный набор устройств. Все флаги состояния таймера/счетчика (переполнения, совпадения и захвата) находятся в регистре флагов прерываний от таймеров TIFR, а разрешение/запрещение прерываний от таймера осуществляется установкой/сбросом соответствующих флагов регистра TIMSK. Счетный регистр таймера Т1 реализован как суммирующий (в режиме ШИМ — как суммирующий/вычитающий) счетчик и доступен в любой момент времени как для чтения, так и для записи. При записи в регистр TCNT1 во время работы таймера счет будет продолжен по следующему за операцией записи импульсу тактового сигнала таймера/счетчика. После подачи напряжения питания в регистре TCNT1 находится нулевое значение.
Примечание: Позиции разрядов регистров TIMSK и TIFR показаны условно Рисунок 3.7 – Структурная схема таймера Т1
Физически регистр TCNT1 размещен в двух регистрам TCNT1H:TCNT1L, расположенных по адресам $2D:$2C (адреса в адресном пространстве ОЗУ, соответственно, $4D:$4C). Чтобы при обращении ЦПУ микроконтроллера к этим регистрам запись или чтение обоих байтов содержимого счетного регистра происходило одновременно, обращение производится с использованием специального 8-разрядного регистре TEMP (этот регистр используется только процессором и программно недоступен). Этот же регистр используется и при обращении к остальным 16-разрядным регистрам таймера/счетчика Tl: OCR1 (OCR1A и OCR1B) и ICR1. Прерывания на время обращения к любому из этих регистров должны быть запрещены. Запись в регистр TCNT1.При записи старшего байта значения в регистр TCNT1H он помещается в регистр TEMP. Далее, при записи младшего байта в регистр TCNT1L он объединяется с содержимым регистра TEMP и оба байта записываются в регистр TCNT1 одновременно. Из сказанного видно, что для выполнения полного цикла записи в 16-разрядный регистр первым должен быть загружен старший байт (регистр TCNT1H). Чтение регистра TCNT1. При чтении регистра TCNT1L (младший байт) содержимое регистра TCNT1H пересылается в регистр TEMP. А при последующем чтении регистра TCNT1H возвращается значение, сохраненное в регистре TEMP. Следовательно, для выполнения полной операции чтения 16-разрядного регистра первым должен быть прочитан младший байт (регистр TCNT1L). Управление таймером/счетчиком Т1 осуществляется с помощью двух регистров управления TCCR1A и TCCR1B (в модели АТ90С8534 — с помощью одного регистра TCCR1). Эти регистры расположены по адресам $2F ($4F) (регистр TCCR1A) и $2Е ($4Е) (регистры TCCR1B, TCCR1). Формат регистра TCCR1A приведен на рисунке 3.8, а регистров TCCR1B и TCCR1 — на рисунке 3.9. Неиспользуемые разряды регистров доступны только для чтения.
|
2019-10-11 | 567 | Обсуждений (0) |
5.00
из
|
Обсуждение в статье: Конфигурирование портов ввода/вывода |
Обсуждений еще не было, будьте первым... ↓↓↓ |
Почему 1285321 студент выбрали МегаОбучалку...
Система поиска информации
Мобильная версия сайта
Удобная навигация
Нет шокирующей рекламы