collapse

* Links de Robótica

* Posts Recentes

Encomenda colectiva N26-2014[Aberto a Pedidos] por senso
[Hoje às 00:57]


Procura-se componentes(MAX31855 KASA e conectores IDC) por senso
[Hoje às 00:41]


PIC_VGA por dropes
[Hoje às 00:19]


teclado sony vaio? por dropes
[Hoje às 00:12]


Problemas com a USART por senso
[Ontem às 15:15]


Qual a melhor solução/compilador para programar em c? por Electropepper
[Ontem às 10:43]


O que é que têm agora em cima da vossa bancada? por TigPT
[30 de Setembro de 2014, 15:06]


QkThings por msr
[30 de Setembro de 2014, 15:03]


Fêmeas para PCB de Jacks de 3.5mm por Hugu
[29 de Setembro de 2014, 23:44]


BuildersBot por StarRider
[29 de Setembro de 2014, 15:25]

Autor Tópico: Arduino + EEPROM i2c  (Lida 42023 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline tr3s

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 809
  • char x=1, y=5; x^=y^=x^=y;
Arduino + EEPROM i2c
« em: 26 de Janeiro de 2009, 14:24 »
Hi,

E que tal falar sobre EEPROMs?

Ora bem, quase todos devem saber o que são e o jeitão que dão quando começamos a ficar sem espaço no nosso microcontrolador e temos a necessidade migrar dados, ou então quando queremos fazer muitos registos e os míseros bytes de memória que o nosso micro tem não são suficientes.


Datasheet: http://www.sparkfun.com/datasheets/IC/24LC256.pdf
Sparkfun: http://www.sparkfun.com/commerce/product_info.php?products_id=525

Pois bem as EEPROMs são mesmo nossas amigas e então as i2c são tão fáceis de implementar que ao fim de algum tempo nem nos lembramos que as temos na breadboard. Estas ocupam apenas os pinos 4 e 5 analógicos do Arduino, ocupando um endereço no BUS, ou seja, podemos continuar com todos os outros dispositivos i2c que lá tinhamos ligados anteriormente.

A eeprom que vou usar neste tutorial é uma 24lc256 da Microchip. Esta eeprom tem 32K endereços a 8 bits  fazendo dela uma eeprom com 256 Kbits memória. OH yeah!
Eu gosto de comparar esta capacidade de armazenamento com quanto precisaria para guardar um bitmap a fullscreen para o meu LCD da Nokia com o controlador OM6206. Ora bem um bitmap ocupa 864 bytes, se tenho 32k bytes, quer dizer 0x7FFF bytes disponíveis na eeprom isto dá...  37,9 imagens! :D "Ya é bué" memória.
A Atmel, assim como outras marcas, também têm estas eeproms. Na Atmel é 24C256, mas as da Microchip são bem melhores! As da Microchip aguentam os dados por mais de 200 anos, na Atmel é só 40; As da Microchip dão para mais de um milhão de ciclos escrita, as da Atmel só dão para 100 mil. A Microchip dá 3 pinos para endereço, a Atmel só dá dois. Bom e continua...

As ligações são estas:



Os pinos A0 a A2 servem para indicar o endereço da eeprom no bus i2c, se estiverem todos ligados a GND o endereço no Arduino é 0x50. Assim, conseguimos ter até 8 eeproms no mesmo bus fazendo 2Mbit de memória!
O pino WP é o pino que indica se a eeprom está protegida contra escita, se ligarem este pino a vcc não podem escrever na eeprom e se o ligarem a GND já podem, é como o botão nos cartões de memória.

Depois de ligarem isto tudo vamos lá testar tudo! Para o teste ligem o WP a GND.

Código: [Seleccione]
#include <Wire.h>         // Para a EEPROM 24LC256, assim chamamos as bibliotecas i2c
#define eeprom 0x50    // endereço da eeprom já shiftado

void setup(void){
  Wire.begin();           // Iniciar ligações i2c
  Serial.begin(9600); // Assim podemos ver qualquer coisa na consola serial

  unsigned int address = 0;  //endereçamento a 2 bytes
  Serial.println("A escrever o melhor numero de sempre nos 10 primeiros bytes!");
  for(address = 0; address<10; address++) writeEEPROM(eeprom, address, '3');   // Va pub a mim! Encher os 10 primeiros bytes com o número 3
  Serial.println("Vamos ler se esta tudo ok, deves ver 33, 33, 33, 33... Vá 10x 33");

  for(address = 0; address<10; address++) {
     Serial.print(readEEPROM(eeprom, address), HEX);
     Serial.print(", ");
  }
}

void loop(){
}

//-------Rotinas para EEPROMS i2c por Daniel Gonçalves a.k.a. Tr3s------
// Podem usar estas rotinas à vontade para projectos particulares.
// Para fins comerciais entrar em contacto com we_real_cool@hotmail.com
// Partilhem com apenas com o meu concentimento.
// Se virem este código noutro sitio sem ser [url=http://www.lusorobotica.com]www.lusorobotica.com[/url] avisem de imediato para we_real_cool@hotmail.com!

void writeEEPROM(int deviceaddress, unsigned int eeaddress, byte data ) {
  Wire.beginTransmission(deviceaddress);
  Wire.send((int)(eeaddress >> 8));   // MSB
  Wire.send((int)(eeaddress & 0xFF)); // LSB
  Wire.send(data);
  Wire.endTransmission();
}

byte readEEPROM(int deviceaddress, unsigned int eeaddress ) {
  byte rdata = 0xFF;
  Wire.beginTransmission(deviceaddress);
  Wire.send((int)(eeaddress >> 8));   // MSB
  Wire.send((int)(eeaddress & 0xFF)); // LSB
  Wire.endTransmission();
  Wire.requestFrom(deviceaddress,1);
  if (Wire.available()) rdata = Wire.receive();
  return rdata;
}

// Por Daniel Gonçalves a.k.a. (t.c.p.) Tr3s, para [url=http://www.lusorobotica.com]www.lusorobotica.com[/url]

Bom e acho que é tudo... Alguma coisa é só dizer.

Vejam também o post onde ensino a brincar com a eeprom duma maneira mais gira!
http://lusorobotica.com/index.php/topic,460.msg2733.html (use Arduino to program eeprom)

NOTA: Não se esqueçam das resistências de pullup do bus I2C, para mais informação sobre o protocolo I2C visitem o link:
http://lusorobotica.com/index.php/topic,33.0.html

Exemplo de uma imagem lida de uma eeprom por um arduino e escrita num lcd nokia:

« Última modificação: 26 de Janeiro de 2009, 23:17 por TigPT »
Tr3s
Daniel Gonçalves

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 4.988
    • Tiago Rodrigues
Re:Arduino + EEPROM i2c
« Responder #1 em: 26 de Janeiro de 2009, 14:47 »
Muito interessante, adicionado como artigo ;)

