Программирование AVR GPIO и альтернативные функции порта Fri, December 13 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


GPIO и альтернативные функции порта Печать
Добавил(а) microsin   

В этой статье описан принцип работы порта как GPIO и совмещения на нем дополнительных (альтернативных) функций, привязанных к различным периферийным устройствам (UART, TWI, SPI и т. д.) на примере популярного микроконтроллера ATmega328P (перевод из даташита). Многое, о чем говорится в этой статье, может быть практически без изменений перенесено на другие модели микроконтроллеров семейства Atmel AVR.

Все внешние выводы портов AVR имеют функционал Read-Modify-Write (т. е. совмещенная в одной инструкции операция чтение-модификация-запись), когда вывод работает как обычный цифровой порт ввода/вывода (I/O, или GPIO). Это означает, что направление работы одной ножки порта (вход это или выход) можно поменять (с помощью инструкций SBI и CBI) без нежелательных изменений направления работы других выводов. То же самое справедливо, когда программно меняется значение лог. уровня ножки выхода порта (если она сконфигурирована как выход), или когда разрешается или запрещается наличие на ножке порта pull-up резистора (если ножка порта сконфигурирована как вход). Каждый выходной силовой буфер ножки порта обладает одинаковыми нагрузочными характеристиками по входному току (ток лог. 0) и по выходному току (ток лог. 1). Драйвер выхода достаточно мощный, чтобы напрямую управлять током светодиода (LED). На всех ножках портов можно индивидуально настроить наличие подключенного внутреннего верхнего нагрузочного (pull-up) резистора; будучи включенным, этот резистор подтягивает лог. уровень входа к напряжению питания (лог. 1). Также на всех ножках портов I/O имеются внутренние защитные диоды, подключенные на шины питания VCC и GND, см. рис. 14-1.

AVR-input-simply-sch

AVR-output-simply-sch

Рис. 14-1. Эквивалентная схема внутренней схемотехники ножки порта ввода/вывода AVR.

Вот краткая сводка по параметра ножки порта AVR (в диапазоне температур TA = -40°C .. 85°C):

Параметр
Значение Ед.
Максимальный выходной ток ножки порта 40 мА
Напряжение на ножке порта -0.5..VCC+0.5 V
Сопротивление pull-up резистора 20..50
Ток утечки по входу ≤1 μA

Подробнее про электрические характеристики порта см. даташит на микроконтроллер.

[Работа выводов в качестве GPIO]

Выводы портов микроконтроллера могут работать как двунаправленные цифровые сигналы ввода/вывода общего назначения (GPIO). Это означает, что логическое состояние ножки порта как выхода можно программно устанавливать либо в лог. 0, либо в лог. 1, и также можно читать состояние ножки порта, настроенного либо на вход, либо на выход. В режиме работы как вход на ножке порта можно разрешить подключение внутреннего верхнего нагрузочного резистора (pull-up). На рис. 14-2 показано функциональное описание одного вывода порта I/O, где вывод обозначен для общего случая как Pxn (вместо x подставляется буква порта A, B, C, D и т. д., а вместо n подставляется номер разряда порта 7..0).

AVR General Digital IO sch

Рис. 14-2. Внутреннее устройство цифрового порта ввода/вывода.

Примечание: WRx, WPx, WDx, RRx, RPx и RDx являются общими для всех выводов в пределах одного и того же порта (A, B, C, D и т. д.). Сигналы clkI/O, SLEEP и PUD являются общими для всех портов.

PUD: PULLUP DISABLE
SLEEP: SLEEP CONTROL
clkI/O: I/O CLOCK
WDx: WRITE DDRx
RDx: READ DDRx
WRx: WRITE PORTx
RRx: READ PORTx REGISTER
RPx: READ PORTx PIN
WPx: WRITE PINx REGISTER

Конфигурирование ножки порта. К каждому выводу порта привязана три бита регистров: DDxn, PORTxn и PINxn (здесь указаны обобщенные имена, где x соответствует имени порта A, B, C и т. д., а n соответствует номеру разряда порта от 7 до 0). Как показано в описании регистров (DDRx, PORTx, PINx) ниже, к битам DDxn осуществляется доступ через адрес ввода/вывода DDRx, к битам PORTxn осуществляется доступ через адрес ввода/вывода PORTx, и к выводам PINxn осуществляется доступ через адрес ввода/вывода PINx.

Бит DDxn в регистре DDRx выбирает направление работы этого вывода. По умолчанию (после сброса или включения питания) в бит DDRx записан 0, и вывод порта работает как вход с отключенным pull-up резистором (находится в третьем состоянии). Если в DDxn записать лог. 1, то ножка порта Pxn конфигурируется как выход. Если в DDxn записать лог. 0, то вывод порта Pxn конфигурируется как вход.

Если в PORTxn записать лог. 1 когда вывод сконфигурирован как вход (DDxn=0), то на этом выводе активируется верхний нагрузочный резистор, встроенный в кристалл микроконтроллера (pull-up). Чтобы отключить резистор pull-up, в бит PORTxn записывается лог. 0. Либо можно сконфигурировать вывод как выход. Все выводы портов находятся в третьем (отключенном) состоянии с высоким сопротивлением, когда произошел сброса, даже если нет тактирования ядра микроконтроллера.

Если в PORTxn записать лог. 1, когда вывод сконфигурирован как выход (DDxn=0), то драйверы порта переведут его в состояние лог. 1 (при этом на выводе микросхемы микроконтроллера появится уровень, близкий к напряжению питания). Если в PORTxn записать лог. 0, когда вывод сконфигурирован как выход (DDxn=0), то драйверы порта переведут его в состояние лог. 0 (при этом на выводе микросхемы микроконтроллера будет очень малое напряжение, близкое к уровню GND).

Переключение вывода в противоположное состояние (toggling). Запись лог. 1 PINxn переключает значение PORTxn, независимо от значения DDRxn. Обратите внимание, что можно использовать инструкцию SBI для переключения какого-то одного бита в 8-разрядном порте.

