Дигитальные порты ввода/вывода

Все шины AVR читаемы и записываемы, если их использовать в обычном режиме ввода/вывода (англ. input/output, или I/O). AVR шины названы буквами латинского алфавита A, B, C и др. У некоторых AVR может отсутствовать шина A, не смотря на наличие шины B. Каждая шина 8-битная и обычно для каждого бита имеется отдельный вывод на контроллере. Выводы подчитываются по номерам, начиная с нуля. Для обоих направлений шины имеется два разных регистра. Так же для каждой шины существует регистр для определения реального направления, где значение бита 0 показывает, что вывод используется в качестве входа, а 1 – в качестве выхода. В общем, имеется по три регистра на одну шину:

Пример

Выводы 0-3 шины B требуется сделать входом, выводы 4-7 – выходом, установить порт 5 в высокое положение и считать значение вывода в переменную. Код программы на языке Си выглядит следующим образом:

#include <avr/io.h>
 
int main()
{
	unsigned char x;
 
	// Выводы 0-3 входом, 4-7 выходом
	DDRB = 0xF0;
 
	// Установка пятого порта в высокое положение
	PORTB |= (1 << PIN5);
 
	// Считывание значения ввода 0-3
	x = PINB & 0x0F;
}

В приведённом примере входы использованы в режиме Hi-Z, или высокого импеданса. В данном случае имеется дело с входом, который практически не нагружает источник сигнала. Подобный режим может пригодиться, если вывод используется в качестве шины данных. Если вывод используется в решении, соединяющем кнопку, выключатель или др. и землю, то следует во входе использовать резистор pull-up. Для этого в режиме входа требуется настроить выходной бит соответствующего вывода в высокое положение – в результате чего между напряжением питания и входом включится резистор, который будет держать уровень напряжения высоким, если его не уменьшает что-либо другое. Цель резистора pull-up – предотвратить „плавание“ входа (англ. floating) из-за статического электричества или других помех. После запуска контроллера все шины ввода/вывода по умолчанию находятся в режиме входа высокого импеданса.

В основном выводы шин IO используются помимо логичных соединений и в других перифериях. При желании использовать альтернативную функцию вывода, следует ознакомиться со спецификацией AVR, где указано, в каком режиме должен работать вывод. Например, при использовании вывода в качестве входа канала АЦП (аналогово-цифровой преобразователь), он должен быть настроен на режим входа и для генерирования сигнала ШИП (широко-импульсный преобразователь) – на режим вывода. Некоторые периферические модули определяют сами режим вывода IO.