Ir ao conteúdo
  • Cadastre-se
Entre para seguir isso  
kenjiri

[Resolvido] Problema gravação eeprom

Recommended Posts

Boa tarde,

Estou querendo gravar dados na eeprom, não sei se estou fazendo da forma correta. preciso ler dois dados de um ad de 24 bits e gravar seus valores na eeprom para uma futura leitura. estou usando o mikroc, um pic 18f4580 e um ad 24bits. Alguém já teve algum problema parecido?

Estou fazendo da seguinte forma:

para escrever

 valorinicial=leitura();
EEPROM_Write(0,(unsigned char)((valorinicial& 0xff000000)>>24));
EEPROM_Write(1,(unsigned char)((valorinicial& 0x00ff0000)>>16));
EEPROM_Write(2,(unsigned char)((valorinicial& 0x0000ff00)>>8));
EEPROM_Write(3,(unsigned char)((valorinicial& 0x000000ff)));



valorfin=leitura();

EEPROM_Write(4,(unsigned char)((valorfin & 0xff000000)>>24));
EEPROM_Write(5,(unsigned char)((valorfin & 0x00ff0000)>>16));
EEPROM_Write(6,(unsigned char)((valorfin & 0x0000ff00)>>8));
EEPROM_Write(7,(unsigned char)((valorfin & 0x000000ff)));


//*************************************

para leitura

valorinicial= (unsigned long)(EEPROM_Read(0)<<24);
valorinicial|= (unsigned long)(EEPROM_Read(1)<<16);
valorinicial|= (unsigned long)(EEPROM_Read(2)<<8);
valorinicial|= (unsigned long)(EEPROM_Read(3));

valorfin = (unsigned long)(EEPROM_Read(4)<<24);
valorfin |= (unsigned long)(EEPROM_Read(5)<<16);
valorfin |= (unsigned long)(EEPROM_Read(6)<<8);
valorfin |= (unsigned long)(EEPROM_Read(7));

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou com uma dúvida parecida...

Quero gravar um numero grande, com 9 ou 10 caracteres (int32), O numero virá por uma conexão rs232 ou de uma rotina de contagem e/ou cálculo do próprio programa. Estou trabalhando com o CCS

kenjiri, penso que a gravação deverá estar ligada a algum evento...um botão gravar por exemplo, pois se for dentro de um laço, em alguns minutos a eeprom se foi...

Compartilhar este post


Link para o post
Compartilhar em outros sites

kenjiri consegui, mas usando o CCS.

Pelas leituras que fiz, vi que há várias maneiras. Para uma explicação simples os microcontroladores pic16f por exemplo, possuem endereços de memória que só podem gravar dados até 8 bits (255 no caso) para cada endereço.

Para valores com 16 bits temos que "quebrar" esses valores usando o "princípio do vai um" este por sua vez com peso 255 (e o anterior volta a zero), indo o "um" para o segundo endereço de memória.

Você deve criar uma variável para unir depois cada endereço para poder mostrar num hiperterminal ou lcd. Seria assim:

resultado=(((int32)variável2*254) + ((int32)variável1));

O int32 na fórmula representa o formato que desejamos mostrar

Este ideia para 16 bits pode ser usada para valores maiores, simplesmente adaptado o código.

Se alguém tiver alguma ideia melhor ou comentário, agradeceria muito.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O A/D interno deste pic possui apenas 10bits.

O microcontrolador funciona em 8bits, se você usar variáveis maiores do que a capacidade a tendencia é que ele fique "pamonha" quanto maior a quantidade de bits, afinal o controlador precisará dar várias voltas para fazer uma tarefa só, 10bits são suficientes para a maioria das aplicações. É necessário empregar uma variável de 16bits para armazenar o resultado todo, algo aceitável nestas condições.

Tanto a comunicação serial como a eeprom interna funciona em 8bits, do mesmo modo não há como enviar um dado maior ou gravar em uma posição de memória o dado inteiro de uma vez.

Recomendo que "fatie" o dado em partes de 8bits armazene os dados em variáveis e depois grave/envie um-por-um.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Daniel!

Consegui, mas foi numa variável que soma e vai acrescentando na seguinte.

Fatiei um numero decimal. Foi a maneira mais elementar, algo assim:

CÓDIGO:

int CASA1, CASA2, CASA3, CASA4, A, valor;

A=1234

CASA4 = (A / 1000) % 10; // resultado 1

CASA3 = (A % 1000) / 100; // resultado 2

CASA2 = (A % 100) / 10; // resultado 3

CASA1 = A % 10; // resultado 4

valor=(CASA4 * 1000) + (CASA3 * 100) + (CASA2 * 10) + (CASA1); // juntando tudo

printf("\n\r VALOR = %lu",valor); // manda para a serial "VALOR = 1234"

Há também maneiras mais elaboradas, como por exemplo o laço for()

Att.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caso o autor do tópico necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante
Este tópico está impedido de receber novos posts.
Entre para seguir isso  





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

×