Переключение между входом и выходом. Когда происходит переключение между третьим состоянием ({DDxn, PORTxn} = 0b00) и выходом в лог. 1 ({DDxn, PORTxn} = 0b11), должно произойти промежуточное состояние либо с разрешенным pull-up ({DDxn, PORTxn} = 0b01), либо с выходным уровнем в лог. 0 ({DDxn, PORTxn} = 0b10). Обычно полностью приемлемым будет разрешить состояние с разрешенным pull-up, поскольку нагрузка с высоким сопротивлением не увидит разницы между мощным лог. 1 от выходного драйвера и уровнем от pull-up. Если здесь другой случай, то бит PUD в регистре MCUCR можно установить с целью запретить все резисторы pull-ups на всех портах.

Переключение между входом с разрешенным pull-up и выходом с лог. 0 дает ту же самую проблему. Пользователь должен либо использовать промежуточное состояние с высоким сопротивлением вывода ({DDxn, PORTxn} = 0b00), либо промежуточное состояние с высоким выходным уровнем ({DDxn, PORTxn} = 0b11).

В таблице 14-1 сделан общий обзор управляющих сигналов, которые влияют на состояние вывода.

Таблица 14-1. Возможные варианты конфигурации вывода.

DDxn
PORTxn PUD I/O pull-up Примечание
0 0 X вход нет Третье состояние, отключено (Hi-Z).
0 1 0 вход да Через вывод ножки порта Pxn будет течь выходной ток, когда ножка притянута снаружи к земле.
0 1 1 вход нет Третье состояние, отключено (Hi-Z).
1 0 X выход нет Порт настроен как выход, и на нем уровень лог. 0 (втекающий снаружи ток).
1 1 X выход нет Порт настроен как выход, и на нем уровень лог. 1 (вытекающий наружу ток).

Чтение значения на выводе. Независимо от состояния бита настройки направления работы порта DDxn, состояние вывода порта может быть прочитано через чтение состояния бит регистра PINxn. Как показано на рис. 14-2, бит регистра PINxn и предшествующая защелка составляют синхронизатор. Такая схема нужна для того, чтобы избежать неопределенных изменений состояния физического вывода поблизости от перепадов внутренней тактовой частоты, однако это также вводит задержку. На рис. 14-3 показана диаграмма времени синхронизации при чтении внешне приложенного уровня напряжения. Максимальное и минимальное значение задержки распространения обозначены как tpd,max и tpd,min соответственно.

AVR Synchronization Reading Externally Applied Pin value

Рис. 14-3. Синхронизация при чтении уровня напряжения, приложенного к выводу снаружи.

Рассмотрим случай, когда период тактов начинается почти сразу после первого спада системной частоты. Защелка закрыта, когда такт в состоянии лог. 0, и становится прозрачной, когда такт в лог. 1, как показано на затененной области сигнала "SYNC LATCH". Значение сигнала защелкивается, когда системная тактовая частота переходит в лог. 0. Значение попадает в регистр PINxn на последующем положительном перепаде тактов. Как показано двумя стрелками tpd,max и tpd,min, одиночное изменение сигнала на выводе будет задержано на время от 0.5 до 1.5 периода тактовой частоты, в зависимости от момента, когда произошло изменение.

Когда происходит обратное чтение программно установленной величины цифрового сигнала на выходе, должна быть вставлена инструкция nop, как это показано на рис. 14-4. Инструкция out устанавливает сигнал "SYNC LATCH" на положительном перепаде тактов. В этом случае задержка tpd через прохождение синхронизатора составит 1 период системной тактовой частоты.

AVR Synchronization Reading Software Assigned Pin Value

Рис. 14-4. Синхронизация при чтении программно установленного значения на выводе.

Ниже приведены примеры кода, где показано как установить выводы разрядов 0 и 1 порта B в состояние лог. 1, и выводы разрядов 2 и 3 в лог. 0, и определить выводы порта с разрядами 7..4 как входы, где разрешены резисторы pull-up на выводах разрядов порта 6 и 7. Полученные значения на выводах порта вычитываются обратно, однако как обсуждалось ранее, добавлена инструкция nop, чтобы была возможность правильно прочитать только что установленные значения на выводах порта.

Пример кода на ассемблере:

   ...
; Настройка резисторов pull-up и установка выходов в лог. 1.
; Задается направление работы для выводов порта.
   ldi r16,(1 << PB7)|(1 << PB6)|(1 << PB1)|(1 << PB0)
   ldi r17,(1 << DDB3)|(1 << DDB2)|(1 << DDB1)|(1 << DDB0)
   out PORTB,r16
   out DDRB,r17
; Добавление инструкции nop для синхронизации.
   nop
; Чтение выводов порта.
   in r16,PINB
   ...

Примечание: Для программы на ассемблере используются два временных регистра, чтобы минимизировать время между установкой pull-up выводов 0, 1, 6 и 7 и правильной установкой битов направления, определяя биты 2 и 3 как находящиеся в лог. 0 и переназначая биты 0 и 1 и как мощный выход в состоянии лог. 1.

Пример кода на языке C:

...
/* Настройка резисторов pull-up и установка выходов в лог. 1.
   Задается направление работы для выводов порта. */
PORTB = (1 << PB7)|(1 << PB6)|(1 << PB1)|(1 << PB0);
DDRB = (1 << DDB3)|(1 << DDB2)|(1 << DDB1)|(1 << DDB0);
/* Добавление инструкции nop для синхронизации. */
__no_operation();
/* Чтение выводов порта. */
i = PINB;
...

Разрешение цифровых входов и режимы сна (Sleep Modes). Как показано на рис. 14-2, цифровой входной сигнал может быть зафиксирован на уровне земли по входу триггера Шмитта. Сигнал, обозначенный на рисунке как SLEEP, устанавливается контроллером сна (MCU Sleep Controller) в режиме пониженного энергопотребления (режимы сна Power-down mode, Power-save mode и Standby mode), чтобы избежать потерь энергии, если некоторые входные сигналы остались неподключенными, или у них аналоговый уровень сигнала близок к VCC/2.

