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.
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fwww.sparkfun.com%2Fcommerce%2Fimages%2Fproducts%2FEEPROM.jpg&hash=c402b4027fb6b2ddf77eae40ae5011e235567e05)
Datasheet: http://www.sparkfun.com/datasheets/IC/24LC256.pdf (http://www.sparkfun.com/datasheets/IC/24LC256.pdf)
Sparkfun: http://www.sparkfun.com/commerce/product_info.php?products_id=525 (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:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi240.photobucket.com%2Falbums%2Fff159%2Fsuper-mascarada%2FUntitled.jpg&hash=03eb003c887b627385fcde9008642afd5490d950)
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.
#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 (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 (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:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg172.imageshack.us%2Fimg172%2F1231%2Fsnc00101qx7.jpg&hash=c41b8b454e48ae4d035c1cbba6d00d2dbd1128ff)
BOM NOITE AMIGO DE PORTUGAL, SOU O EDUARDO DO BRASIL/SP
BEM... sou estudante iniciante em programação, e estou estudando arduino, mas eu tenho um projeto em que preciso fazer um porteiro eletronico.
Pensei em faze-lo em wi-fi, mas como automatizar a frequencia para que não preciso busca-la sempre? sabes alguma coisa a respeito?
Obrigado
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.
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fwww.sparkfun.com%2Fcommerce%2Fimages%2Fproducts%2FEEPROM.jpg&hash=c402b4027fb6b2ddf77eae40ae5011e235567e05)
Datasheet: http://www.sparkfun.com/datasheets/IC/24LC256.pdf (http://www.sparkfun.com/datasheets/IC/24LC256.pdf)
Sparkfun: http://www.sparkfun.com/commerce/product_info.php?products_id=525 (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:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi240.photobucket.com%2Falbums%2Fff159%2Fsuper-mascarada%2FUntitled.jpg&hash=03eb003c887b627385fcde9008642afd5490d950)
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.
#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 (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 (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:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg172.imageshack.us%2Fimg172%2F1231%2Fsnc00101qx7.jpg&hash=c41b8b454e48ae4d035c1cbba6d00d2dbd1128ff)