Sempre que escolhemos um microcontrolador para nossos projetos, um dos pontos importantes para esta escolha é o número de portas de I/O deste. Porém, muitas vezes o número de portas necessárias é superior ao número de portas presentes no microcontrolador escolhido ou até mesmo no único presente em nossa bancada. O que fazer então? Comprar um maior? Neste artigo, o leitor verá como aumentar o número de entradas e saídas de um microcontrolador, sem a necessidade da aquisição de um novo modelo.

Márcio José Soares

http://www.arnerobotics.com.br/

 

Nota: Este artigo foi publicado numa Mecatrônica Fácil de maio de 2004

 

Sempre que abordamos as portas 1/0 devemos pensar nestas como os 'braços" de um microcontrolador. São estas que "trazem" e "levam" as informações necessárias ao processamento da CPU. Sem elas, nosso microcontrolador, por mais "poderoso" que fosse, não poderia interagir com o "mundo exterior".

Estas portas dividem-se em dois grandes grupos:

- Portas digitais;

- Portas analógicas.

As portas digitais, como o próprio nome diz, trabalham obedecendo a lógica digital. Os níveis de tensão presentes nestas são sempre "1" (VCC) e "O" (GND). Temos então apenas dois estágios. Utilizamos estas portas para "ligar" ou "desligar" dispositivos como: transistores, reles, SCRs, TRIACs, etc.

Já as portas analógicas têm uma variação muito maior, indo de GND até VCC. Aqui não existem níveis "lógicos". Todas as tensões, dentro dos níveis GND a VCC, são possíveis. Estas portas são utilizadas em sua maioria para coletar informações de transdutores que transformam uma variável "física" em uma variável "elétrica". Estes transdutores podem ser: NTCs, PTCs (ambos resistores variáveis com a temperatura), potenciômetros, e muitos outros.

O leitor perceberá então que para ampliar as portas de um determinado microcontrolador, deve-se levar em consideração o seu tipo e uso.

 

AMPLIANDO AS PORTAS DE SAÍDA/ENTRADA DIGITAIS

Para melhor compreender o que será dito a partir de agora, nada melhor que um pouco de prática, aliada à teoria. Vamos tomar como exemplo um microcontrolador muito conhecido por todos e também muito utilizado, o Basic Step 1 (figura 1).

 


 

 

 