Сигнал SLEEP отменяется для выводов порта, которые разрешены как выводы внешних прерываний (external interrupt pins). Если запрос на внешнее прерывание не разрешен, то SLEEP для этих выводов все еще активен. SLEEP также отменяется различными альтернативными функциями портов, привязанных к периферийным устройствам.

Если на асинхронном внешнем выводе прерывания, который настроен как "прерывание по спаду" или как "прерывание по фронту" или как "прерывание по обоим изменениям сигнала", присутствует лог. 1, и внешнее прерывание не разрешено, то установится соответствующий флаг внешнего прерывания (External Interrupt Flag), когда происходит выход из вышеупомянутых режимов сна, так как изменение уровня выводит микроконтроллер из режима сна.

Не подключенные выводы. Если некоторые выводы остались неподключенными, то рекомендуется убедиться, что на этих выводах задан определенный уровень (либо лог. 0, либо лог. 1). Даже при том, что большинство цифровых входов запрещено в режиме глубокого сна, как это описано выше, нужно избегать наличия плавающих входов, чтобы уменьшить энергопотребление во всех других режимах, где цифровые входы разрешены (Reset, Active mode и Idle mode).

Самый простой метод гарантировать наличие определенного уровня на неиспользуемых выводах портов - разрешить внутренний резистор pull-up. В этом случае pull-up будет запрещен во время сброса. Если важно малое потребление энергии во время сброса, то рекомендуется использовать внешние подтягивающие резисторы pull-up или pull-down. Подключение неиспользуемых выводов напрямую к VCC или GND не рекомендуется, потому что это может привести к чрезмерному току короткого замыкания выхода, если эти выводы случайно были сконфигурированы как выходы.

[Альтернативные функции выводов порта]

У большинства выводов портов есть альтернативные функции, которые могут быть привязаны к ножке порта (под альтернативностью имеется в виду аппаратные функции, отличающиеся от работы ножки порта в режиме GPIO). На рис. 14-5 показаны управляющие сигналы из рис. 14-2 (см. врезку "Работа выводов в качестве GPIO"), которые могут переназначить альтернативные функции. Переназначающие сигналы могут не присутствовать на всех выводах порта, но рисунок показывает общее описание, которое может относиться ко всем выводам портов микроконтроллера семейства AVR.

AVR Alternate Port Functions

Рис. 14-5. Альтернативные функции вывода порта(1).

PUOExn: Pxn PULL-UP OVERRIDE ENABLE
PUOVxn: Pxn PULL-UP OVERRIDE VALUE
DDOExn: Pxn DATA DIRECTION OVERRIDE ENABLE
DDOVxn: Pxn DATA DIRECTION OVERRIDE VALUE
PVOExn: Pxn PORT VALUE OVERRIDE ENABLE
PVOVxn: Pxn PORT VALUE OVERRIDE VALUE
DIEOExn: Pxn DIGITAL INPUT-ENABLE OVERRIDE ENABLE
DIEOVxn: Pxn DIGITAL INPUT-ENABLE OVERRIDE VALUE
SLEEP: SLEEP CONTROL
PTOExn: Pxn, PORT TOGGLE OVERRIDE ENABLE
PUD: PULLUP DISABLE
WDx: WRITE DDRx
RDx: READ DDRx
RRx: READ PORTx REGISTER
WRx: WRITE PORTx
RPx: READ PORTx PIN
WPx: WRITE PINx
clkI/O: I/O CLOCK
DIxn: DIGITAL INPUT PIN n ON PORTx
AIOxn: ANALOG INPUT/OUTPUT PIN n ON PORTx

Примечание (1): WRx, WPx, WDx, RRx, RPx и RDx являются общими для всех выводов в пределах одного порта (A, B, C, D и т. д.). Сигналы clkI/O, SLEEP и PUD общие для всех портов. Все другие сигналы уникальны для каждого вывода порта.

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

Таблица 14-2. Общее описание сигналов переназначения для альтернативных функций.

Имя
Полное имя Описание
PUOE Pull-up Override Enable Если этот сигнал в лог. 1, то разрешение резисторов pull-up управляется сигналом PUOV. Если сигнал PUOE в лог. 0, то резистор pull-up разрешен, когда {DDxn, PORTxn, PUD} = 0b010.
PUOV Pull-up Override Value Если PUOE в лог. 1, то pull-up разрешен/запрещен, когда PUOV в лог. 1/лог. 0, независимо от установки битов регистров DDxn, PORTxn и PUD.
DDOE Data Direction Override Enable Если этот сигнал в лог. 1, то сигнал Output Driver Enable управляется сигналом DDOV. Если сигнал DDOE очищен, то выходной драйвер разрешается битом DDxn регистра DDRx.
DDOV Data Direction Override Value Если DDOE в лог. 1, то выходной драйвер разрешен/запрещен, когда DDOV в лог. 1/лог. 0, независимо от установки бита DDxn в регистре DDRx.
PVOE Port Value Override Enable Если этот сигнал в лог. 1, и выходной драйвер разрешен, то значение порта управляется сигналом PVOV. Если PVOE в лог. 0, и выходной драйвер разрешен, то значение на ножке порта управляется битом PORTxn регистра PORTx.
PVOV Port Value Override Value Если PVOE в лог. 1, значение порта установится в значение PVOV, независимо от установки бита PORTxn регистра PORTx.
PTOE Port Toggle Override Enable Если бит PTOE в лог. 1, то бит PORTxn регистра PORTx инвертируется.
DIEOE Digital Input Enable Override Enable Если этот бит в лог. 1, то Digital Input Enable управляется сигналом DIEOV. Если DIEOE в лог. 0, то Digital Input Enable определяется состоянием микроконтроллера (Normal mode, sleep mode).
DIEOV Digital Input Enable Override Value Если DIEOE в лог. 1, то Digital Input разрешается/запрещается, когда DIEOV в лог. 1/лог. 0, независимо от состояния микроконтроллера (Normal mode, sleep mode).
DI Digital Input Это цифровой вход для альтернативных функций. На рисунке этот сигнал подключен к выходу триггера Шмитта, но перед синхронизатором. За исключением ситуации использования цифрового входа как источника тактов, модуль с альтернативной функцией имеет свой собственный синхронизатор.
AIO Analog Input/Output Это аналоговый вход/выход для альтернативных функций. Этот сигнал подключен напрямую к выводу кристалла, и его можно использовать в двух направлениях.

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

