collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

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

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

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re:Arduino + EEPROM i2c
« Responder #15 em: 26 de Janeiro de 2009, 21:37 »
Basicamente deixam-te configurar o endereço de i2c para poderes mete-la no mesmo bus que outros dispositivos sem que fique no mesmo endereço de outros dispositivos. Se não desse para configurar o bus, não podias meter varias eeproms no mesmo bus, ou outros chips que tenham o mesmo endereço de i2c. Assim como podes configurar, já podes escolher que endereço queres para a eeprom permitindo que esta fique no bus sem ficar com o mesmo endereço que já esteja a ser utilizado por outro.

Num bus i2c, cada chip tem que ter o seu endereço único que o permite falar e ouvir sem colidir dados.

Offline tr3s

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 811
  • char x=1, y=5; x^=y^=x^=y;
Re:Arduino + EEPROM i2c
« Responder #16 em: 26 de Janeiro de 2009, 21:45 »
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

Não confundas o endereçamento da eeprom no BUS i2c com o endereçamento à memória interna da eeprom, são coisas distintas.

Imagina que o BUS i2c é como uma rede de computadores. Para distinguires os vários computadores na rede e para comunicares para eles usas o endereço IP (isto simplificando muitoooo as redes de computadores :P), no BUS i2c é a mesma coisa. Neste, o endereço ip de cada dispositivo é o tal valor gerado pelo Control Code (interno às eeproms) + Chip Select Bits (Os pinos A2, A1 e A0). Com estes geras oito i2c IPs (endereços de dispositivos i2c).

Agora o endereçamento à memória é feito durante a comunição i2c, já depois de estabeleçida a ligação (no Arduino é Wire.begin(); para levantar o auscultador e Wire.beginTransmission(enderecoEEprom); para marcar! :P). Depois da ligação estabelecida entre o Arduino e a EEPROM, é enviado o endereço da memória à qual queres aceder e este não tem nada a haver com os pinos, isto é, com o Slave Address!
Tr3s
Daniel Gonçalves

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re:Arduino + EEPROM i2c
« Responder #17 em: 26 de Janeiro de 2009, 21:49 »
Eu já nem sei como agradecer. As tuas explicações são fantásticas :)

Offline DanBar

  • Mini Robot
  • *
  • Mensagens: 685
    • iCAR Lusorobotica Blog
Re:Arduino + EEPROM i2c
« Responder #18 em: 27 de Janeiro de 2009, 08:38 »
Muito bom  8)

Já agora utilizas o vb através da porta série não é. Quais os comandos que utilizas para gravar e para ler na epron.

É possivel utilizar uma aplicação que grave e reutilize a informação na EEPROM. Certo.

É possivel gravar variáveis na EEPROM para o arduino utilizar mais tarde. Como é que faço isso.

Exemplo, Estou a desenvolver um controlador da sofagem para o meu carro, e vou utilizar um comando IR universal para comandar os servos. Quero gravar todos os comandos na EEPROM.
« Última modificação: 27 de Janeiro de 2009, 08:45 por iCAR »
Antigo Nick do Forum: iCAR

Projectos iCAR
icar.lusorobotica.com

DB@G
http://www.facebook.com/daniel.barradas

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re:Arduino + EEPROM i2c
« Responder #19 em: 27 de Janeiro de 2009, 09:21 »
Primeiro abres ligação:
SerialPort1.Open()

SerialPort1.Write()
SerialPort1.Read() ou ReadLine()

Offline DanBar

  • Mini Robot
  • *
  • Mensagens: 685
    • iCAR Lusorobotica Blog
Re:Arduino + EEPROM i2c
« Responder #20 em: 28 de Janeiro de 2009, 10:26 »
Boas.

Encontrei isto na net. Utilizam o lib wire para comunicar com o i2c

Está correcto ?

Código: [Seleccione]
#include <Wire.h> // include wire library

void setup()
{
  Wire.begin(0x50); // join i2c bus (address optional for master)
  Teste();
}

void loop()
{
     

}


void Teste(){       
  Wire.beginTransmission(4); // transmit to device #4
  Wire.send("lusorobotica");       // send text
  Wire.endTransmission();    // stop transmitting
  delay(500);
  }
« Última modificação: 28 de Janeiro de 2009, 10:28 por iCAR »
Antigo Nick do Forum: iCAR

Projectos iCAR
icar.lusorobotica.com

DB@G
http://www.facebook.com/daniel.barradas

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re:Arduino + EEPROM i2c
« Responder #21 em: 22 de Fevereiro de 2009, 11:51 »
Tr3s, olha o que eu encontrei... este post é para ti!

Citar
I found code and tutorial for using I2C EEPROMs on the Arduino which was perfect since it would only take up 2 pins (pin 4 and 5) and I could put up to 8 EEPROMs on a single bus. The problem was that the tutorial was in Portuguese, (and I found another one in Spanish) so I ended up just fumbling through it myself. For the rest of you, here's the English guide.
Fonte:
http://www.ghettohax.com/2009/02/i2c-eeprom-for-arduino.html


Ainda de outro site:

Citar
Check out this Arduino Tutorial (in Portuguese) and accompanying Windows App, by Daniel Gonçalves.
Fonte:
http://mindkits.com/_product_41557/i2c_eeprom_-_256kbit