Offline Fifas

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 2.038
  • El RoboSapiens
Re:Arduino + EEPROM i2c
« Responder #2 em: 26 de Janeiro de 2009, 15:37 »
oh yeah!!! :D

muito obrigado tr3s!!!! por acaso tenho aqui uma eprom da microchip...so nao sei qual é :P nunca a usei muito por isso nao sei bem o potencial disto...

vou por um exemplo de uma coisita que tou a fazer...imagina que o arduino recebe um determinado dado por serie e eu quero que ele escreva esse dado num lcd (por exemplo do 3310) mas em forma de grafico.....se programar a eprom  para os dados do grafico fico com mais espaço livre no arduino, certo?


ps: acho que foi desta que queimei o meu arduino :P

Offline tr3s

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 809
  • char x=1, y=5; x^=y^=x^=y;
Re:Arduino + EEPROM i2c
« Responder #3 em: 26 de Janeiro de 2009, 16:08 »
oh yeah!!! :D

muito obrigado tr3s!!!! por acaso tenho aqui uma eprom da microchip...so nao sei qual é :P nunca a usei muito por isso nao sei bem o potencial disto...

vou por um exemplo de uma coisita que tou a fazer...imagina que o arduino recebe um determinado dado por serie e eu quero que ele escreva esse dado num lcd (por exemplo do 3310) mas em forma de grafico.....se programar a eprom  para os dados do grafico fico com mais espaço livre no arduino, certo?