Таблица 14-3. Альтернативные функции порта B.

Порт Альтернативная функция
PB7 XTAL2 (Chip Clock Oscillator pin 2)
TOSC2 (Timer Oscillator pin 2)
PCINT7 (Pin Change Interrupt 7)
PB6 XTAL1 (Chip Clock Oscillator pin 1 or External clock input)
TOSC1 (Timer Oscillator pin 1)
PCINT6 (Pin Change Interrupt 6)
PB5 SCK (SPI Bus Master clock Input)
PCINT5 (Pin Change Interrupt 5)
PB4 MISO (SPI Bus Master Input/Slave Output)
PCINT4 (Pin Change Interrupt 4)
PB3 MOSI (SPI Bus Master Output/Slave Input)
OC2A (Timer/Counter2 Output Compare Match A Output)
PCINT3 (Pin Change Interrupt 3)
PB2 ~SS (SPI Bus Master Slave select)
OC1B (Timer/Counter1 Output Compare Match B Output)
PCINT2 (Pin Change Interrupt 2)
PB1 OC1A (Timer/Counter1 Output Compare Match A Output)
PCINT1 (Pin Change Interrupt 1)
PB0 ICP1 (Timer/Counter1 Input Capture Input)
CLKO (Divided System Clock Output)
PCINT0 (Pin Change Interrupt 0)

XTAL2/TOSC2/PCINT7 – Port B, Bit 7

XTAL2: вывод 2 внутреннего системного генератора тактов (Oscillator), выход. Обычно (по умолчанию) используется как вывод для подключения кварцевого резонатора или низкочастотного резонатора, как вариант пьезокерамического. Когда этот вывод используется как вывод тактового генератора, его нельзя использовать как порт ввода/вывода (GPIO).

TOSC2: вывод 2 для генератора таймера (Timer Oscillator). Используется только если в качестве источника системной тактовой частоты используется внутренний калиброванный RC-генератор, и разрешен асинхронный таймер правильной настройкой в регистре ASSR. Когда бит AS2 в регистре ASSR установлен в лог. 1, и бит EXCLK сброшен в лог. 0 для разрешения асинхронного тактирования Timer/Counter2 с помощью кварцевого резонатора, вывод PB7 отключается от порта, и становится инвертирующим выходом усилителя генератора. В таком режиме к этому выводу подключен кварцевый резонатор (обычно на частоту 32768 Гц), и вывод не может использоваться как порт ввода/вывода (GPIO).

PCINT7: источник прерывания 7 по изменению уровня (Pin Change Interrupt source 7). Вывод порта PB7 может работать как вход внешнего источника прерывания.

Если PB7 используется как вывод тактов, то разряды DDB7, PORTB7 и PINB7 все читаются как 0.

XTAL1/TOSC1/PCINT6 – Port B, Bit 6

XTAL1: вывод 1 внутреннего системного генератора тактов (Oscillator), вход. Используется для всех источников тактовой частоты за исключением внутреннего калиброванного RC-генератора. Когда используется как вывод тактов, этот вывод не может быть использован как порт ввода/вывода (GPIO).

TOSC1: вывод 1 для генератора таймера (Timer Oscillator). Используется только если в качестве источника системной тактовой частоты используется внутренний калиброванный RC-генератор, и разрешен асинхронный таймер правильной настройкой в регистре ASSR. Когда бит AS2 в регистре ASSR установлен в лог. 1, и бит EXCLK сброшен в лог. 0 для разрешения асинхронного тактирования Timer/Counter2 с помощью кварцевого резонатора, вывод PB6 отключается от порта, и становится входом инвертирующего усилителя генератора. В таком режиме к этому выводу подключен кварцевый резонатор (обычно на частоту 32768 Гц), и вывод не может использоваться как порт ввода/вывода (GPIO).

PCINT6: источник прерывания 6 по изменению уровня (Pin Change Interrupt source 6). Вывод порта PB6 может работать как вход внешнего источника прерывания.

Если PB6 используется как вывод тактов, то разряды DDB6, PORTB6 и PINB6 все читаются как 0.

SCK/PCINT5 – Port B, Bit 5

SCK: Master Clock output, Slave Clock input для канала SPI. Когда SPI разрешен в режиме Slave, этот вывод конфигурируется как вход независимо от установки бита DDB5. Когда SPI сконфигурирован в режиме Master, направление данных на этом выводе управляется битом DDB5. Когда этот вывод принудительно назначен блоком SPI как вход, то подключение pull-up резистора все еще можно задавать битом PORTB5.

PCINT5: источник прерывания 5 по изменению уровня (Pin Change Interrupt source 5). Вывод порта PB5 может работать как вход внешнего источника прерывания.

MISO/PCINT4 – Port B, Bit 4

MISO: Master Data input, Slave Data output для канала SPI. Когда SPI разрешен в режиме Master, этот вывод конфигурируется как вход независимо от установки бита DDB4. Когда SPI разрешен в режиме Slave, направление данных на этом выводе управляется битом DDB4. Когда вывод принудительно сконфигурирован блоком SPI как вход, то подключение pull-up резистора все еще можно задавать битом PORTB4.

PCINT4: источник прерывания 4 по изменению уровня (Pin Change Interrupt source 4). Вывод порта PB4 может работать как вход внешнего источника прерывания.

MOSI/OC2/PCINT3 – Port B, Bit 3

MOSI: SPI Master Data output, Slave Data input для канала SPI. Когда SPI разрешен в режиме Slave, этот вывод конфигурируется как вход независимо от установки бита DDB3. Когда SPI разрешен в режиме Master, направление данных на этом выводе управляется состоянием бита DDB3. Когда этот вывод принудительно сконфигурирован блоком SPI как вход, то pull-up все еще может управляться состоянием бита PORTB3.

