Arduino e as Memórias dos Microcontroladores ATMEGA

 

Como sabemos o espaço disponível para os sketches é limitado e por isso temos que nos preocupar com o código (tamanho e qualidade) para que não tenhamos a desagradável surpresa de ver o nosso projeto naufragar por este pequeno e importante detalhe.

atmega328P
atmega328P

Nos microcontroladores que equipam os Arduinos (ATMEGA328), temos três grupos de memória e seus respectivos tamanhos:

Flash 32KB, onde o sketch  é armazenado.
SRAM
(Static Random Access Memory)
2KB, onde o sketch cria e manipula as variáveis.
EEPROM
(Electrically-Erasable Programmable Read-Only Memory)
1KB, espaço de memória livre destinado aos programadores

 

Características das Memórias

As memórias Flash e EEPROM são do tipo não volátil, ou seja, a informação persiste após a alimentação ser desligada. A memória SRAM é volátil e os dados serão perdidos quando não houver energia.

Soneto de Fidelidade

“[…]Mas que seja infinito enquanto dure.”

Vinicius de Moraes

Vocês vão entender a menção ao poeta Vinicius de Moraes. As memórias Flash e EEPROM podem ser programadas e apagadas várias vezes, mas infelizmente isto não é para sempre. Ocorre uma deterioração interna do chip durante o processo de apagamento. Segundo o datasheet da ATMEL os ciclos de escrita e apagamento são de 10.000 para memórias Flash e 100.000 para memórias EEPROM. Há também o fator temperatura. Os dados são retidos nestas memórias por 20 anos a 85 graus centigrados e 100 anos a 25 graus centigrados.

Organização da memória EEPROM

Tomando como exemplo uma memória de 1KB, teremos 1024 posições com espaço de um byte cada. Então, cada posição pode armazenar valores inteiros de 0 a 255.

eeprom

No sketch teremos que controlar em qual posição faremos a leitura ou gravaçao deste byte. O exemplo a seguir vai deixar mais claro.

Exemplo Prático: Monitor de Temperatura com o LM35.

O objetivo é monitorar a temperatura ambiente, exibindo esta temperatura e a máxima anterior registrada na console serial.
A máxima anterior registrada está na posição 0 (zero) da EEPROM. Somente atualizamos esta posição se temperatura atual for maior que a máxima anterior registrada.

O esquema é bem simples: o terminal Vs do LM35 conectar no pino +5V do Arduino, o terminal Vout do LM35 conectar no pino analógico 0 (zero) do Arduino e o terminal GND (terra) do LM35 conectar no pino GND do Arduino.

esquema ligação Arduino e LM35

Usaremos os dois métodos responsáveis pela escrita e leitura: write() e read(). Para isto não podemos esquecer de  incluir a biblioteca EEPROM.h .

Sketch

#include <EEPROM.h>

void setup() {
  pinMode( 0, INPUT); // pino analogico 0
  Serial.begin(9600);
}

void loop() {
  unsigned int
  temperatura = 0,
  media = 0,
  registrada,
  amostras = 20,
  coleta;

  for ( coleta = 1; coleta <= amostras; coleta++ ) {
    temperatura = analogRead( 0 );
    temperatura = (5 * temperatura * 100) / 1024;
    media = media + temperatura;
    delay(500); // pausa entre as coletas
  }
  temperatura = media / amostras;
  registrada = EEPROM.read( 0 );

  Serial.print("Temperatura media = \t");
  Serial.print( temperatura );
  Serial.print("\tMaxima Anterior Registrada = \t");
  Serial.println( registrada );

  if ( temperatura > registrada || registrada == 255 ) { 
    // o valor padrao para uma posicao ainda nao gravada = 255
    EEPROM.write( 0, temperatura);
  }
}

 


3 respostas para “Arduino e as Memórias dos Microcontroladores ATMEGA”

Deixe um comentário