Leitura e gravação de memória EEPROM I2C externa no Arduino

1,888 views
Skip to first unread message

Webert Oliveira

unread,
Sep 11, 2012, 2:06:10 PM9/11/12
to arduino-brasilia
Amigos, 

estou com um baita problema e não sei nem por conde começar a resolve-lo.
Quero salvar alguns programas do Arduino em memória externa EEPROM, minha intenção é salvar programas inteiros na memória e depois fazer a leitura deles.
Deixando no Arduino apenas um programa de inicialização que vai escrever na serial qual programa eu quero que seja inicializado.
A questão é que todos os tutorial  que vi na internet e no site do Arduino, explica apenas como gravar valores.

Quero saber se é possivel inicializar programas partindo da I2C externa.

O que vou fazer é um video game, e quero que minha EEPROM seja como se fosse o meu cartucho, uma com vários jogos.
E dai eu selecionou qual será inicializado.
Quem puder me ajudar nisso.  

--
Atenciosamente
Webert Oliveira
W.O
BlueFrog

Helton Lidio

unread,
Sep 11, 2012, 2:29:32 PM9/11/12
to arduino-...@googlegroups.com
Webert, 

Acho que aqui esta a solução pro seu problema...



--
Você recebeu esta mensagem porque está inscrito no
Grupo "arduino-brasília" nos Grupos do Google.
E-mail: arduino-...@googlegroups.com
Url: http://groups.google.com.br/group/arduino-brasilia?hl=pt-BR
Sair: arduino-brasil...@googlegroups.com



--
att,
Helton Lìdio

Helton Lidio

unread,
Sep 11, 2012, 2:30:54 PM9/11/12
to arduino-...@googlegroups.com

Paulo Soares

unread,
Sep 11, 2012, 2:33:45 PM9/11/12
to arduino-...@googlegroups.com
Webert, por que você não usa a EEPROM ou a FLASH do arduino?

O ATmega328 tem 32KBytes de Flash e 1KBytes de EEPROM.

O que você vai gravar é muito grande?

Izaias Cabral

unread,
Sep 11, 2012, 2:39:18 PM9/11/12
to arduino-...@googlegroups.com
Webert, parabéns pela ideia, simples, mas muito legal mesmo. Não tenho grandes conhecimentos nessa área, mas especificamente na escrita e leitura de EEPROM usando o arduino tenho me dedicado muito, pois faz parte do conteúdo de microcontroladores que ministro. Irei estudar mais sobre o assunto e postarei o que conseguir. Gostaria de chamar os demais do grupo para estudarmos sobre isso, pois acredito que abre uma campo muito promissor para vários outros projetos além dos videos games. Mais uma vez parabéns pela ideia.
--
Izaias Cabral
www.robotica10.com.br
61  8117 9365

Webert Oliveira

unread,
Sep 11, 2012, 3:04:06 PM9/11/12
to arduino-...@googlegroups.com
Paulo o que eu vou gravar usa muita memoria, seria um coletanea de projetos gravados em EEPROM.
Não cabe na memória nativa do Arduino.

Helton o que é quase isso, mas é direto em EEPROM e não no SD, li o tópico mais o não explica direito o como fazer, vou pesquisar nessa linha que talvez inicialmente me sirva.

Izaias é algo muito interessante mesmo e tem várias aplicações, uma que seria um segundo passo é usar o shield do gameDuino junto com o modulo GPS para geolocalização e geoprocessamento.

Na verdade isso seria como os antigos processadores de mapas dos militares.
E para salvar a programação dos mapas eu precisaria de uma memória maior do que a do arduino, depois é só printar os dados por cima do mapa, imaginem isso com o ClimaDuino?   

Mas, tenho que vencer a primeira fase que é aprender as comunicações e gravações com memórias.
Inclusive tem como gravar em paralelos e em serial nessas memorias.
Algumas referencias:

Vicente Orru