OC2, Output Compare Match Output: вывод PB3 может работать как аппаратный выходной сигнал, сообщающий о событии совпадения таймера/счетчика 2 (Timer/Counter2 Compare Match). Для обслуживания этой функции PB3 должен быть сконфигурирован как выход (DDB3=1). Вывод OC2 также работает как выходной сигнал работы таймера в режиме аппаратного ШИМ (PWM mode).

PCINT3: источник прерывания 3 по изменению уровня (Pin Change Interrupt source 3). Вывод порта PB3 может работать как вход внешнего источника прерывания.

~SS/OC1B/PCINT2 – Port B, Bit 2

~SS: Slave Select input. Когда SPI разрешен в режиме Slave, этот вывод конфигурируется как вход независимо от установки бита DDB2. Как устройство Slave, блок SPI активируется, когда этот вывод подтягивается к лог. 0. Когда SPI разрешен в режиме Master, направление данных на этом выводе управляется состоянием бита DDB2. Когда этот вывод принудительно настроен блоком SPI как вход, то подключение pull-up все еще управляется состоянием бита PORTB2.

OC1B, Output Compare Match output: вывод PB2 может работать аппаратный выходной сигнал, сообщающий о событии совпадения B таймера/счетчика 1 (Timer/Counter1 Compare Match B). Для обслуживания этой функции PB2 должен быть сконфигурирован как выход (DDB2=1). Вывод OC1B также работает как выходной сигнал работы таймера в режиме аппаратного ШИМ (PWM mode).

PCINT2: источник прерывания 2 по изменению уровня (Pin Change Interrupt source 2). Вывод порта PB2 может работать как вход внешнего источника прерывания.

OC1A/PCINT1 – Port B, Bit 1

OC1A, Output Compare Match output: вывод PB1 может работать аппаратный выходной сигнал, сообщающий о событии совпадения A таймера/счетчика 1 (Timer/Counter1 Compare Match A). Для обслуживания этой функции PB1 должен быть сконфигурирован как выход (DDB1=1). Вывод OC1A также работает как выходной сигнал работы таймера в режиме аппаратного ШИМ (PWM mode).

PCINT1: источник прерывания 1 по изменению уровня (Pin Change Interrupt source 1). Вывод порта PB1 может работать как вход внешнего источника прерывания.

ICP1/CLKO/PCINT0 – Port B, Bit 0

ICP1, Input Capture Pin: вывод PB0 может работать как вход захвата событий таймера/счетчика 1 (Input Capture Pin for Timer/Counter1).

CLKO, Divided System Clock: на вывод PB0 может быть выведена поделенная системная тактовая частота. Это произойдет, если запрограммирован фьюз CKOUT, независимо от установок бит PORTB0 и DDB0. Также вывод будет выходом во время сброса.

PCINT0: источник прерывания 0 по изменению уровня (Pin Change Interrupt source 0). Вывод порта PB0 может работать как вход внешнего источника прерывания.

В таблицах 14-4 и 14-5 показаны переназначающие сигналы, связанные с альтернативными функциями порта B (эти сигналы показаны на рисунке 14-5). SPI MSTR INPUT и SPI SLAVE OUTPUT составляют сигнал MISO, в то время как MOSI делится на SPI MSTR OUTPUT и SPI SLAVE INPUT.

Таблица 14-4. Переназначающие сигналы для альтернативных функций PB7...PB4.

Имя
сигнала
PB7/XTAL2/
TOSC2/PCINT7(2)
PB6/XTAL1/
TOSC1/PCINT6(2)
PB5/SCK/
PCINT5
PB4/MISO/
PCINT4
PUOE ~INTRC • ~EXTCK + AS2 ~INTRC + AS2 SPE • ~MSTR SPE • MSTR
PUOV 0 0 PORTB5 • ~PUD PORTB4 • ~PUD
DDOE ~INTRC • ~EXTCK + AS2 ~INTRC + AS2 SPE • ~MSTR SPE • MSTR
DDOV 0 0 0 0
PVOE 0 0 SPE • MSTR SPE • ~MSTR
PVOV 0 0 SCK OUTPUT SPI SLAVE OUTPUT
DIEOE ~INTRC • ~EXTCK + AS2 +
PCINT7 • PCIE0
~INTRC + AS2 +
PCINT6 • PCIE0
PCINT5 • PCIE0 PCINT4 • PCIE0
DIEOV (INTRC + EXTCK) • ~AS2 ~INTRC • AS2 1 1
DI PCINT7 INPUT PCINT6 INPUT PCINT5 INPUT
SCK INPUT
PCINT4 INPUT
SPI MSTR INPUT
AIO Oscillator Output Oscillator/Clock Input - -

Примечание (2): INTRC означает, что выбран один из внутренних RC-генераторов (выбирается фьюзами CKSEL), EXTCK означает, что выбрано внешнее тактирование (также выбирается фьюзами CKSEL).

Таблица 14-5. Переназначающие сигналы для альтернативных функций PB3...PB0.

Имя
сигнала
PB3/MOSI/
OC2/PCINT3
PB2/~SS/
OC1B/PCINT2
PB1/OC1A/
PCINT1
PB0/ICP1/
PCINT0
PUOE SPE • ~MSTR SPE • ~MSTR 0 0
PUOV PORTB3 • ~PUD PORTB2 • ~PUD 0 0
DDOE SPE • ~MSTR SPE • ~MSTR 0 0
DDOV 0 0 0 0
PVOE SPE • MSTR + OC2A ENABLE OC1B ENABLE OC1A ENABLE 0
PVOV SPI MSTR OUTPUT + OC2A OC1B OC1A 0
DIEOE PCINT3 • PCIE0 PCINT2 • PCIE0 PCINT1 • PCIE0 PCINT0 • PCIE0
DIEOV 1 1 1 1
DI PCINT3 INPUT
SPI SLAVE INPUT
PCINT2 INPUT
SPI ~SS
PCINT1 INPUT PCINT0 INPUT
ICP1 INPUT
AIO - - - -

Таблица 14-6. Альтернативные функции порта C.

