Todos os bus num AVR podem tanto ser lidos como escritos, se forem usados no modo logico de base de entrada/saída (input/output – I/O). Os bus AVR são identificados por letras a partir do início do alfabeto latino: A, B, C e por ai em diante. Alguns AVR podem não ter bus A, no entanto o bus B existe. Cada bus tem 8-bits e cada um dos bits normalmente tem o seu próprio pin de controlo. Os pins são controlados através de números começando em zero. Em ambas as direções do bus, existem dois registos separados. Alem destes, existe um registo que decide a direção real do bus, quando este tem o valor de 1 que identifica a saída, quando tem o valor 0 identifica-o como entrada. Juntos, cada bus tem três registos:
* PORT – para definir o valor de saída do bus * PIN – para ler o valor de entrada do bus * DDR – para definir a direção do bus
Exemplo
Tarefa: tornar os pins 0-3 do bus B entradas, pins 4-7 saídas, definir o pin 5 positivo e ler os valores dos pins 0-3 para a variável. O código em C para esta tarefa pode ser o seguinte:
#include <avr/io.h> int main() { unsigned char x; // pins 0-3 como inputs, 4-7 como outputs DDRB = 0xF0; // define o pin 5 como positivo PORTB |= (1 << PIN5); // lê os valores dos inputs 0-3 x = PINB & 0x0F; }
Neste exemplo, os inputs são usados em modo Hi-Zi (impedância elevada). Essencialmente, o input não coloca virtualmente qualquer leitura na fonte do sinal. Este modo pode ser necessário, se o pin for usado como bus de dados. É recomendável usar um registo pull-up no input, se o pin for usado como botão, como alternador ou como outra solução, onde o input se encontra ligado à terra. Para tal, o bit output do pin correspondente deve ser definido como positivo no modo input – resultando em que seja posicionado uma registencia entre a fonte de energia e o input, de forma a manter a voltagem do input positiva a não ser que seja desligada por algo. O objetivo de um registo pull-up é prevenir o transbordo do input devido a eletricidade estática ou a outras interferências. Depois de iniciar o controlador, todos os bus IO tem impedâncias altas por defeito.
Normalmente, os pins dos bus IO também são usados por outros periféricos, para além das ligações lógicas. Se existir a necessidade de usar a função de alternância, o modo de pin IO apropriado pode ser encontrado na folha de dados do AVR. Por exemplo, para usar o canal ADC como input, o pin deve estar em modo input, enquanto que para gerar um sinal PWM, deve estar no modo output. Por outro lado, alguns módulos de periféricos selecionam o modo pin IO por eles próprios.