Neste artigo descreveremos como usar memórias externas tipo EEPROM - serial com microcontroladores. O leitor também receberá informações sobre a comunicação padrão I2C, utilizada pelas memórias selecionadas para este projeto.

Márcio José Soares

 

Nota: Este artigo é de 2007.

 

 

A proposta

 

Quantas vezes o hobista ou estudante de Eletrônica que gosta de desenvolver suas próprias soluções não se deparou com a necessidade de coletar alguns dados vindos de sensores e outros através de um circuito microcontrolado? E quantas não foram as vezes onde se fazia necessário guardar estas informações para posteriormente processá-las?

Pensando nisso, desenvolvemos o circuito que será apresentado aqui. Ele permite preparar um pequeno banco de memória EEPROM de até 2 kbytes! Este tamanho pode ser estendido até 16 kbytes com a alteração de alguns componentes e do programa de controle (neste artigo detalharemos o uso até 2 kbytes).

Para muitos usuários 2 kbytes de memória EEPROM pode parecer pouco, mas se levarmos em conta que muitos microcontroladores possuem memória EEPROM interna da ordem de 128 Bytes como, por exemplo, o PIC16F628A Microchip®, os 2 kbytes propostos são bem mais interessantes.

As sugestões de uso para um banco externo como o que propomos são ilimitadas. Tudo dependerá da criatividade de cada um. Como exemplo, podemos citar algumas aplicações que podem utilizar o banco de memória memo-4. São elas:

• Aplicação em um data logger,

• Mini servidor web (para guardar a página e outros dados);

• Relógio de ponto eletrônico;

• Mini terminal de dados stand alone (operação off-Iine);

• etc.

Como dito anteriormente, o limite para a aplicação do circuito proposto depende apenas da criatividade e conhecimentos de cada um.

 

 

Comunicação I2C

 

O protocolo I2C (Inter-Integrated Circuit) é do tipo serial síncrono e foi desenvolvido originalmente pela Philips® em meados da década de 1990. Atualmente ele está presente em uma série de dispositivos eletrônicos e componentes dos mais variados tipos como: microcontroladores, controladores de LCD, memórias, dispositivos de I/O, relógios de tempo real (RTC), entre outros. As vantagens deste tipo de comunicação são muitas e dentre elas podemos citar:

• Barramento de simples controle: mestre / escravo (master/slave) com endereçamento resolvido via software ou hardware;

• Interface de comunicação interna ao dispositivo, o que facilita o uso deste;

• Permite a ligação de dispositivos com tensões de alimentação diferentes graças as vias de comunicação tipo open drain;

• Excelente taxa de comunicação (velocidade): 100 kbps no modo Standard, 400 kbps no modo Fast e até 3,4 Mbps no modo High Speed;

• Modo de comunicação síncrono, o que permite que dispositivos de velocidades diferentes sejam conectados ao mesmo barramento usando a taxa de comunicação do dispositivo de menor velocidade;

• Boa imunidade a ruídos elétricos;

• Flexibilidade no barramento para inclusão (ou exclusão) de um dispositivo escravo sem afetar os demais de mesma natureza;

• etc.

Porém, nem tudo "são flores" e o padrão I2C também possui algumas desvantagens:

• Número de dispositivos ligados a um mesmo barramento limitados a 128 dispositivos no modo normal (7 bits para endereçamento) ou 1024 dispositivos no modo estendido (10 bits no endereçamento);

• O barramento, devido às suas características elétricas, não pode percorrer grandes distâncias ficando estas limitadas ao circuito principal. O barramento deve ser utilizado para comunicação entre dispositivos inseridos internamente em um equipamento e nunca externamente (em alguns casos esta regra pode ser quebrada, desde que o cabo e a distância sejam pequenas: > 2 metros);

• Devido ao modo de comunicação mestre / escravo, a rede não pode ser compartilhada com vários dispositivos se comunicando ao mesmo tempo. Toda e qualquer comunicação é sempre feita entre o mestre e o escravo, sendo esta iniciada sempre pelo dispositivo mestre.

Apesar disso, o protocolo I2C é excelente para uso na comunicação entre dispositivos como um microcontrolador (elemento mestre) e alguns dispositivos como: memórias, RTCs, controladores de I/O, etc (dispositivos escravos). Fica óbvio que a realização do projeto será simplificada, pois o padrão de comunicação entre os vários dispositivos será o mesmo e o barramento usado também. A figura 1 apresenta um exemplo típico de aplicação I2C.

 


