Go Down

Topic: EEPROM:ler dados (Read 1 time) previous topic - next topic

vasr

Estou a programar a gravação de dados numa EEPROM e efetuar depois sua leitura e visualização através de um print.
Tenho uma sequência por exemplo 12 13 14 111+valores do RTC, em que gravo 12 na posição zero,na posição 1 o 13 e os restantes da mesma forma.
A gravação faço corretamente em que utilizo 0-11 posições na EEPROM(12 posições no total).
Na gravação, na primeira gravação utilizo 0-11 posições,na segunda com outra sequência utilizo as seguintes(12-24) e as restantes que acrescente da mesma forma.
Na leitura deve apresentar os dados mais recentes, se tiver dados de 0-11 e 12-24 o leitura terá que ser 12-24 e 0-11.
Fiz detas forma:
Code: [Select]
if(pedido=='0'){
 for(addr=0;addr<=dr;addr++) //dr tem valor 11 pois a medida que grava eu incremento a variavel dr.
   {
     temp[addr] = readEEPROM(addr);
      Serial.println(int(temp[addr]));
   }
   sprintf(buffer,"ID:%d Acao:%d Pino:%d Hora:%d:%d:%d Data:%d/%d/%d Ds:%s",int(temp[0]),int(temp[1]),int(temp[2]),int(temp[4]),int(temp[5]),int(temp[6]),int(temp[7]),int(temp[8]),int(temp[9]),GetDayOfWeek(int(temp[10])));
   Serial.println(buffer);
   delay(2000);
   
   }


Neste código apenas apresenta os dados da EEPROM de 0-11.Alguma sugestão?

Mortis

não entendo tua dúvida, você manda ler de 0 a 11 (addr=0;addr<=dr) onde dr é 11

e imprimes de 0 até 10
int(temp[0])... ...GetDayOfWeek(int(temp[10]));

Se assim escreves é isso que retorna ;)

vasr

Peço desculpa, por engano o clico for esta errado.
Será assim:
Code: [Select]
for(addr=0;addr<dr;addr++)
Tal como na descrição é de 0-10 posições e a seguinte 11-22,total de 11 posições e não 12.
Obrigado pela observação.
Pretendo a leitura por exemplo,primeiro 11-22 e depois 0-10.No meu caso so faz a leitura das primeiras 11posições.

Mortis

Teu problema esta na lógica de programação?

Se for isso, tens muitas formas, dentre elas podes criar um método, definindo a posição inicial e final:
Code: [Select]

void ImprimeValores(int inicio, int fim){
for(addr=inicio;addr<=fim;addr++) //dr tem valor 11 pois a medida que grava eu incremento a variavel dr.
    {
      temp[addr] = readEEPROM(addr);
       Serial.println(int(temp[addr]));
    }
    sprintf(buffer,"ID:%d Acao:%d Pino:%d Hora:%d:%d:%d Data:%d/%d/%d Ds:%s",int(temp[inicio]),int(temp[inicio+1]),int(temp[inicio+2]),int(temp[inicio+4]),int(temp[inicio+5]),int(temp[inicio+6]),int(temp[inicio+7]),int(temp[inicio+8]),int(temp[inicio+9]),GetDayOfWeek(int(temp[inicio+10])));
    Serial.println(buffer);
    delay(2000);
}


e chama o método com o inicio e fim desejados
Code: [Select]

ImprimeValores(11,22);
ImprimeValores(0,10);

vasr

Obrigado pela resposta.Tenho que fazer para um caso genérico, é esse metodo que não consigo implementar.
Ja tentei colocar outro ciclo for mas sem sucesso.

vasr


Mortis

Não entendo o que você quer, pode-se chegar a um resultado por vários meios, o que você quer dizer por genérico?

Você tem fixa qual será a última posição gravada? Você pode fazer um laço da ultima posição para a primeira, cada vez que você atingir -11 (que é a largura to teu "registro") você imprime.

Code: [Select]

int count = 0;
for(addr=22;addr>=0;addr--){
  temp[addr] = readEEPROM(addr);
  Serial.println(int(temp[addr]));
 
  if(count == 11){
    sprintf(buffer,
    "ID:%d Acao:%d Pino:%d Hora:%d:%d:%d Data:%d/%d/%d Ds:%s"
    ,int(temp[addr]),int(temp[addr+1]),int(temp[addr+2]),int(temp[addr+4])
    ,int(temp[addr+5]),int(temp[addr+6]),int(temp[addr+7]),int(temp[addr+8])
    ,int(temp[addr+9]),GetDayOfWeek(int(temp[addr+10])));
   
    Serial.println(buffer);
   
    count = 0;
  }
  else {
    count++;
  }
}


Não testei o loop acima, mas é minha última idéia. rs

Só você sabe exatamente o que quer, então é só rabiscar até que vejas o desenho que desejas.

Go Up