unread,
Sep 11, 2012, 4:13:46 PM9/11/12
to arduino-...@googlegroups.com
Programa no ATmega rola apenas na memoria de programa, isto é imposto pela arquitetura do microcontrolador. Você muda o programa através do bootloader, então sua proposta é produzir um bootloader para transferir o programa de um tipo de memoria não volátil para a memoria de programa, certo? o bootloader que temos no Arduino transfere dados da serial para a memoria de programa. Estender memoria de dados, tem bons tutoriais, com todos os tipos de memoria não volatil. Sobre o bootloader devo pesquisar mais...você quer enviar pela serial qual programa que deve ser carregado na memoria de programa, então passa a rolar como um boot para o download do seu programa escolhido (sua aplicação).
é isso mesmo?   

Paulo Soares

unread,
Sep 11, 2012, 4:31:45 PM9/11/12
to arduino-...@googlegroups.com

O link mostra como gravar na memória flash do arduino.

Paulo Soares

unread,
Sep 11, 2012, 4:53:07 PM9/11/12
to arduino-...@googlegroups.com
Uma aula:

The ATmega8 (and 168, and probably others of the family) has three different types of memory:  flash, EEPROM, and RAM.  Flash is where your program lives; it's 8kb on the ATmega8.  EEPROM is where your program can store stuff between power cycles (e.g. configuration information that can be changed).  The ATmega8 has 512 bytes of EEPROM.  RAM is, well, RAM, where your typical variables are stored; there's 1k of this on the ATmega8.

I point this out because some folks don't differentiate between flash and EEPROM and use the terms interchangeably (because they're similar physically) but the ATmega has both and uses them for two completely different things.

The ATmega8 flash can be written ~10,000 times.  EEPROM can be written ~100,000 times.  both are non-volatile - they will retain their values when power is lost.  You can write to RAM as many times as you want, but the contents are gone if power is lost.  All three types of memory can be read an infinite number of times.

The AVR is a Harvard architecture - this means program memory and data memory are separate, with separate address spaces.  The ATmega8 actually has 3 address spaces - one for flash, one for EEPROM, and one for RAM.  This is different from your "typical" microprocessor, like a Pentium, where there is only one address space and it is shared between data and program (this is called a von Neuman architecture).  You'll find this Harvard architecture frequently in microcontrollers, as it simplifies some aspects of the design, allowing the CPU to be simpler (therefore faster and cheaper).

So, you have flash memory addresses 0 - 8191, EEPROM memory addresses 0 - 511, and RAM addresses 0 - 1023.