ps: acho que foi desta que queimei o meu arduino :P

Queimaste porquê? :S

Sim ficas, eu estuo a supor que tens um determinado sensor e estás a registar dados de x em x tempo. Sim se os guardares para a eeprom em vez de os guardares numa zona reservada para isso no Arduino (Atmega168), ficas sem dúvida com mais espaço no Arduino. Imagina que queres guardar 5000 medições, imagina de temperatura, supondo que não passas dos 255 ºC :P, cada medição ocupa um byte, ou seja, no Arduino tinhas de reservar 5000 bytes. Isso é demais para ele, fica logo marado (embora teoricamente pudesse guardar isso). 5000 bytes na eeprom não são nada e facilmente guardas lá 32000 medições. Sem preocupações. Como dou o exemplo de medições posso dar o exemplo de pontos (GPS), caracteres, imagens duma webcam, etc. ...
Portanto, sim, pouparias imensa memória e preocupações, já que, uma vez lá guardados só se escreveres por cima é que os perdes!
« Última modificação: 26 de Janeiro de 2009, 16:10 por tr3s »
Tr3s
Daniel Gonçalves

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.312
Re:Arduino + EEPROM i2c
« Responder #4 em: 26 de Janeiro de 2009, 16:27 »
Bastante interessante :)
 Só não percebi muito bem esta parte "Os pinos A0 a A2 servem para indicar o endereço da eeprom no bus i2c, se estiverem todos ligados a GND o endereço no Arduino é 0x50. Assim, conseguimos ter até 8 eeproms no mesmo bus fazendo 2Mbit de memória!" A verdade é que ainda não estive a ver muito bem a comunicação I2C, se calhar é por isso.

Offline tr3s

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 809
  • char x=1, y=5; x^=y^=x^=y;
Re:Arduino + EEPROM i2c
« Responder #5 em: 26 de Janeiro de 2009, 16:55 »
Bastante interessante :)
 Só não percebi muito bem esta parte "Os pinos A0 a A2 servem para indicar o endereço da eeprom no bus i2c, se estiverem todos ligados a GND o endereço no Arduino é 0x50. Assim, conseguimos ter até 8 eeproms no mesmo bus fazendo 2Mbit de memória!" A verdade é que ainda não estive a ver muito bem a comunicação I2C, se calhar é por isso.




Vamos então analisar a imagem de cima:

Primeiro ignora o primeiro bit (Start Bit) e o último (Acknowledge Bit) uma vez que são bits da comunicação e não fazem parte do endereçamento que queremos estudar. Ficamos com:

| 1 | 0 | 1 | 0 | A2 | A1 | A0 | R/~W |

Supondo que temos os pinos A2, A1 e A0 ligados a GND ficamos com:

| 1 | 0 | 1 | 0 | 0 | 0 | 0 | R/~W |
Isto em hexadecimal é  0xA0 ou 0xA1 consoanto o valor de R/~W

Como a biblioteca serial do Arduino "empurra" tudo para a esquerda quando faz comunicação i2c, temos de garantir que quando vem tudo para a esquerda ficamos com os valores correctos, então "empurramos" tudo para a direita antes! Perdemos R/~W (que no fundo não nos interessa porque o pino actua de qualquer maneira)

->| 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 |
                           A2  A1  A0
e assim temos 0x50 em hexadecimal.

