# 15.Порты ввода/вывода
На микроконтроллере Atmega16 находятся 4 порта вврода/вывода: PortA, PortB, PortC и PortD. Каждый порт состоит из 8 независимых пинов и 3 регистров.
## Объяснение на русском
https://www.youtube.com/watch?v=E_G8mUHlDWM=
Предназначены для обработки цифровой информации
### Соотношение регистров

Как видно по схеме, данные всегда попадают в pinx.
В случае если схема настроена на вход, и мы выставим Portx = 0, то это не даст вообще никакого эффекта (оно ни к чему не подключается), если = 1, то он подключает к схеме пина [подтягивающий резистор](/YXQMaYXhTwKJK58rGkExlg), что обеспечивает большую стабильность определения данных
Если схема настроена на выход, то portx выбирает, к чему подключен выход, к питанию (1) или к земле (0)
В таблице видно это же (схема из даташита)

Здесь видно, что на включение pull-up резистра влияет еще и флаг **PUD** регистра **SFIOR**. 57 страница даташита. PUD - Pull-up disable. SFIOR - Special Function I/O Register. PUD = 1 вырубает вообще все pull up резисторы на контроллере
## Регистры:
- DDRx - задаёт направление работы (ввод или вывод)
- PORTx - чтение/запись в порт (на выход) или управление pull-up резистором
- PINx - чтение того, что в порте
[Описание регистров](https://hackmd.io/NnhJgnTqQDSuP2VcD7nbjw)
### Система ввода вывода
All AVR ports have Read-Modify-Write functionality when used as general digital I/O ports.
This means that the direction of one port pin can be changed without unintentionally changing the direction of any other pin with the SBI and CBI instructions. The same applies when changing drive value (if configured as output) or enabling/disabling of pull-up resistors (if configured as
input). Each output buffer has symmetrical drive characteristics with both high sink and source capability. The pin driver is strong enough to drive LED displays directly. All port pins have individually selectable pull-up resistors with a supply-voltage invariant resistance. All I/O pins have protection diodes to both VCC and Ground
Порты микроконтроллера - это устройства ввода/вывода, позволяющие микроконтроллеру передавать или принимать данные. Стандартный порт микроконтроллера AVR имеет восемь разрядов данных. Каждому разряду (или биту) соответствует вывод (ножка) микроконтроллера. Ножки микроконтроллера также называют пинами. Для обозначения портов используются латинские буквы А, В, С и т.д. Количество портов ввода/вывода варьируется в зависимости от модели микроконтроллера. Эти порты являются
двунаправленными 8-разрядными, т.е. каждый такой порт имеет 8 выводов (или пинов,
транскрипция англ. pin) позволяет читать или записывать до 8 цифровых сигналов. При этом выводы порта можно конфигурировать независимо, т.е. часть выводов может
работать на ввод, а другая часть на вывод. При использовании портов ВВ сначала требуется каждый из выводов сконфигурировать на ввод или вывод
## Пины:
### Схема пина:
> [name=Boyarkin Alexandr] Схема, которую
> требует Селезнёв (я у него спрашивал)

#### Объяснение схемы из ролика с ютуба
Pin - конкретный контакт (например, PB7)
Data Bus - шина для чтения данных, с помощью которых можно получать значения с регистров
треугольнички - это цифровые ключи. Если сигнал сбоку приходит с 1, то данные через него идут.
от пина вниз идет область чтения сигнала из пина:
Если у процессора стоит контакт SLEEP, то контакт просто отключается и информация дальше не идет. В этой части схемы есть два треугольничка, которые находятся друг в друге. Это аналоговый ключ, который позволяет идти сигналу в обе стороны. Управляется сверху и снизу.
Дальше идет триггер шмитта, который приводит возможно кривой сигнал с пина (который имеет право быть не строго 0/5 вольт) к нормальному цифровому уровню 0|1, устраняя плавающие промежуточные значения. (треугольник с буквой z)
дальше идет схема синхронизации: она работает на двухступенчатом D триггере, тактовая частота которых берется из I/O Clock (как она высчитывается). Это необходимо, чтобы мы могли получить значение, которое было в пине во время отправки команды не чтение, а не которое обновилось, в процессе того такта, как мы его получали. Таким образом, когда мы подаем команду RPx о том, что мы хотим прочитать значение с пина, мы читаем не непосредственно с пина, а с D триггера.
----
Верхняя часть схемы отвечает за управлением порта и записью в него сигнала
Когда мы через команду WDx изменяем направления пина, это значение запихивается в Dтриггер. Когда мы посылаем команду о том, что хотим прочитать направление пина, с этого же триггера информация и берется.
Если на этом триггере стоит 1, то информация идет на треугольничек по середине, что открывает возможность DТриггеру по середине изменить информацию в пине. DТриггер по середине хранит информацию с регистра Portx.
Оба триггера могут быть обнулены при подаче внутреннего сигнала RESET.
---
На самом верху схемы обеспечивается подключение pull-up резистора. Там стоит НЕ PUD И НЕ DDRx И PORTX. Если итоговое выражение истино, то pull-up резистор подключен. Вот этот неполный прямоугольник в углу сверху слева это транзистор.
---
Судя по схеме, данные с пинов не идут сразу на регистры, а изменяются по нашему запросу командами in/out
### Альтернативные функции портов
(cхемы здесь из даташита)
Как соотносится эта схема со схемой 23? Вообще что конкретно она значит?
Включение какой-либо альтернативной функции запрещает использовать порт для другой альтернативной функции или для общего ввода/вывода. При попытке что-то туда записать это просто не произойдет

#### Overriding signals
Эти значения перекрывают те значения, которые ты вводишь в регистры PORTX, DDRX.
PUOE - разрешает альтернативно изменять pullup регистр
PUOV - альтернативное управление pull-up регистром
DDOE - разрешает альтернативно изменять направление
DDOV - альтернативное управление направлением
PVOE - разрешает альтернативно изменять значение в порте
PVOV - алььтернативное значение в порте
DIEOE - позволяет выбирать, запрещать ли принимать значения во время SLEEP или во время DIEOV = 1
DIEOV - если = 1, читать данные можно
DI - Цифровое значение с пина (полученное до синхронизации)
AIO - Цифровое значение с пина (полученное до проверки на sleep и DIEOE) и изменения тригерром шмитта
:::spoiler Табличка overriding signals

:::
:::warning
Дальше будут еще и таблички с overriding signals. Особо не вчитывайся, все равно не понятно
:::
#### Port A
Все 8 портов - аналоговые входы для АЦП. Важно, обычно порты используются для восприятия цифровой информации, поэтому там стоит триггер шмитта, который преобразует все сигналы в 0 или 1. Но информация на АЦП идет из overriding signal = AIO, который получается до обработки триггером шмитта
Важно перед тем, как трогать эти порты проверить, что ацп не работает (ну или хотя бы не этот вход использует). Иначе ацп может выдать кривой результат (так как ацп не переопределяет сигналы, запрещающие манипуляции с портами, изменить там данные все же возможно)
:::spoiler Таблички



Здесь почти везде 0, потому что АЦП использует порты только как вход
:::
#### Port B
PB5-PB7: инфа для [SPI](/c3KELy6fRWyH9_UnxYCX9g)
PB3-PB2 - для аналоговых компараторов, погуглить больше
PB3 также используется для таймер\счетчика
PB2 также используется как вход для обработчика прерываний IN2
PB1-PB0 - внешние тактовые импульсы для [8 битных таймеров](/ttfdHMD3Rrabf2KNMRe74A)
PB0 также используется как XCK (USART external clock) [18. USART](/BwlGJ88fTHG0MM5dZCP3fg)
:::spoiler Таблички


:::
#### Port C
PC7, PC6 - Timer oscillator [support: Устройство 8битного таймера](/ttfdHMD3Rrabf2KNMRe74A). А я там на схеме его не вижу, видимо схема неполная
PC5-PC2 - JTAG
PC1,PC0 - TWI [19. Архитектура I2C(TWI) Two-wire serial interface](/PzkW7zlbSQy_4qCo_F_EyQ)
:::spoiler Таблички



:::
#### Port D
PD7- PD4 - Надо погуглить. 63 страница [support: Устройство 8битного таймера](/ttfdHMD3Rrabf2KNMRe74A)
PD3, PD2 - источники внешних прерываний [Прерывания](/Tun8u1j-QJSgYGSeV2K34Q)
PD1, PD0 - USART [18. USART](/BwlGJ88fTHG0MM5dZCP3fg)
:::spoiler Таблички



:::