Порт Альтернативная функция
PC6 ~RESET (Reset pin)
PCINT14 (Pin Change Interrupt 14)
PC5 ADC5 (ADC Input Channel 5)
SCL (2-wire Serial Bus Clock Line)
PCINT13 (Pin Change Interrupt 13)
PC4 ADC4 (ADC Input Channel 4)
SDA (2-wire Serial Bus Data Input/Output Line)
PCINT12 (Pin Change Interrupt 12)
PC3 ADC3 (ADC Input Channel 3)
PCINT11 (Pin Change Interrupt 11)
PC2 ADC2 (ADC Input Channel 2)
PCINT10 (Pin Change Interrupt 10)
PC1 ADC1 (ADC Input Channel 1)
PCINT9 (Pin Change Interrupt 9)
PC0 ADC0 (ADC Input Channel 0)
PCINT8 (Pin Change Interrupt 8)

~RESET/PCINT14 – Port C, Bit 6

~RESET, вход сброса: когда бит фьюзов RSTDISBL запрограммирован, этот вывод работает как обычная ножка ввода/вывода (GPIO), и микроконтроллер полагается на сброс от Power-on Reset и Brown-out Reset (либо на сброс от сторожевого таймера). Когда фьюз RSTDISBL не запрограммирован (это состояние по умолчанию), схема сброса подключена к этому выводу, и он не может использоваться как вывод порта GPIO.

Если PC6 используется как вход сброса, то все биты DDC6, PORTC6 и PINC6 будут читаться как 0.

PCINT14: источник прерывания 14 по изменению уровня (Pin Change Interrupt source 14). Вывод порта PC6 может работать как вход внешнего источника прерывания (когда он не работает как вход сброса).

SCL/ADC5/PCINT13 – Port C, Bit 5

SCL, 2-wire Serial Interface Clock: когда бит TWEN в регистре TWCR установлен в лог. 1 для разрешения работы 2-проводного последовательного интерфейса (TWI, или I2C), то вывод PC5 отключается от порта и становится сигналом тактов для TWI. В таком режиме на этом выводе работает фильтр коротких импульсов, чтобы подавить во входном сигнале иголки длительностью короче 50 нс, и вывод управляется открытым стоком с ограничением по скорости переключения.

ADC5: PC5 может быть использован как вход канала 5 АЦП (ADC input Channel 5). Обратите внимание, что входной канал 5 АЦП использует цифровое питание.

PCINT13: источник прерывания 13 по изменению уровня (Pin Change Interrupt source 13). Вывод порта PC5 может работать как вход внешнего источника прерывания.

SDA/ADC4/PCINT12 – Port C, Bit 4

SDA, 2-wire Serial Interface Data: когда бит TWEN в регистре TWCR установлен в лог. 1 для разрешения работы 2-проводного последовательного интерфейса (TWI, или I2C), то вывод PC4 отключается от порта и становится сигналом данных для TWI. В таком режиме на этом выводе работает фильтр коротких импульсов, чтобы подавить во входном сигнале иголки длительностью короче 50 нс, и вывод управляется открытым стоком с ограничением по скорости переключения.

ADC4: PC4 может быть использован как вход канала 4 АЦП (ADC input Channel 4). Обратите внимание, что входной канал 4 АЦП использует цифровое питание.

PCINT12: источник прерывания 12 по изменению уровня (Pin Change Interrupt source 12). Вывод порта PC4 может работать как вход внешнего источника прерывания.

ADC3/PCINT11 – Port C, Bit 3

ADC3: PC3 может быть использован как вход канала 3 АЦП (ADC input Channel 3). Обратите внимание, что входной канал 3 АЦП использует аналоговое питание.

PCINT11: источник прерывания 11 по изменению уровня (Pin Change Interrupt source 11). Вывод порта PC3 может работать как вход внешнего источника прерывания.

ADC2/PCINT10 – Port C, Bit 2

ADC2: PC2 может быть использован как вход канала 2 АЦП (ADC input Channel 2). Обратите внимание, что входной канал 2 АЦП использует аналоговое питание.

PCINT10: источник прерывания 10 по изменению уровня (Pin Change Interrupt source 10). Вывод порта PC2 может работать как вход внешнего источника прерывания.

ADC1/PCINT9 – Port C, Bit 1

ADC1: PC1 может быть использован как вход канала 1 АЦП (ADC input Channel 1). Обратите внимание, что входной канал 1 АЦП использует аналоговое питание.

PCINT9: источник прерывания 9 по изменению уровня (Pin Change Interrupt source 9). Вывод порта PC1 может работать как вход внешнего источника прерывания.

ADC0/PCINT8 – Port C, Bit 0

ADC0: PC0 может быть использован как вход канала 0 АЦП (ADC input Channel 0). Обратите внимание, что входной канал 0 АЦП использует аналоговое питание.

PCINT8: источник прерывания 8 по изменению уровня (Pin Change Interrupt source 8). Вывод порта PC0 может работать как вход внешнего источника прерывания.

В таблицах 14-7 и 14-8 показаны переназначающие сигналы, связанные с альтернативными функциями порта C (эти сигналы показаны на рисунке 14-5).

Таблица 14-7. Переназначающие сигналы для альтернативных функций PC6...PC4(3).

Имя
сигнала
PC6/~RESET/PCINT14 PC5/SCL/ADC5/PCINT13 PC4/SDA/ADC4/PCINT12
PUOE RSTDISBL TWEN TWEN
PUOV 1 PORTC5 • ~PUD PORTC4 • ~PUD
DDOE RSTDISBL TWEN TWEN
DDOV 0 SCL_OUT SDA_OUT
PVOE 0 TWEN TWEN
PVOV 0 0 0
DIEOE RSTDISBL + PCINT14 • PCIE1 PCINT13 • PCIE1 + ADC5D PCINT12 • PCIE1 + ADC4D
DIEOV RSTDISBL PCINT13 • PCIE1 PCINT12 • PCIE1
DI PCINT14 INPUT PCINT13 INPUT PCINT12 INPUT
AIO RESET INPUT ADC5 INPUT / SCL INPUT ADC4 INPUT / SDA INPUT