| Clique na imagem para ampliar |

 

 

A comunicação I2C usa duas vias de comunicação tipo open drain: Dados (SDA) e Clock (SCL). A via SDA é bidirecional e serve para a troca de dados seriais entre o dispositivo mestre e o dispositivo escravo. A via SCL é usada para sincronismo (clock de comunicação) entre os dispositivos mestre e escravo e é sempre controlada pelo dispositivo mestre. A figura 2 mostra o diagrama de tempos-padrão para a comunicação I2C.

 


| Clique na imagem para ampliar |

 

 

Observando a figura 2 o leitor pode perceber que temos um procedimento de comunicação bastante simples no protocolo I2C:

• 0 dispositivo mestre inicia a comunicação (SDA em nível lógico "1" e SCL em nível lógico "0");

• Esse mestre envia os bits de endereçamento. Todos os dispositivos escravos recebem, mas apenas o dispositivo escravo que possui o endereço enviado responderá;

• O dispositivo mestre envia então o bit de comando — escrita ou leitura;

• O dispositivo escravo retorna através da via SDA o sinal de ACK (Acknowledge);

• O dispositivo mestre ou escravo (dependendo da operação — escrita ou leitura) envia pacotes de 8 bits de dados, que serão sempre seguidos de um sinal ACK enviado pelo dispositivo que aguarda os dados (escravo ou mestre);

• O mestre encerra a comunicação (SDA e SCL em nível lógico "1").

O leitor deve ter em mente que os dispositivos I2C possuem funções diferentes e sendo assim, o modo de operá-los também é diferente. O protocolo é válido apenas para a padronização da comunicação no barramento. O uso de cada dispositivo pode depender do acesso a registros internos com envio de comandos específicos para isso e outros.

A forma de comunicação já foi demonstrada, mas cabe ao desenvolvedor estudar cada um dos dispositivos que irá usar. Para isso basta ler atentamente os datasheets e notas de aplicações de cada componente. Estas informações estão sempre presentes no site do fabricante! Use-as constantemente!

 

 

Circuito e funcionamento

 

A figura 3 traz o circuito elétrico do nosso banco de memória externo memo-µC. Ele apresenta oito memórias EEPROM AT24C01A ATMEL (Cl1 a Cl8). Cada uma destas memórias pode armazenar 1 kbit ou 128 bytes (1024/8). Como temos oito memórias, podemos afirmar que o banco tem capacidade de armazenamento igual a 1 kbytes (128 x 8). Se utilizarmos neste banco, memórias AT24CO2A, também da ATMEL, teremos um banco de memória com capacidade máxima de 2 kbytes.

 


| Clique na imagem para ampliar |

 

 

C1 a C8 são capacitores de desacoplamento e ajudam a filtrar possíveis ruídos vindos da fonte de alimentação. O capacitor C9 aumenta o nível do filtro da fonte.

O conector JP1 serve para conectar o banco de memória ao circuito principal e possui as duas vias de comunicação I2C (SDA e SCL), um ponto de alimentação +5 VDC e um GND (terra).

O LED1 ajuda a demonstrar que o circuito está ligado. R1 é o resistor limitador de corrente para LED1. Esta aparente alegoria tem um simples motivo: como a alimentação pode ser controlada de forma externa (através do circuito principal) e as memórias são do tipo "não voláteis", é possível utilizar mais de um banco memo-µC num mesmo circuito. Se usarmos, por exemplo, 8 bancos de 2 kbytes teremos um total de 16 kbytes de memória disponíveis.

O LED2 foi inserido no circuito para demonstrar a presença de comunicação entre o banco de memória e o circuito principal. Seu controle é feito através de Q1. Sempre que houver a presença do sinal SCL no barramento e a placa estiver devidamente alimentada (+5 VDC), o LED irá piscara uma frequência igual a usada no barramento.

Na menor velocidade (modo standard) o período será igual a 0,000001s. A esta velocidade o piscar é quase que imperceptível, e o usuário terá apenas a impressão do LED estar simplesmente ligado. R2 é o resistor de polarização de base para Q1 (que controla LED1). O resistor R3 mantém o transistor Q1 em corte, e consequentemente o LED2 apagado, quando o sinal SCL não estiver presente.

