Ir ao conteúdo

Posts recomendados

Postado

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;
}

 

Postado
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?

Postado
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

 

  • 2 semanas depois...
Postado

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));
}

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...