Примечание (3): когда TWI разрешен, то для выводов PC4 и PC5 включается управление с ограничением скорости переключения. Это не показано на рисунке. Дополнительно между выходами AIO подключены фильтры иголок, показанные рисунке порте и цифровой логике модуля TWI.

Таблица 14-8. Переназначающие сигналы для альтернативных функций PC3...PC0.

Имя
сигнала
PC3/ADC3/
PCINT11
PC2/ADC2/
PCINT10
PC1/ADC1/
PCINT9
PC0/ADC0/
PCINT8
PUOE 0 0 0 0
PUOV 0 0 0 0
DDOE 0 0 0 0
DDOV 0 0 0 0
PVOE 0 0 0 0
PVOV 0 0 0 0
DIEOE PCINT11 • PCIE1 + ADC3D PCINT10 • PCIE1 + ADC2D PCINT9 • PCIE1 + ADC1D PCINT8 • PCIE1 + ADC0D
DIEOV PCINT11 • PCIE1 PCINT10 • PCIE1 PCINT9 • PCIE1 PCINT8 • PCIE1
DI PCINT11 INPUT PCINT10 INPUT PCINT9 INPUT PCINT8 INPUT
AIO ADC3 INPUT ADC2 INPUT ADC1 INPUT ADC0 INPUT

Таблица 14-9. Альтернативные функции порта D.

Порт Альтернативная функция
PD7 AIN1 (Analog Comparator Negative Input)
PCINT23 (Pin Change Interrupt 23)
PD6 AIN0 (Analog Comparator Positive Input)
OC0A (Timer/Counter0 Output Compare Match A Output)
PCINT22 (Pin Change Interrupt 22)
PD5 T1 (Timer/Counter 1 External Counter Input)
OC0B (Timer/Counter0 Output Compare Match B Output)
PCINT21 (Pin Change Interrupt 21)
PD4 XCK (USART External Clock Input/Output)
T0 (Timer/Counter 0 External Counter Input)
PCINT20 (Pin Change Interrupt 20)
PD3 INT1 (External Interrupt 1 Input)
OC2B (Timer/Counter2 Output Compare Match B Output)
PCINT19 (Pin Change Interrupt 19)
PD2 INT0 (External Interrupt 0 Input)
PCINT18 (Pin Change Interrupt 18)
PD1 TXD (USART Output Pin)
PCINT17 (Pin Change Interrupt 17)
PD0 RXD (USART Input Pin)
PCINT16 (Pin Change Interrupt 16)

AIN1/OC2B/PCINT23 – Port D, Bit 7

AIN1, Analog Comparator Negative Input (инвертирующий вход компаратора). Конфигурируйте вывод порта как вход с отключенным pull-up резистором, чтобы избежать влияние работы цифрового порта на аналоговый компаратор.

PCINT23: источник прерывания 23 по изменению уровня (Pin Change Interrupt source 23). Вывод порта PD7 может работать как вход внешнего источника прерывания.

AIN0/OC0A/PCINT22 – Port D, Bit 6

AIN0, Analog Comparator Positive Input (неинвертирующий вход компаратора). Конфигурируйте вывод порта как вход с отключенным pull-up резистором, чтобы избежать влияние работы цифрового порта на аналоговый компаратор.

OC0A, Output Compare Match output: вывод PD6 может работать как внешний выход, сообщающий о событии совпадения A таймера/счетчика 0 (Timer/Counter0 Compare Match A). Вывод PD6 должен быть сконфигурирован как выход (DDD6=1) для работы этой функции. Вывод OC0A также работает как выход, когда таймер работает в режиме ШИМ (PWM).

PCINT22: источник прерывания 22 по изменению уровня (Pin Change Interrupt source 22). Вывод порта PD6 может работать как вход внешнего источника прерывания.

T1/OC0B/PCINT21 – Port D, Bit 5

T1, Timer/Counter1 counter source (источник внешнего сигнала тактирования для таймера/счетчика 1).

OC0B, Output Compare Match output: вывод PD5 может работать как внешний выход, сообщающий о событии совпадения B таймера/счетчика 0 (Timer/Counter0 Compare Match B). Вывод PD5 должен быть сконфигурирован как выход (DDD5=1) для работы этой функции. Вывод OC0B также работает как выход, когда таймер работает в режиме ШИМ (PWM).

PCINT21: источник прерывания 21 по изменению уровня (Pin Change Interrupt source 21). Вывод порта PD5 может работать как вход внешнего источника прерывания.

XCK/T0/PCINT20 – Port D, Bit 4

XCK, USART external clock (источник внешнего сигнала тактирования для USART).

T0, Timer/Counter0 counter source (источник внешнего сигнала тактирования для таймера/счетчика 0).

PCINT20: источник прерывания 20 по изменению уровня (Pin Change Interrupt source 20). Вывод порта PD4 может работать как вход внешнего источника прерывания.

INT1/OC2B/PCINT19 – Port D, Bit 3

INT1, External Interrupt source 1: вывод PD3 может работать как вход внешнего прерывания.

OC2B, Output Compare Match output: вывод PD3 может работать как внешний выход, сообщающий о событии совпадения B таймера/счетчика 0 (Timer/Counter0 Compare Match B). Вывод PD3 должен быть сконфигурирован как выход (DDD3=1) для работы этой функции. Вывод OC2B также работает как выход, когда таймер работает в режиме ШИМ (PWM).

PCINT19: источник прерывания 19 по изменению уровня (Pin Change Interrupt source 19). Вывод порта PD3 может работать как вход внешнего источника прерывания.

INT0/PCINT18 – Port D, Bit 2

INT0, External Interrupt source 0: вывод PD2 может работать как вход внешнего прерывания.

PCINT18: источник прерывания 18 по изменению уровня (Pin Change Interrupt source 18). Вывод порта PD2 может работать как вход внешнего источника прерывания.

TXD/PCINT17 – Port D, Bit 1

TXD, Transmit Data (выход данных USART). Когда разрешена работа передатчика USART, этот выход автоматически конфигурируется как выход, независимо от установки бита DDD1.