Os resistores de pull-up necessários as vias de comunicação SDA e SCL, pois estas são do tipo open drain, não estão presentes na placa, mas são precisos e devem ser previstos no projeto do circuito principal que fará uso do memo-µC.

 

 

Montagem

 

A figura 4 ilustra nossa sugestão do layout para a confecção de um circuito impresso. Este foi o desenho usado em nosso protótipo. O leitor que preferir poderá montar o banco em uma placa do tipo padrão ou ainda em uma matriz de contatos. A escolha é livre.

 


| Clique na imagem para ampliar |

 

 

Comece por soldar os resistores R1, R2 e R3. Os mesmos não são polarizados e não requerem preocupação maior ao montá-los na placa. Apenas tome cuidado para não os trocar entre si, visto que suas resistências são diferentes. Caso tenha dúvida, use a lista de materiais para identificá-los.

Os capacitores, C1 a C8, são cerâmicos e também não são polarizados. Todos possuem o mesmo valor e o leitor não terá dificuldades em sua montagem na placa. O capacitor C9 é do tipo eletrolítico e polarizado. Tenha cuidado para não o montar invertido na placa.

O transistor Q1 também requer um maior cuidado para não o montar invertido. LED1 e LED2 precisam, igualmente, do mesmo cuidado. Como sugestão é interessante que LED1 seja vermelho e LED2 verde, por exemplo. Com cores diferentes fica mais fácil identificar como a placa está sendo operada.

Os Cls também são polarizados e merecem todo cuidado na sua inserção na placa. O uso de suportes para os mesmos é altamente recomendável, pois facilita a conexão dos Cls de maneira segura e rápida.

O conector JP1 usado em nosso protótipo é do tipo "barra de pinos". Caso o leitor não o tenha em mãos, poderá utilizar fios para conectar a placa ao seu circuito principal.

 

 

Um circuito auxiliar para testes

 

Para podermos testar o memo-µC o autor desenvolveu um pequeno circuito, presente na figura 5. A ideia é interagir com o banco de memória memo-µC através do canal serial de um PC, usando um microcontrolador PIC16F628A como interface entre o PC e o memo-µC.

O circuito de teste é composto basicamente por um microcontrolador PIC16F628A. Escolhemos este microcontrolador para nossos testes por acreditarmos ser este um dos mais difundidos entre nossos leitores, porém nada impede que o leitor faça os seus testes utilizando seu microcontrolador preferido.

O LED presente no circuito é apenas uma alegoria que ajuda a informar que o circuito está em operação, pois o mesmo pisca a uma frequência de 1 Hz. O MAX232 faz a conversão dos níveis de tensão presentes na porta RS-232 de um PC para padrão TTL presente nos pinos de 1/0 do microcontrolador ligados a sua USART interna, e vice-versa. Aconselhamos a montagem do mesmo em uma matriz de contados, uma vez que este circuito é apenas para testes do banco de memória memo-µC.

 

 

Programa para o circuito auxiliar

 

