sexta-feira, 2 de junho de 2017

GPIO nos microcontroladores: Uma porta para o mundo externo

GPIO - General Purpose Input/Output

As "Portas" em um microcontrolador e até mesmo em um microprocessador funcionam como uma passagem de informação entre o mundo interno desses dispositivos e o meio externo, são mapeadas por meio de endereços como as memórias e, de fato, em algumas arquiteturas as portas são acessadas como se fossem posições de memória mesmo, mas em outras elas são acessadas por meio de instruções específicas.

Nesse artigo vamos explorar as portas digitais, mas falarei sobre as portas analógicas em outro artigo, vamos começar pelas portas digitais de 1 bit que podem conter apenas uma informação lógica verdadeiro/falso, sim/não, 0/1, ligado/desligado ou qualquer abstração que você possa imaginar.

Portas de Saída
Quando o dispositivo precisa acessar enviar sinais para fora ele utiliza uma porta de saída, dessa forma a informação armazenada na porta se materializa na forma de um sinal digital em um determinado pino do circuito integrado. Para exemplificar, imagine que estamos trabalhando com um circuito que utiliza a tensão de 5v, quando gravamos o valor 0 (zero) na porta de saída teremos no pino do chip relativo à essa porta a tensão 0v, quando gravamos o valor 1 (um) a saída passa para 5v. Essa tensão pode variar um pouco de acordo com o chip mas essa variação não deve ser significativa, na descrição da porta de saída vamos falar sobre os limites aceitáveis.

Portas de Entrada
Para obter um dado do meio externo fazemos o processo inverso, lemos o valor de uma porta de entrada e teremos um bit 0 ou 1 de acordo com a tensão aplicada no seu respectivo pino do circuito integrado, no caso das entradas a tensão deveria ser 0v ou 5v, certo? sim, deveria, mas na prática não é exatamente assim pois como poderíamos tratar um valor de 2,5v? ele está no meio do caminho.
Para solucionar o problema as portas possuem limites para identificar essas tensões de entrada, esses valores variam um pouco de acordo com a tecnologia usada, você consegue essas informações no datasheet do circuito, só para se ter uma ideia os circuitos TTL identificam como 0 as tensões entre 0.0v e 0,8v e identificam como 1 as tensões entre 2.0v e 5.0v, já na tecnologia CMOS essas faixas ficam respectivamente entre 0.0v e 1.5v para o valor 0 e 3.5v a 5.0v para o valor 1.
Então pensamos, existe um buraco nessa faixa de valores possíveis entre 0v e 5v, não é mesmo? O que acontece quando uma tensão está dentro dessa faixa indeterminada? Exatamente isso, o valor a ser considerado será também indeterminado, ou seja, pode ser 0 ou 1, não há nenhuma garantia.

Existem portas digitais com mais de 1 bit? Sim, claro, mas cada bit está conectado à uma linha externa, ou seja, é como se fossem várias portas de 1 bit em paralelo. De fato a porta paralela (hoje em dia muito raro de se encontrar nos PCs) funciona em parte dessa mesma forma e pode ser usada como uma porta de saída de 8 bits, ao gravar um byte os valores de cada bit afetam as linhas na saída.

No acrônimo GPIO do título desse artigo o termo "General" significa que é uma porta de uso geral, ou seja, não foi criada com uma função específica de entrada ou saída e pode ser configurada para uma dessas duas formas de funcionamento via software, ou seja, antes de começar a usar uma porta GPIO devemos configurar se ela vai se comportar como uma porta de entrada ou saída.

Já comentei que não podemos deixar um valor na faixa indeterminada para que possamos garantir a informação que vamos usar, observe a figura abaixo como foi conectado um interruptor e podemos ler o valor da porta para saber se ele está aberto ou fechado.


Observe que o interruptor pode estar aberto ou fechado, de um lado ele se liga a porta de entrada e de outro se liga ao VCC (tensão de trabalho, que geralmente é de 5v). Com esse esquema a tensão VCC é conectada à porta de entrada quando o interruptor é acionado e podemos ler o valor na respectiva porta. Tudo certo não é mesmo? Nem tanto... quando o interruptor está aberto o pino da porta de entrada não está ligado à nenhuma tensão e acaba ficando em um estado indeterminado, qualquer interferência poderia fazer com que uma tensão apareça nessa porta e faça um acionamento indevido.
Como solucionar essa situação? A resposta é simples, usando um resistor "pulldown", esse resistor é ligado entre a porta e o GND (Terra ou 0v) assim quando o interruptor está aberto garantimos o valor 0 e quando fechado boa parte da tensão do VCC passa até a porta de entrada pois o resistor "dificulta" a sua passagem para o GND, esse resistor força a porta a ficar no estado baixo. Se for interessante inverter a lógica, podemos usar um resistor "pullup" ligando a porta a um resistor e este no VCC, isso força a porta a ficar em nível alto, o interruptor se liga na porta e do outro lado no GND. Veja na imagem abaixo os dois exemplos.


Nos próximos artigos vamos ver como funcionam as portas analógicas.

Nenhum comentário:

Postar um comentário