PCINT17: источник прерывания 17 по изменению уровня (Pin Change Interrupt source 17). Вывод порта PD1 может работать как вход внешнего источника прерывания.

RXD/PCINT16 – Port D, Bit 0

RXD, Receive Data (вход данных USART). Когда разрешен приемник USART, этот вывод автоматически конфигурируется как вход, независимо от установки бита DDD0. Когда блок USART принудительно сконфигурировал этот вывод как вход, подключение pull-up все еще управляется установкой бита PORTD0.

PCINT16: источник прерывания 16 по изменению уровня (Pin Change Interrupt source 16). Вывод порта PD0 может работать как вход внешнего источника прерывания.

В таблицах 14-10 и 14-11 показаны переназначающие сигналы, связанные с альтернативными функциями порта C (эти сигналы показаны на рисунке 14-5).

Таблица 14-10. Переназначающие сигналы для альтернативных функций PD7...PD4.

Имя
сигнала
PD7/AIN1/
PCINT23
PD6/AIN0/
OC0A/PCINT22
PD5/T1/OC0B/
PCINT21
PD4/XCK/T0/
PCINT20
PUOE 0 0 0 0
PUOV 0 0 0 0
DDOE 0 0 0 0
DDOV 0 0 0 0
PVOE 0 OC0A ENABLE OC0B ENABLE UMSEL
PVOV 0 OC0A OC0B XCK OUTPUT
DIEOE PCINT23 • PCIE2 PCINT22 • PCIE2 PCINT21 • PCIE2 PCINT20 • PCIE2
DIEOV 1 1 1 1
DI PCINT23 INPUT PCINT22 INPUT PCINT21 INPUT
T1 INPUT
PCINT20 INPUT
XCK INPUT
T0 INPUT
AIO AIN1 INPUT AIN0 INPUT - -

Таблица 14-11. Переназначающие сигналы для альтернативных функций PD3...PD0.

Имя
сигнала
PD3/OC2B/
INT1/PCINT19
PD2/INT0/
PCINT18
PD1/TXD/
PCINT17
PD0/RXD/
PCINT16
PUOE 0 0 TXEN RXEN
PUOV 0 0 0 PORTD0 • ~PUD
DDOE 0 0 TXEN RXEN
DDOV 0 0 1 0
PVOE OC2B ENABLE 0 TXEN 0
PVOV OC2B 0 TXD 0
DIEOE INT1 ENABLE +
PCINT19 • PCIE2
INT0 ENABLE +
PCINT18 • PCIE1
PCINT17 • PCIE2 PCINT16 • PCIE2
DIEOV 1 1 1 1
DI PCINT19 INPUT
INT1 INPUT
PCINT18 INPUT
INT0 INPUT
PCINT17 INPUT PCINT16 INPUT
RXD
AIO - - - -

[Описание регистров]

MCUCR – MCU Control Register

AVR MCUCR

Примечание: биты BODS и BODSE есть только на микроконтроллерах подсемейства picoPower ATmega48PA/88PA/168PA/328P.

BODS: BOD Sleep (запрет детектора некачественного напряжения питания во время режимов сна, sleep mode). Когда Brown-out Detector (BOD) разрешен битами фьюзов BODLEVEL (см. таблицу 28-7 даташита на микроконтроллер ATmega328), BOD постоянно отслеживает напряжение питания во время режима сна. Чтобы экономить энергию, BOD можно запретить программно для некоторых режимов сна (см. таблицу 10-1 даташита на микроконтроллер ATmega328). Энергопотребление в режиме сна будет тогда такое же, как если бы BOD был глобально запрещен фьюзами. Если BOD запрещен программно, то функция BOD выключается сразу после входа в режим сна. После выхода из режима сна работа BOD автоматически разрешается опять. Это гарантирует безопасное функционирование в случае, когда уровень VCC падает во время периода сна.

Когда BOD запрещен, время выхода из режима сна будет примерно 60 μs, чтобы гарантировать корректную работу BOD до того, как MCU продолжит выполнение кода.

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

BODSE. BODSE разрешает установку управляющего бита BODS. Запрет BOD управляется последовательностью действий во времени.

PUD: Pull-up Disable (запрет внутренних верхних подтягивающих резисторов). Когда этот бит записан в лог. 1, резисторы pull-up на всех портах I/O запрещаются, даже если биты DDxn и PORTxn регистров DDRx и PORTx сконфигурированы для разрешения pull-up ({DDxn, PORTxn} = 0b01). Подробнее см. секцию "Конфигурирование ножки порта".

PORTB – The Port B Data Register

AVR PORTB

DDRB – The Port B Data Direction Register

AVR DDRB

PINB – The Port B Input Pins Address(5)

AVR PINB

PORTC – The Port C Data Register

AVR PORTC

DDRC – The Port C Data Direction Register

AVR DDRC

PINC – The Port C Input Pins Address(5)

AVR PINC

PORTD – The Port D Data Register

AVR PORTD

DDRD – The Port D Data Direction Register

AVR DDRD

PIND – The Port D Input Pins Address(5)

AVR PIND

Примечание (5): запись в регистр PINx предоставляет функцию триггерного переключения выводов порта GPIO в противоположное состояние (toggle). Запись лог. 1 в бит PINxn переключает значение соответствующего бита в регистре PORTxn, независимо от значения бита DDRxn. Обратите внимание, что инструкция SBI может использоваться для переключения одного бита в порту.

[Ссылки]

1. Доступ к портам I/O AVR на языке C (GCC, WinAVR).

 

Комментарии  

 
0 #1 влад 05.04.2021 23:05
Подскажите как на atmega328p заставить порты PB6 и PB7 работать как выходы? Настроил фьюзы на работу от внутреннего генератора. Загрузил подобие блинка. Все порты кроме bp7 и pb6 работают хорошо. Если на них нет нагрузки, то напряжение выходит постоянное в районе 4 вольт. Если нагрузить на 1 кОм, то на выходе импульсы с амплитудой 2 вольта. Если уменьшать сопротивление нагрузки то напряжение падает до нуля.
Цитировать
 

Добавить комментарий


Защитный код
Обновить

Top of Page