Em nosso site disponibilizamos o programa memo_crt_24c01.c desenvolvido na linguagem C. Utilizamos para montagem e compilação deste exemplo o compilador PICC CCS (http://www.ccsinfo.corn).

 

Nota: Na época em que o artigo foi escrito. Hoje não mais existe.

 

A empresa CCS fornece uma versão demo que poderá ser utilizada pelo leitor em seus testes. Esta versão possui algumas limitações como os tipos de microcontroladores habilitados e também no tamanho máximo do programa a ser compilado, porém é uma boa alternativa para aqueles que desejam "entrar" no mundo da programação na Linguagem C, mais especificamente dedicada aos microcontroladores PIC Microchip.

É importante compreender que o leitor não precisa compilar o código fornecido para realizar os seus testes, conforme proposto. Junto ao código-fonte ele encontrará o arquivo memo_crtl_24c01.hex que poderá ser utilizado para gravar o microcontrolador de forma direta, sem a necessidade de uma recompilação. O uso do compilador só será necessário se o leitor desejar alterar o programa fornecido.

O programa foi ricamente comentado para ajudar nosso leitor na sua compreensão. Porém, a seguir, trataremos um pouco sobre o seu funcionamento descrevendo as operações mais importantes do programa.

 


| Clique na imagem para ampliar |

 

 

Nota: O autor Márcio José Soares tem o hábito de inserir linhas de comentários em seus programas no intuito de ajudar o leitor na compreensão deles. Estas linhas devem ser lidas atentamente por quem deseja utilizar tais códigos-fontes. Elas contêm informações sobre a versão do compilador usados, como os pinos de I/0 foram utilizados, além de detalhes a respeito do funcionamento das funções presentes no código-fonte, entre outras. Ao estudar um código-fonte, use as linhas de comentários!

 

Um detalhe a ser comentado sobre este programa é o uso da biblioteca 24C01.c, fornecida pela CCS no pacote do compilador (.\PICC\Drivers\24C01. c). Junto ao código-fonte apresentado em nosso site, o leitor encontrará a mesma devidamente adaptada (foram inseridos, pelo autor, cabeçalhos explicando o funcionamento de cada função para auxiliar o estudo das mesmas por parte dos leitores).

Na figura 6 temos o fluxograma que descreve a operação do programa desenvolvido para o exemplo proposto neste artigo.

 


| Clique na imagem para ampliar |

 

 

O programa começa configurando o microcontrolador, definindo o modo de uso dos pinos (entrada ou saída), o tempo para o WDT (Watch Dog Timer - relógio "cão de guarda" que evita que o programa se perca e, assim, que o microcontrolador trave por algum motivo), a configuração do Timer1 (interrupção responsável pelo "piscar" do LED) e a habilitação da USART do microcontrolador (com interrupção para recepção dos dados através da RS-232).

Após a configuração do microcontrolador, o programa configura as portas de comunicação com as memórias EEPROM. As funções de controle para as memórias foram aproveitadas de uma biblioteca do próprio CCS-C (compilador selecionado para os testes). O módulo 24C01.c sofreu apenas algumas modificações para se adequar ao funcionamento com o memo-µC e recebeu também comentários em nossa língua para facilitar a compreensão do leitor. O estudo deste arquivo é recomendável para quem quer saber como a comunicação entre o microcontrolador em questão e as memórias é feita.

As operações mais importantes do programa são tratadas através de interrupções. Uma destas operações é realizada pelo Timer1 do microcontrolador. Este temporizador gera uma interrupção no microcontrolador a cada 0,526 segundos (com clock operando a 4 MHz). Quando isso acontece, a função trata_int() é chamada. Esta função verifica quantas interrupções aconteceram: se duas (2 x 0,526 = 1,052 segundos) a função troca o estado atual do LED, fazendo-o piscar na frequência de 1 Hz.

Temos no programa, inclusive, a interrupção para tratamento de um dado qualquer recebido do PC. O leitor notará que sempre que um dado for recebido, o microcontrolador efetuará a leitura do mesmo e realizará uma ação. Esta tanto pode ser imediata e ligada ao banco memo-4, como também o envio de uma outra mensagem complementar solicitando mais um dado. Estas mensagens basicamente servem como ajuda para o usuário com os comandos que podem ser utilizados.

Temos seis opções válidas:

1 — Seleciona banco (1 a 8): permite selecionar em qual memória (Cl1 a Cl8) será gravado ou lido um dado;

2 — Apaga banco (1 a 8): possibilita apagar a memória (Cl1 a Cl8) selecionada;

3 — Grava dado (endereço): permite gravar um dado no endereço solicitado, dentro do banco previamente selecionado;

4 — Apaga dado (endereço): possibilita apagar um dado no endereço solicitado, dentro do banco previamente selecionado.

5 —Dump da memória em ASCII: mostra o conteúdo da memória (Cl1 a Cl8) previamente selecionado, no formato ASCII.

6 - Dump da memória em HEX: mostra o conteúdo da memória (Cl1 a Cl8) previamente selecionado, no formato hexadecimal.

priority RDAO, timer inserida no começo do arquivo memo_crtl 24c01.h, definimos qual interrupção tem maior prioridade. No caso definiu-se a interrupção da USART.
priority RDAO, timer inserida no começo do arquivo memo_crtl 24c01.h, definimos qual interrupção tem maior prioridade. No caso definiu-se a interrupção da USART.

 

 

 

Teste e uso

 

Para que o leitor possa realizar, com êxito, o teste proposto neste artigo são necessários os seguintes itens:

• Circuito de testes montado;

• Microcontrolador devidamente gravado com o programa de teste;

• Computador Pessoal (PC) com uma porta serial RS-232 disponível;

• Um cabo de comunicação RS-232 (facilmente encontrado em lojas de informática);

• Programa Terminal instalado no PC como, por exemplo, o Hyper Terminal do Windows, devidamente configurado para operar com a porta COM livre em seu PC, velocidade de 9600 bps, sem paridade, número de bits de comunicação igual a 8, número de stop bits igual a 1 e nenhum controle de fluxo (9600, n, 8, 1).

Após a montagem de ambos os circuitos (memo-µC e circuito de testes, este último em uma matriz de contatos ou placa padrão), é sempre aconselhável uma minuciosa verificação. Jamais diga a si mesmo "tenho certeza absoluta de que tudo está certo" sem ao menos ter feito uma boa verificação. Cometer enganos é comum e estes podem ser corrigidos antes de qualquer teste, evitando a perda de componentes, tempo e dinheiro. Use o bom senso e sempre verifique suas montagens!

A figura 7, exibe nossa montagem para o circuito de testes realizada em uma matriz de contatos, juntamente com a placa memo-µC. Nesta montagem usamos também a placa "Conversor RS-232/TTL duplo", publicada na Edição n° 116 para realizar a comunicação entre o microcontrolador e o PC. Se o leitor possui esta placa (ou revista, com todas as dicas para a montagem da mesma) poderá utilizar este acessório em sua montagem de testes. Caso contrário, terá de montar a parte conversora apresentada no -circuito- de testes conforme indicado no circuito elétrico.

 


| Clique na imagem para ampliar |

 

 

 


| Clique na imagem para ampliar |

 

 

Após a configuração do programa terminal, alimente o circuito. O LED deverá piscar na frequência descrita (1 Hz). Neste momento o leitor poderá ver o menu para uso da aplicação, conforme ilustra a figura 9.

Um pequeno teste pode ser realizado da seguinte maneira:

1) Selecione o banco 2;