Este "pequeno notável" tem apenas oito portas de I/O digitais (bidirecionais) e cinco analógicas nas novas versões (consulte o fabricante em http://www.tato.ind.br). Os leitores que acompanham a Revista há algum tempo já estão familiarizados com o mesmo, pois já o viram em muitos projetos.

Porém para alguns circuitos, o pequeno BS-1 pode parecer desapropriado, justamente pelo número de I/0's presentes (apenas oito). Mas se utilizarmos alguns recursos da lógica digital será possível "ampliar" esse número de I/0's. aumentando significativamente suas possibilidades, permitindo ao leitor criar projetos "maiores" (em número de I/0's).

 

Importante: O leitor deve ter em mente que tudo o que for dito para o Basic Step I poderá ser aplicado a qualquer outro microcontrolador como o Basic Step 2K, o PIC e muitos outros. A lógica envolvida (tanto física como de programação) será basicamente a mesma para os muitos modelos e tipos disponíveis.

 

USO DE LATCHES E FLIP-FLOPS

Com o uso de latches e flip-flops. é possível ampliar o número de 1/0's de um microcontrolador. Os latches e flip-flops são considerados elementos importantes na lógica digital, pois são a base das memórias. Uma memória de computador, por exemplo, contém milhões de flip-flops. Cada bit destas é composto por um flip-flop.

A diferença básica entre o latch e o flip-flop é que o primeiro é um elemento assíncrono e o segundo, síncrono. Ou seja, o latch não trabalha sob o controle de um "clock" como c flip-flop. Veja a figura 2.

 


 

 

 

Portanto, latches e flip-flops diferem da lógica "combinacional" (portas AND, OR e NOT), pois levam em conta o "estado anterior" que se encontrava em suas entradas. Para ser mais claro, podemos dizer o seguinte: Em uma porta AND, OR ou NOT, sua saída depende exclusivamente de sua entrada. Se retirarmos o sinal de entrada, sua saída também deixará de existir. Já nos latches e flip-flops isso não acontece, pois, a saída leva em consideração o estado anterior. Lembram-se quando falamos que estes são a base de uma memória! Sendo assim, podemos dizer que tanto os latches e flip-flops têm o poder de "gravar" o último estado (estado anterior) de suas entradas em suas respectivas saídas.

Agora que temos um pouco da teoria, vamos à prática. Observe o circuito da figura 3. No esquema elétrico podemos ver um latch unidirecional de oito bits (74LS573) associado ao BS-1. O leitor notou que utilizamos apenas sete bits para dados e um bit para controle. Temos assim 14 portas de I/O para uso. Sete em POA a P6A (após o latch) e sete em POB e P6B (ligadas diretamente nos pinos do BS-1).

O 74LS573 possui alguns pinos extras, além das entradas e saídas dos latches:

- pino 11 - LE - "Latch Enable Input" - ativo em "1"

Este pino permite transportar os dados presentes nas entradas (D0-D7) dos latches para suas saídas (00-07).

- pino 1 - OE - "Tri-State Output Enable Input - ativo em "0"

Este pino habilita o "terceiro estado" das portas de saídas. Deve-se mantê-lo sempre em nível lógico "0".

Observando melhor o esquema dado na figura 3, poderemos entender melhor seu funcionamento assim como a lógica utilizada. Os pinos DO a D6 são ligados aos pinos PO a P6 do Basic Step. O pino P7 é ligado ao pino "LE" do 74LS573. Assim, podemos controlar sete saídas de maneira independente e mais sete saídas de maneira "conjugada". Se mantivermos o pino LE em estado "O" através de P7, as saídas válidas serão POA a P6B. Porém, se levarmos LE ao estado "1" as saídas válidas serão POB a P6B.

 


 

 

 

Mas, o leitor mais atento notará que com a lógica implementada apenas as saídas "B" estão isoladas. Porém para alterá-las, as saídas "A" também se alteram.

Para resolver este inconveniente, usamos ao invés de um único latch, dois então. Observe a figura 4. Neste novo circuito, a lógica implementada permite separar totalmente as portas. Se o pino P7, que agora controla os dois latches através de uma porta NOT, se mantiver em nível "1, teremos nível "1" no primeiro latch (pino LE deste) e nível "0" no segundo (também pino LE). Neste momento, o "transporte" dos estados dos pinos P0 a P6 é feito para este latch. Agora, se inserirmos nível "0" em P7, habilitaremos o segundo latch e desabilitaremos o primeiro. Teremos então a transferência dos dados para o primeiro ou para o segundo, nunca para os dois ao mesmo tempo, de acordo com o que se deseja.

Aumentamos assim o número de portas de oito para quatorze (sete em "A" e sete em "B"). Porém, o aumento se deu apenas em "saídas".

 


 

 

 

É possível, invertendo o sentido de um dos Cl's 741S573, obter sete saídas e sete entradas. Veja a figura 5. O leitor percebe que invertendo o outro latch poderíamos ter 14 entradas. Tudo depende do projeto em questão.

Um outro ponto importante sobre estas configurações é com relação ao programa para uso dos circuitos propostos. Quando usamos o. BS-1, sem nenhum recurso lógico a mais, podemos lançar mão dos comandos "HIGH", "LOW", "TOGGLE" é outros que trabalham os pinos de forma independente. Com o uso de latches, isso já não é mais possível ou mesmo recomendado.

Quando ativamos 'o pino "LE" do latch, ele transportará todos os oito bits presentes em sua -entrada para sua 'saída. Portanto, 'se alterarmos um ou mais pinos e depois um outro pino e ativarmos o "transporte" os resultados podem ser "inesperados".

Mas em programação tudo (ou quase) é possível: Podemos manter variáveis para controle dos estados anteriores de cada latch e alterá-las de acordo com nossas necessidades. Disponibilizamos em nosso site (http://www.arnerobotics.com.br/) alguns códigos-fonte para que o leitor possa acompanhar nossos exemplos. Sugerimos a todos que realizem o download para seu uso nos exemplos a serem descritos a seguir.

O leitor nota pelo código-fonte 1 que usamos o comando "OR" para ligar um determinado bit e o comando "AND" para desligá-lo. Assim, trabalhamos uma variável de memória e esta é depois transportada para o latch. Neste pequeno código-fonte, as quatorze saídas são ativadas sequencialmente,. uma a uma, a cada segundo e depois desativas.

 

USO DE SHIFT-REGISTERS

Os Shift-Registers são componentes que permitem "transportar" bits serialmente para latches que formaram saídas paralelas (1 byte) e vice-versa. No caso dos "Serial In / Parallel Out" (entrada serial, saída paralela) estes componentes recebem oito bits de forma serial síncrona e os disponibilizam estes bit's em forma de um byte paralelo, através de flip-flop's.

Os "Parallel In / Serial Out fazem a relação contrária. Recebem em seus flip-flop's um byte (oito bits em paralelo) e os transmitem de forma serial.

E esse transporte é feito de maneira controlada. E um microcontrolador pode facilmente assumir este 'controle" e ter então disponíveis saídas e entra-das de forma fácil e simples.

O circuito da figura 6 propõe o uso de um Shift-Register do tipo "Serial In / Parallel Out" (74LS164) para ampliar o número de saídas de um BS-1. O leitor nota que estamos usando, neste caso apenas três pinos para o seu controle. Assim, nesta configuração temos oito portas independentes disponibilizadas através do "Shift-Register" e mais cinco portas ligadas diretamente através do BS-1. Estas últimas podem ser configuradas como entrada ou saída. Temos então a somatória de oito saídas mais cinco entradas ou saídas, totalizando "13" portas de I/O.

 


 

 

 

E utilizando mais "shift-registers", poderíamos aumentar o número de saídas, como mostra a figura 7. Na configuração demonstrada teríamos um total de 20 I/O's, sendo 16 saídas nos "shift-registers" e 4 entradas ou saídas diretas do BS-1. Observem que todos os "shift-registers" compartilham alguns pinos de controle do BS-1, sendo apenas o pino para "clock" separado. Cada porta do BS-1 ainda livre pode controlar mais um "shift perfazendo um total de 48 saídas!

 


 

 

 

O código-fonte 2 demonstra como usar este componente para saída. Note que mantemos a ideia de uma variável para controlar a condição anterior de nossos bits em cada porta. Porém, seu transporte é feito de maneira bem diferente, se compararmos o uso de latches paralelos, como o 74LS573. Precisamos nos comunicar com o "Shift-Register" utilizando seus pinos de controle:

- pino "Clear" - utilizado para limpar os latches internos.

- pino "Clock" - utilizado para comunicação síncrona. É o clock que posiciona cada bit em seu respectivo flip-flop de saída. A transição é feita na borda de subida.

- Pinos "A" e "B" - Utilizados para Dado. Ambos em nível "1", o bit a ser deslocado terá valor "1", qualquer um em nível "0" o valor deslocado será "O".

O uso de um "Shift Register" do tipo "Parallel In / Serial Out" é similar ao já demonstrado. O que fazemos é colher o estado de nossas portas de maneira serial. Usamos o componente 74LS165 para isso. O código-fonte 3 demonstra seu uso.

Notem que podemos também aumentar o número de entradas, elevando o número de 74LS165 exatamente como feito com o 74LS164, além de aplicar ambos os componentes em um mesmo circuito para aumentar entradas e saídas ao mesmo tempo.

 

USO E CONDIÇÕES

O leitor deve ter muita atenção ao usar os recursos propostos neste artigo. Sem um programa "limpo" e bem montado, é muito fácil confundir-se e até mesmo não realizar as trocas de estados corretas para os I/O's implementados. Procure montar e depurar o programa que utilizará estes recursos de maneira bem cuidadosa para evitar "surpresas" desagradáveis.

 

Importante 2: Utilizando qualquer recurso dos citados aqui, não estaremos mais controlando diretamente os pinos de I/O do microcontrolador e teremos de manter sempre a informação de como "eles estão" (estado atual, quando saída) internamente em nosso programa e a melhor maneira de fazê-lo é através de uma variável.

 

Uma outra dica muito importante é com relação à velocidade destas "novas" I/0's. Como podemos notar, o programa de controle fica um pouco complexo, pois a operação com as I/0's não é feita mais de maneira direta, e isso consome mais "ciclos de máquina” e, portanto, torna-o mais lento (mas nada que configure a sua inutilidade!).

Ainda com relação à velocidade, temos também a velocidade dos próprios componentes empregados. Existem relações máximas de transição de estados internos, transmissão de dados e outras que devem ser observadas na construção de um projeto. Consultar os "datasheets" fornecidos pelos fabricantes é sempre uma boa atitude, antes de se culpar um programa (ou mesmo o programador) por uma provável falha.

Acreditamos também ter demonstrado ao leitor que o conhecimento de lógica digital, pode ajudar muito na construção e elaboração de um projeto com microcontrolador. Muitos pensam que esta necessidade não existe, mas o conhecimento de eletrônica digital aqui se mostrou totalmente necessário e bem-vindo. Sem este, com certeza, a única alternativa seria investir em um microcontrolador maior, com um número maior I/0's e mais caro! Porém, isso para muitos estudantes e hobistas, nem sempre é viável.

 


 

 

 

CONCLUSÃO

O leitor tem agora alguns recursos para realizar aquele projeto que necessitava de um maior número de I/0's, porém sem a necessidade de "trocar" de microcontrolador. E nas próximas edições continuaremos abordando este assunto, demonstrando o uso de outros componentes discretos para "aumentar" o número de portas de I/O de um microcontrolador. Bons testes e até a próxima!

 

1 - Basic Step

2 – 74 LS 164

2 – 74 LS 573

1 – 74 LS 165

1 – 74 LS 04