Ir ao conteúdo
  • Cadastre-se
Fabio Munhoz

PIC Como gravar na EEPROM uma variável de 4 bytes, usando Pic 18F4520

Recommended Posts

Boa tarde, preciso gravar uma variável de 4 bytes na memória EEPROM, usei o tipo unsigned long e separei os 4 bytes salvando cada um em um endereço, a função que criei salva certinho até 2 bytes, porém quando passa dos 65 536 ela ja não salva mais e mostra o numero referente a apenas os 2 primeiros bytes, ela não le ou não salva os outros 2 bytes. Fiz o teste com dois modos na função de gravar e ler, porém as duas deram o mesmo resultado, funcionam apenas até 2 bytes. Vou postar a função que fiz aqui, e a parte que ta barrada seria do outro modo que fiz que obtive o mesmo resultado. Agradeço desde ja.

 

void gravar(int address, unsigned long value) {

//char four = (value & 0xff);
//char three = ((value >> 8) & 0xff);
//char two = ((value >> 16) & 0xff);
//char one = ((value >> 24) & 0xff);

char four = (char)(value & 0x000000ff);
char three = (char)((value & 0x0000ff00) >> 8);
char two = (char)((value & 0x00ff0000) >> 16);
char one = (char)((value & 0xff000000) >> 24);


EEPROM_Write(address, four);
Delay_ms(50);
EEPROM_Write(address + 1, three);
Delay_ms(50);
EEPROM_Write(address + 2, two);
Delay_ms(50);
EEPROM_Write(address + 3, one);
Delay_ms(50);

}

unsigned long Ler (int address) {

unsigned long numero_memoria;

char four, three, two, one;

four = EEPROM_Read(address);
Delay_ms(50);
three = EEPROM_Read(address + 1);
Delay_ms(50);
two = EEPROM_Read(address + 2);
Delay_ms(50);
one = EEPROM_Read(address + 3);
Delay_ms(50);

//numero_memoria = ((four << 0) & 0xff) + ((three << 8) & 0xffff) + ((two << 16) & 0xffffff) + ((one << 24) & 0xffffffff);

numero_memoria = (four + (three << 8) + (two << 16) + (one << 24));


return numero_memoria;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Coloca unsigned na frente do char...

Ou importa stdint.h é utilizar uint8_t (inteiro 8bit sem sinal).

Compartilhar este post


Link para o post
Compartilhar em outros sites
15 horas atrás, Nao Sei disse:

Coloca unsigned na frente do char...

Ou importa stdint.h é utilizar uint8_t (inteiro 8bit sem sinal).

 

Tentei com unsigned char não funcionou também, mesma coisa, até 65535 grava perfeitamente, 65536 fica 0, 65537 fica 1 e por ai vai. Nao entendi essa biblioteca stdint.h que você citou, procurei por ela na internet e não achei, porém apenas inclui ela e o mikroc compilou certinho. Onde acho informação sobre ela?

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, Fabio Munhoz disse:

 

Tentei com unsigned char não funcionou também, mesma coisa, até 65535 grava perfeitamente, 65536 fica 0, 65537 fica 1 e por ai vai. Nao entendi essa biblioteca stdint.h que você citou, procurei por ela na internet e não achei, porém apenas inclui ela e o mikroc compilou certinho. Onde acho informação sobre ela?

https://en.wikibooks.org/wiki/C_Programming/stdint.h

Faz um teste simples ai,este aqui funciona num compilador online:

    unsigned long numero_memoria;
    unsigned long value = 333333;    //valor para testar
    char four = (char) (value & 0x000000ff);
    char three = (char) ((value & 0x0000ff00) >> 8);
    char two = (char) ((value & 0x00ff0000) >> 16);
    char one = (char) ((value & 0xff000000) >> 24);
    numero_memoria = (four + (three << 8) + (two << 16) + (one << 24));
    if (numero_memoria == value)  {
        cout << "IGUAL\n";
    }else{
        cout << "DIFERENTE\n";
    }
    cout<<numero_memoria;Screenshot_99.png.5f1940ee73543f05791a7569fece05a3.png

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Experimente refazer seu código como nesse exemplo abaixo. Eu não tenho como testar direto numa EEPROM então testei no https://repl.it/ e funcionou bem. Não tem motivo para não funcionar numa situação real também.

 

void escrever(unsigned long valor){
  unsigned char my_byte = 0;

  // Você pode colocar esse código num loop "for" também
  my_byte = valor & 0xFF;
  valor   = valor >> 8;
  printf("one = %x\n"   , my_byte);
  my_byte = valor & 0xFF;
  valor   = valor >> 8;
  printf("two = %x\n"   , my_byte);
  my_byte = valor & 0xFF;
  valor   = valor >> 8;
  printf("three = %x\n" , my_byte);
  my_byte = valor & 0xFF;
  valor   = valor >> 8;
  printf("four = %x\n" , my_byte);
}

unsigned long ler(unsigned int addr) {
  unsigned long numero_memoria = 0;
  unsigned char memoria_corrente = 0;

  // Você pode colocar esse código num loop "for" também

  memoria_corrente = 0xFF; // byte mais significativo
  numero_memoria = memoria_corrente;
  memoria_corrente = 0xFE; 
  numero_memoria = (numero_memoria << 8) | memoria_corrente;
  memoria_corrente = 0xFD; 
  numero_memoria = (numero_memoria << 8) | memoria_corrente;
  memoria_corrente = 0xFC; // Byte menos significativo
  numero_memoria = (numero_memoria << 8) | memoria_corrente;

  return numero_memoria;
}

int main(void) {
  escrever(0xFFFEFDFC);
  printf("%x\n", ler(0));
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×