Bom este exemplo é com os pinos a 0, isto é ligados a GND. Como tens 3 pinos, tens 3 bits de combinações, ou seja ligando estes 3 pinos a VCC ou GND consegues fazer 8 endereços diferentes, são eles:
                           A2  A1  A0
| 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | = 0x50
| 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | = 0x51
| 0 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | = 0x52
| 0 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | = 0x53
| 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | = 0x54
| 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | = 0x55
| 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | = 0x56
| 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | = 0x57


Agora, imagina que tens 3 eeproms na breadboard e queres so com 2 fios controlá-las todas. Dando diferentes valores nestes pinos consegues fazer que que as 3 tenham diferentes endereços. Assim consegues aceder independentemente a cada uma!

Aconcelho-te, de qualquer maneira, a ler mais sobre o protocolo i2c :D


Espero que tenhas percebido ;D
« Última modificação: 26 de Janeiro de 2009, 17:02 por tr3s »
Tr3s
Daniel Gonçalves

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.312
Re:Arduino + EEPROM i2c
« Responder #6 em: 26 de Janeiro de 2009, 17:00 »
Percebi perfeitamente, a explicação foi bastante boa :) Obrigado :) :)

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 4.988
    • Tiago Rodrigues
Re:Arduino + EEPROM i2c
« Responder #7 em: 26 de Janeiro de 2009, 17:01 »
Muito bem explicado.

Tens aqui um artigo meu sobre I2C que te pode ajudar a perceber melhor o protocolo, contudo consulta o manual da Philips ;)

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.312
Re:Arduino + EEPROM i2c
« Responder #8 em: 26 de Janeiro de 2009, 20:37 »
Só para concluir então, quando se utilizam sensores ou outros componentes que comuniquem utilizando I2C convem que tenham 3 bits para indicar o endereço, certo?

Offline Fifas

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 2.038
  • El RoboSapiens
Re:Arduino + EEPROM i2c
« Responder #9 em: 26 de Janeiro de 2009, 20:39 »
o tr3s vai dar professor ;D

boa explicaçao ;)

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 4.988
    • Tiago Rodrigues
Re:Arduino + EEPROM i2c
« Responder #10 em: 26 de Janeiro de 2009, 20:46 »
Nem todos os sensores têm, alguns vêm só com um endereço, mas podemos jogar com os outros que são de endereços configuráveis para evitar que os endereços fiquem sobrepostos.

Nunca tentei meter dois sensores de mesmo endereço no mesmo bus para ver qual o resultado, mas certamente informação incorrecta no bus para não dizer que até pode danificar algum. (acho que não danifica mas quando tiver dinheiro para gastar em sensores que se possam danificar faço um tutorial e posto :P)

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 4.988
    • Tiago Rodrigues
Re:Arduino + EEPROM i2c
« Responder #11 em: 26 de Janeiro de 2009, 21:10 »
Adicionado datasheet e página do produto na sparkfun ;)

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.312
Re:Arduino + EEPROM i2c
« Responder #12 em: 26 de Janeiro de 2009, 21:22 »
Essa eeprom só tem 256k se não estiveres mais nada a utilizar o I2C do arduino, correcto?

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 4.988
    • Tiago Rodrigues
Re:Arduino + EEPROM i2c
« Responder #13 em: 26 de Janeiro de 2009, 21:27 »
Não interessa se tens mais coisas a utiliar i2c no arduino, sim ela tem essa capacidade interna que podes utiliza-la com qualquer microcontrolador. Essa é a quantidade de bytes que ela pode armazenar no seu interior, o arduino pode ter muitas ou poucas coisas ligadas que não vai interferir com a estrutura física da eeprom, logo não altera o seu tamanho.

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.312
Re:Arduino + EEPROM i2c
« Responder #14 em: 26 de Janeiro de 2009, 21:31 »
Então não percebo isto "Esta eeprom tem 32K endereços a 8 bits  fazendo dela uma eeprom com 256 Kbits memória."  ???

Eu pensei que fosse, em cada endereço da eeprom, aqueles a0 a1 a2, tivesse 32k