To begin to answer your question, flash and EEPROM can be written be an executing program (else the bootloader wouldn't work and we would all be using ICP programmers).  This process is neither fast nor straightforward, since the data has to be transferred a byte at a time from a register (and probably from RAM to the register first), then out to flash (or EEPROM).  flash and EEPROM are both slower to write than RAM.

To really answer your question, I would only attempt to use flash to store data that is configured at compile time and never changes (e.g. constant strings for prompts, messages and so forth), and be aware you'll have to manually copy the data out of flash before you can use it (e.g. send it to Serial.print()).

What you are asking can be done, but you need to have some understanding of the web page you referenced to read from flash; writing to it gets more complicated (I've never tried). 



Ñ¡£†öñ conceicao

unread,
Sep 11, 2012, 5:22:17 PM9/11/12
to arduino-...@googlegroups.com
Gostei da ideia, Imagino q estejas preparando o ATARIduino rsrsrsrs "quero ver colorido :p"
 
 tb tive algumas ideias  assim, só q ta dificil achar algo sobre eeprom  EXTERNA
 que tenho algumas em 'sucata'
 
abç. Nilton

Date: Tue, 11 Sep 2012 15:06:10 -0300
Subject: [arduino-brasilia] Leitura e gravação de memória EEPROM I2C externa no Arduino
From: wertol...@gmail.com
To: arduino-...@googlegroups.com

Webert Oliveira

unread,
Sep 11, 2012, 5:26:44 PM9/11/12
to arduino-...@googlegroups.com
Quando comecei a pesquisar vi isso que para fazer a leitura externar ela deve ser feita byte a byte. 
Eu quero simplesmente salvar meus Sketches em uma memoria EEPROM externa a 24LC512, e inicializar uma lista de programas no Arduino, como programa, escolher um dos sub programas e copilar esse para a flash para ser executado como se ele estivesse no Arduino.

Não cabe tudo na memória do Arduino, só um dos jogos já lota a memória do Arduino Mega.
Não quero mudar o bootloader para que ele busque direto uma outra memória, quero que inicialize o código de depois me dê a possibilidade de carregar outro.
O que quero fazer é simplesmente a mesmo logica de funcionamento dos antigos Ataris, onde tinha um cartucho gravado com um monte de jogo e vc escolhia qual seria carregado.
Na minha lista seria bem uns 10 jogos na lista.

Acho que é mais ou menos isso aqui:

Maurício Féo

unread,
Sep 11, 2012, 5:28:28 PM9/11/12
to arduino-...@googlegroups.com

Ola Webert,

Só é possível escrever na memória flash do arduino por instruções provenientes da zona de bootloader.
Portanto você terá ou que modificar o bootloader ou programar o avr na marra.

Ou seja, arduino não tem aplicação pra isso.

Abcs,

Paulo Soares

unread,
Sep 11, 2012, 5:29:12 PM9/11/12
to arduino-...@googlegroups.com
Poxa, se um único jogo não cabe na flash do Mega, como você pensa em carregar só esse jogo?

Acho que vai ter que pensar em outra coisa.

Webert Oliveira

unread,
Sep 11, 2012, 5:32:57 PM9/11/12
to arduino-...@googlegroups.com
Rodar jogos no Arduino é fácil, até aconselho, nem precisa de shield basta dois resistores usando a biblioteca TVout.
Agora colorido já é outros 500.
Para colorido eu uso o shield do gameduino que já tem o VGA e uma porrada de exemplos.  


Só que a memoria do Arduino é pouca para isso, ou eu mudo para outro microcontrolador, ou aprendo como aumentar a memoria dele. 

Webert Oliveira

unread,
Sep 11, 2012, 5:36:23 PM9/11/12
to arduino-...@googlegroups.com
Pô Féo, 
fala que tem jeito....
poxa, quero tanto fazer esse projeto. rsrsrrs  
Senão, vou ter de pegar um desses controladores novos parrudos e fazer uma versão de arduino só para isso.
Quero fazer algo que possa ser replicado depois,
Valeu galera, vou continuar estudando aqui na surdina e encontrando novidades eu posta aqui.  

Daniel de Souza Braga

unread,
Sep 11, 2012, 5:43:37 PM9/11/12
to arduino-...@googlegroups.com
Webert,

          Boa noite !!!

          Acho que é bem pela linha que o Féo explanou.

         Outra coisa, está pensando em colocar os arquivos do projeto (.pde) ou o código fonte (.ccp)? Porque esses arquivos são somente fontes, ainda precisam ser compilados, ou seja, terias que compilar na IDE e apenas colocar os hex após a compilação.

         É um bom projeto!

Att.,
-- 
Daniel Braga



2012/9/11 Webert Oliveira <wertol...@gmail.com>

Ñ¡£†öñ conceicao

unread,
Sep 11, 2012, 5:50:28 PM9/11/12
to arduino-...@googlegroups.com
 Se quizer montar um atari de verdade é mt facil são apenas 3Cis que nem sei se existem mais e um modulador de RF
      Ja consertei mt isso... tempos bons rsrsrsrsrs
abç; Nilton

 

Date: Tue, 11 Sep 2012 18:32:57 -0300
Subject: Re: [arduino-brasilia] Leitura e gravação de memória EEPROM I2C externa no Arduino
From: wertol...@gmail.com
To: arduino-...@googlegroups.com

Webert Oliveira

unread,
Sep 11, 2012, 6:26:53 PM9/11/12
to arduino-...@googlegroups.com
Daniel, 
tem alguns gravadores de EEPROM e a ideia é gravar direto em binário na EEPROM.
Quando a IDE copila ela faz isso com o codigo. 
O que quero e ler isso de uma outra memoria que não seja a interna.
Se for a interna, terei de ir para um controlador maior.
Vou fazer o teste em um Arduino mega 2560, colocando uns 4 jogos pequenos, posto um video e explico o que mais eu estou querendo.
Acho que fica mais fácil.
Salvar dados, tem muitos exemplos, agora programas inteiros, ai já complica um pouco.
Mas jeito eu sei que tem.
Esse é o principio de funcionamento dos games, toda parte de aplicação está em outros dispositivos.
E esse é passado/carregado  na hora da execução.
Obrigado povo pelas colocações.
Sigo quebrando cabeça.

Aqui meu prototipo, quero melhorar isso.

E chegar ao ponto de fazer umas brincadeiras assim:

Maurício Féo

unread,
Sep 11, 2012, 7:13:43 PM9/11/12
to arduino-...@googlegroups.com
Fala Webert..

Pensei em algo aqui:
Sei que a zona de bootloader do Atmega328 era configurávela a partir de uns bits, acho que nos fuses.
E tinha tamanhos pré-estabelecidos, eu só lembro de 2kb (duemilanove) e 512b (Uno), o que me dá a seguinte idéia:

Se você configurar a zona de bootloader do Uno por exemplo, pra ser de 2kb, significa que após execução do bootloader nativo, ainda terá 1,5kb de código dentro da zona de bootloader sobrando!
O desafio seria manter seu código dentro desses 1,5kb e fazer com que ele carregasse o jogo, executasse o restante da memória e sempre voltasse pra esses 1.5kb do "Weberloader".

Não sei se é viável, mas acho uma boa possibilidade.

Sobre como escrever na própria memória Flash, com certeza você acha isso no código do próprio bootloader do Arduino, que tem em algum lugar da pasta do Arduino.

Abraços,

Maurício Féo Rivello
engenheirando.com



Izaias Cabral

unread,
Sep 11, 2012, 7:13:57 PM9/11/12
to arduino-...@googlegroups.com
Que tem jeito , tem sim! O Webert disse tudo, quem teve a oportunidade de jogar em um ATARI, e desmontá-lo!! Pode observar que o cartucho era uma EPROM, na época uma EPROM com a janelinha para apagar o s dados via ultravioleta. O Z80, microprocessador da época nem era tão poderoso. O arduino é bem robusto, acredito que é bem possível sim, basta saber se é tão simples ou não. Começo a acreditar ser necessário um gravador de EPROM específico e não ser usado o arduino para efetuar a gravação

Ñ¡£†öñ conceicao

unread,
Sep 11, 2012, 7:40:44 PM9/11/12
to arduino-...@googlegroups.com
Ainda tenho uma lampada dessas Smiley nerd
só as eproms eu joguei fora quando me mudei pra ca
devia ter umas 50..uma caixinha cheia delas alem de uma renca de CIs TTL 74LS...
 
Bons tempos...
 

Nilton

Webert Oliveira

unread,
Sep 11, 2012, 8:41:27 PM9/11/12
to arduino-...@googlegroups.com
Mauricio, vou dar uma pesquisada sobre essa possibilidade.
Tem alguma indicação de uma boa fonta sobre isso?

E Izaias, eu pensei exatamente nessa possibilidade, de a gravação da EEPROM ser feita fora do Arduino.
E eu apenas colocar no meu codigo os endereções a serem lidos.
Se brincar, eu poderia até tirar o bootloarder e colocar direto o programa que vai fazer a leitura da EEPROM, assim eu ganharia todo o espaço da memoria.
Já que se funcionar, eu não preciso ficar grando sketch, e sim apenas gravar as memorias e pedir para fazer a leitura partindo de tar endereço em memoria externa.
Se eu estiver falando besteira me corrijam. rsrsrsrsr

Abaixo um esquema de um simples gravador de EEPROM usando a serial.     
Outras fontes:
http://www.centralaudioevideo.com.br/gravador.htm
http://virtuatec.com.br/pages/gravador-de-eeprom-pony%252dpro.html
http://juntatecnica.com/forum/index.php?topic=26063.0




ESQUEMA DO GRAVADOR DE EEPROM

Como visto o gravador de eeprom pode ser montado em casa usando poucos e baratos componentes. Pode ser feito em placa de circuito impresso ou numa ponte de terminais. Abaixo temos os esquemas do gravador para a porta paralela, porta serial e para os dois modelos de eeprom: 24XX e 93XX. Tais esquema foram retirados de um site chamado www.comunidadelectronicos.com/proyectos/eeprom.htm:

Esquema do gravador de eeprom para a porta paralela do micro

Esquema do gravador de eeprom para a porta serial do micro

Esquema do gravador de eeprom para a porta serial e dois tipos de CIs

Paulo Soares

unread,
Sep 11, 2012, 9:05:42 PM9/11/12
to arduino-...@googlegroups.com

Moço, o ATMEGA1280 tem 8KB de RAM. Se vc vai carregar alguma coisa tão grande que nem cabe no Mega, aconselho a procurar outro CI.

Webert Oliveira

unread,
Sep 11, 2012, 9:08:48 PM9/11/12
to arduino-...@googlegroups.com
Puts Paulo, vc não entendeu?

Eu quero algo de leitura movel que eu não precise gravar no controlador e sim numa memoria externa.

Ñ¡£†öñ conceicao

unread,
Sep 11, 2012, 9:23:06 PM9/11/12
to arduino-...@googlegroups.com
 
Webert
 

papo sério agora.
Independente da controladora que você use
Vc vai ter de dividir seus "rascunhos .Hex" em blocos que caibam
na flash de programa. e criar um "bootloader" para gerenciar
a gravação dessa memoria. como se fossem fases de um jogo.
Ou simular um Disk-drive com a leitura de uma lista "menu"
Eu pessoalmente daria preferencia a usar cartões de memoria "SD"
que alem de ser mais facil de manipular tem um limite bem grande de memoria.
 
 
at. Nilton
 

Paulo Soares

unread,
Sep 11, 2012, 10:54:05 PM9/11/12
to arduino-...@googlegroups.com

Eu entendi perfeitamente, desde o início inclusive. Mas acho que não consegui ser claro ainda.

O que eu quero que você entenda é que existe uma limitação de memória RAM que pode inviabilizar todo o projeto com ATMEGAS.

Não estou falando de espaço para armazenar o jogo. Estou falando de espaço para "rodar" o jogo.

Se o jogo tem mais de 128 ou 256 kilobytes (que varia conforme os melhores arduinos), muito provavelmente ele fará uso de diversas variáveis, matrizes e estruturas de dados complexas que precisam de espaço na RAM para que você consiga rodar o jogo. E quantos Kb de RAM tem o ATMEGA? Só 8 Kb.

Então, concluindo, se seu jogo não cabe na flash do ATMEGA, então provavelmente ele use mais que 8kb de RAM e, por isso, você  estará muito suscetível a escolher outro chip.

Consegui ser mais claro dessa vez?

Maurício Féo

unread,
Sep 11, 2012, 11:01:48 PM9/11/12
to arduino-...@googlegroups.com
Oras, isso é fácil de definir:

Segundo a wikipedia, o Atari 2600 tinha 4kB de ROM e 128 bytes de RAM.


Maurício Féo Rivello
engenheirando.com

Maurício Féo

unread,
Sep 11, 2012, 11:05:52 PM9/11/12
to arduino-...@googlegroups.com
O Master System, grandioso Master System, rodava num processador de 8-bits, 3.58 MHz e 8 KB de RAM!!!

Surpreendente... Alex Kid parece bem mais legal agora.

Maurício Féo Rivello
engenheirando.com

Paulo Soares

unread,
Sep 11, 2012, 11:06:15 PM9/11/12
to arduino-...@googlegroups.com

Os jogos dele não possuem 4kb.

Maurício Féo

unread,
Sep 11, 2012, 11:12:24 PM9/11/12
to arduino-...@googlegroups.com
Alex Kidd: 128 KB de ROM e 8KB de RAM.   Cabe no Mega!

Webert, se você rodar esse jogo eu compro! 


Maurício Féo Rivello
engenheirando.com
338.png

Ñ¡£†öñ conceicao

unread,
Sep 11, 2012, 11:16:18 PM9/11/12
to arduino-...@googlegroups.com
Mauricio
Esses 128k eram paginados
se me recordo aquele processador 6507 tinha limite de 4kb
 
 
at.Nilton

 

Date: Wed, 12 Sep 2012 00:12:24 -0300

Subject: Re: [arduino-brasilia] Leitura e gravação de memória EEPROM I2C externa no Arduino
338.png

Webert Oliveira

unread,
Sep 11, 2012, 11:16:56 PM9/11/12
to arduino-...@googlegroups.com

Ok Paulo vc entendeu. rsrsrs

Só que a questão é montar uma lista de jogos.
De forma que apenas um pos vez vai ocupar a RAM.
Tem alguns que não rodam no Atmega8 e nem no 168, alguns apenas no mega.
Mas meu problema não é esse, e sm montar a lista e fazer a leitura em memoria externa, não quero trabalhar com memoria interna.
A memoria interna não resolve o meu problema.
Valeu pessoal a ideias
Sigo estudando...


Féo tu pegou o esquema da coisa... RSrsrsrsr
Tem algumas coisas novas que estão aparecendo com possibilidade de desenvolviemnto com Blender.

E eu quero ver o comportamento de Blender e arduino para jogos educativos.
Isso outro projeto bem mais além.  

Daniel de Souza Braga

unread,
Sep 12, 2012, 10:05:21 AM9/12/12
to arduino-...@googlegroups.com
Webert,

          Bom dia !!!

          Será que esses links ajudam?




          Espero que sim!!

Att.,
-- 
Daniel Braga


2012/9/12 Webert Oliveira <wertol...@gmail.com>

Webert Oliveira

unread,
Sep 12, 2012, 6:36:30 PM9/12/12
to arduino-...@googlegroups.com
Daniel, 

valeu ! Um dos links que vc me mandou fala exatamente o que eu quero, ou pelo menos por onde entender o que eu quero.
que é a arquitetura e como aplicar isso no Arduino.
Nesse segundo link que o cara explica como montar esse padrão de leitura no SD, no e mostra como fica a divisão de memória para isso.
Para mim já é uma baita luz.
Valeu 

Yuri Oliveira

unread,
Sep 14, 2012, 7:02:31 PM9/14/12
to arduino-...@googlegroups.com
Webert, to tentando trabalhar com um EEPROM agora também. Eu to assistindo essa série de tutoriais que talvez ajudem: https://www.youtube.com/watch?v=TGOvgiPD-ac

Paulo Soares

unread,
Sep 14, 2012, 7:15:59 PM9/14/12
to arduino-...@googlegroups.com
Outra dia comprei esse AT24C256.


Em 14 de setembro de 2012 20:02, Yuri Oliveira <yure...@gmail.com> escreveu:
Webert, to tentando trabalhar com um EEPROM agora também. Eu to assistindo essa série de tutoriais que talvez ajudem: https://www.youtube.com/watch?v=TGOvgiPD-ac

Webert Oliveira

unread,
Sep 14, 2012, 9:47:26 PM9/14/12
to arduino-...@googlegroups.com
Já consegui ler e grava na memória tanto interna, quanto externa.
Muito fácil e sem segredos nos links que mandei explica isso.
Agora executar sketchs ainda é outros 500.
Achei esse projeto aqui e tem outros que usam microcontroladores que simulam cartuchos e fazem a leitura de jogos em lista do cartão SD direto para o ATARI.
http://raster.infos.cz/atari/hw/sdrive/sdriveen.htm

Quase o que eu quero, mas não quero usar o ATARI quero rodar direto e aprender o processo de gravação e execução.
Sei de uma coisa... Muito interessante tudo, algumas coisas muito complicadas.
Vejo que tem muitras aplicações, a maioria dos televisores e aparelhos de som usam EEPROM.
Os que não são atualizados por firmware, agora eu sei como fazer a gravação direto. rsrsrs 
Reply all
Reply to author
Forward
0 new messages