Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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;
}

 

Editado por Fabio Munhoz

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
Postado (editado)
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

 

Editado por Nao Sei

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






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

×