В этой статье описан принцип работы порта как 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.
Рис. 14-1. Эквивалентная схема внутренней схемотехники ножки порта ввода/вывода AVR.
Вот краткая сводка по параметра ножки порта AVR (в диапазоне температур TA = -40°C .. 85°C):
Параметр
Значение
Ед.
Максимальный выходной ток ножки порта
40
мА
Напряжение на ножке порта
-0.5..VCC+0.5
V
Сопротивление pull-up резистора
20..50
kΩ
Ток утечки по входу
≤1
μA
Подробнее про электрические характеристики порта см. даташит на микроконтроллер.
[Работа выводов в качестве GPIO]
Выводы портов микроконтроллера могут работать как двунаправленные цифровые сигналы ввода/вывода общего назначения (GPIO). Это означает, что логическое состояние ножки порта как выхода можно программно устанавливать либо в лог. 0, либо в лог. 1, и также можно читать состояние ножки порта, настроенного либо на вход, либо на выход. В режиме работы как вход на ножке порта можно разрешить подключение внутреннего верхнего нагрузочного резистора (pull-up). На рис. 14-2 показано функциональное описание одного вывода порта I/O, где вывод обозначен для общего случая как Pxn (вместо x подставляется буква порта A, B, C, D и т. д., а вместо n подставляется номер разряда порта 7..0).
Рис. 14-2. Внутреннее устройство цифрового порта ввода/вывода.
Примечание: WRx, WPx, WDx, RRx, RPx и RDx являются общими для всех выводов в пределах одного и того же порта (A, B, C, D и т. д.). Сигналы clkI/O, SLEEP и PUD являются общими для всех портов.
Конфигурирование ножки порта. К каждому выводу порта привязана три бита регистров: 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 соответственно.
Рис. 14-3. Синхронизация при чтении уровня напряжения, приложенного к выводу снаружи.
Рассмотрим случай, когда период тактов начинается почти сразу после первого спада системной частоты. Защелка закрыта, когда такт в состоянии лог. 0, и становится прозрачной, когда такт в лог. 1, как показано на затененной области сигнала "SYNC LATCH". Значение сигнала защелкивается, когда системная тактовая частота переходит в лог. 0. Значение попадает в регистр PINxn на последующем положительном перепаде тактов. Как показано двумя стрелками tpd,max и tpd,min, одиночное изменение сигнала на выводе будет задержано на время от 0.5 до 1.5 периода тактовой частоты, в зависимости от момента, когда произошло изменение.
Когда происходит обратное чтение программно установленной величины цифрового сигнала на выходе, должна быть вставлена инструкция nop, как это показано на рис. 14-4. Инструкция out устанавливает сигнал "SYNC LATCH" на положительном перепаде тактов. В этом случае задержка tpd через прохождение синхронизатора составит 1 период системной тактовой частоты.
Рис. 14-4. Синхронизация при чтении программно установленного значения на выводе.
Ниже приведены примеры кода, где показано как установить выводы разрядов 0 и 1 порта B в состояние лог. 1, и выводы разрядов 2 и 3 в лог. 0, и определить выводы порта с разрядами 7..4 как входы, где разрешены резисторы pull-up на выводах разрядов порта 6 и 7. Полученные значения на выводах порта вычитываются обратно, однако как обсуждалось ранее, добавлена инструкция nop, чтобы была возможность правильно прочитать только что установленные значения на выводах порта.
Пример кода на ассемблере:
...
; Настройка резисторов pull-up и установка выходов в лог. 1.
; Задается направление работы для выводов порта.ldir16,(1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0)
ldir17,(1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0)
outPORTB,r16outDDRB,r17
; Добавление инструкции nop для синхронизации.nop
; Чтение выводов порта.inr16,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.
Рис. 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. Для дополнительной информации обращайтесь к описанию альтернативной функции в даташите на используемый микроконтроллер.
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.
~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.
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 может работать как вход внешнего источника прерывания.
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).
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
Примечание: биты 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
DDRB – The Port B Data Direction Register
PINB – The Port B Input Pins Address(5)
PORTC – The Port C Data Register
DDRC – The Port C Data Direction Register
PINC – The Port C Input Pins Address(5)
PORTD – The Port D Data Register
DDRD – The Port D Data Direction Register
PIND – The Port D Input Pins Address(5)
Примечание (5): запись в регистр PINx предоставляет функцию триггерного переключения выводов порта GPIO в противоположное состояние (toggle). Запись лог. 1 в бит PINxn переключает значение соответствующего бита в регистре PORTxn, независимо от значения бита DDRxn. Обратите внимание, что инструкция SBI может использоваться для переключения одного бита в порту.
Подскажите как на atmega328p заставить порты PB6 и PB7 работать как выходы? Настроил фьюзы на работу от внутреннего генератора. Загрузил подобие блинка. Все порты кроме bp7 и pb6 работают хорошо. Если на них нет нагрузки, то напряжение выходит постоянное в районе 4 вольт. Если нагрузить на 1 кОм, то на выходе импульсы с амплитудой 2 вольта. Если уменьшать сопротивление нагрузки то напряжение падает до нуля.
Комментарии
RSS лента комментариев этой записи