O LusoRobótica a começar a ensinar o mundo ;)

Parabéns tr3s...
« Última modificação: 22 de Fevereiro de 2009, 11:54 por TigPT »

Offline ricardo-reis

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.338
Re:Arduino + EEPROM i2c
« Responder #22 em: 22 de Fevereiro de 2009, 14:59 »
uma salva de palmas..  :-* :-* mt bom.. ;)

Offline tr3s

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 811
  • char x=1, y=5; x^=y^=x^=y;
Re:Arduino + EEPROM i2c
« Responder #23 em: 22 de Fevereiro de 2009, 15:35 »
 :) É bom saber que o nosso fórum começa a ser reconhecido e como é claro, também é bom saber que gostam do nosso trabalho!
Obrigado a todos! :D
Tr3s
Daniel Gonçalves

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re:Arduino + EEPROM i2c
« Responder #24 em: 22 de Fevereiro de 2009, 15:57 »
Muito bem tr3s  :D

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re:Arduino + EEPROM i2c
« Responder #25 em: 21 de Março de 2009, 14:52 »
Continuando os meus estudos nas comunicações I2C e SPI, ao analisar novamente o código mas agora com mais atenção e seguindo a datasheet também, surgiram as seguintes duvidas:

1)
Citar
Serial.println("Vamos ler se esta tudo ok, deves ver 33, 33, 33, 33... Vá 10x 33");

Porque é que aqui é 33, 33, ... e não 3, 3, 3,... ?
« Última modificação: 22 de Março de 2009, 13:47 por metRo_ »

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re:Arduino + EEPROM i2c
« Responder #26 em: 22 de Abril de 2009, 20:47 »
Tive a testar as minhas memorias de 512 :D :D

Queria chamar atenção para o facto de ao gravar muitos dados seguidos, quando digo muito é mesmo muitos, tipo uma imagem ou assim, poder ocorrer o facto de falhar alguns bytes por isso aconselho a quem queira gravar muitos dados de seguida e não se importe de esperar cerca de 3/4 segundos (porque sem o delay que vou aconselhar a colocar aquilo é instantâneo).
A minha solução é simplesmente colocar um delay entre as gravações no seguinte código:

Código original:
Código: [Seleccione]
byte readEEPROM(int deviceaddress, unsigned int eeaddress ) {
  digitalWrite(ledEstado, HIGH);
  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();
  digitalWrite(ledEstado, LOW);
  return rdata;
}

Com os delay:
Código: [Seleccione]
byte readEEPROM(int deviceaddress, unsigned int eeaddress ) {
  digitalWrite(ledEstado, HIGH);
  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();
  digitalWrite(ledEstado, LOW);
  delay(3);
  return rdata;
}

O vídeo vai aparecer com alguns erros devido a isto que referi, não me apeteceu estar a passar novamente a passar as imagens para a memoria :P


Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re:Arduino + EEPROM i2c
« Responder #27 em: 22 de Abril de 2009, 21:53 »
(...)
É possivel utilizar uma aplicação que grave e reutilize a informação na EEPROM. Certo.

É possivel gravar variáveis na EEPROM para o arduino utilizar mais tarde. Como é que faço isso.

Exemplo, Estou a desenvolver um controlador da sofagem para o meu carro, e vou utilizar um comando IR universal para comandar os servos. Quero gravar todos os comandos na EEPROM.

Se 512 bytes (1K no ATmega328) te servem, podes usar a EEPROM que faz parte do AVR do Arduino.
Tenta o seguinte:

No topo fazes:

#include <avr/eeprom.h>

Escolhes cuidadosamente em que endereços da EEPROM vais guardar cada dado, tendo em conta os tamanhos, e atribuis endereços. Evita os 1ºs 2 ou 3 bytes (endereços 0 a 2).

E depois tens esta função para escrever um bloco de bytes:

eeprom_write_block (&<variável-na-RAM>, (void*)<endereço-da-variável-na-EEPROM>, size);

E esta outra para ler um bloco de bytes:

eeprom_read_block (&<variável-na-RAM>, (void*)<endereço-da-variável-na-EEPROM>, size);

Código: [Seleccione]
#include <avr/eeprom.h>

#define EEPROM_SERVOPOS_ADDR  3

typedef struct {
    int  servo1;
    int  servo2;
} TServos;

TServos servoPos;
...
// guardar as posições em EEPROM...
eeprom_write_block (&servoPos, (void*)EEPROM_SERVOPOS_ADDR, sizeof(servoPos));
...
// recuperar as posições da EEPROM...
eeprom_read_block (&servoPos, (void*)EEPROM_SERVOPOS_ADDR, sizeof(servoPos));


Offline rjrv

  • Mini Robot
  • *
  • Mensagens: 84
Re:Arduino + EEPROM i2c
« Responder #28 em: 23 de Abril de 2009, 01:08 »
Acho que está na altura de pensar num tutorial... de português!!!!! Parabéns cada vez mais internacionais!
"Somos humanos, demasiado humanos." - Friedrich Nietzsche

Offline ricardo-reis

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.338
Re:Arduino + EEPROM i2c
« Responder #29 em: 23 de Abril de 2009, 02:14 »
Acho que está na altura de pensar num tutorial... de português!!!!! Parabéns cada vez mais internacionais!

hás-de fazer um desenho, que, no (des)contexto não percebi essa..