2) Grave um dado qualquer em um endereço (anote onde o gravou)

3) Selecione o banco 1;

4) Grave um outro dado em um endereço (anote isto também);

5) Selecione novamente o banco 2;

6) Faça o Dump da memória deste banco;

7) Apague o dado no endereço usado;

8) Faça um Dump novamente;

9) Agora selecione o banco 1 e repita as operações 6 a 8.

 


| Clique na imagem para ampliar |

 

 

Se tudo correu bem, o leitor terá conseguido inserir um dado qualquer em um ponto da memória e, em seguida, poderá verificá-lo através do comando Dump. Na sequência, o dado foi removido da memória e isto também pôde ser verificado através do comando Dump. O leitor também terá comprovado o emprego de mais de um banco de memória (Cl).

Para aplicar o memo-µC em seus projetos, ele terá de desenvolver um programa de controle. Para isto poderá utilizar o código-fonte fornecido, realizando algumas alterações para que a adaptação seja feita com sucesso. Deixaremos isso por conta de cada um, já que cada um tem suas próprias necessidades.

Apenas para exemplificar, vamos supor que em uma determinada aplicação é preciso guardar dados coletados ao longo do tempo. Estes dados terão de ser armazenados de forma sequencial e assim, a aplicação principal irá encarar o memo-µC como um banco de memória único com tamanho de x Kbytes. Para que isso seja feito, este programa terá de guardar em uma memória auxiliar qual Cl foi trabalhado por último e onde está o último ponto de memória ocupada deste Cl. Isto pode ser feito de duas maneiras:

1) O programa lê todos os Cls de maneira sequencial até encontrar um byte igual a "FFH" (byte inserido em um endereço vazio na memória);

2) O programa utiliza uma ou mais posições do próprio banco memo-µC (os dois últimos bytes do Cl8, por exemplo) para guardar o número do banco e posição de memória usados pela última vez.

Outras formas também podem ser experimentadas. Como dito anteriormente, o emprego do memo-4 não tem limites. Tudo depende da criatividade e conhecimentos de cada um.

 

 

Conclusão

 

Com algumas memórias de custo bem acessível, é possível montar um banco de memória externo com tamanho adequado para o uso em vários projetos. O uso de memórias seriais com um protocolo de comunicação simples e poderoso como o I2C favorece ainda mais o projeto final.

Esperamos ter colaborado com nosso leitor desenvolvedor, seja este um hobista/estudante ou profissional da área, pois as dicas apresentadas neste artigo são para todos! Bons estudos e testes! Até a próxima!