Lendo dados gravado na memoria

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Lendo dados gravado na memoria

Mensagempor Alvarosan » 22 Ago 2014 12:27

Olá pessoal, preciso de ajuda, estou tentando ler uma variável que está gravado na memoria, porém o valor não corresponde ao dado, utilizo o MicroC pro, e o comando é o EEPROM_Write, quando vou ler com o EEPROM_Read, o valor vem diferente, por ex. grado o valor 300, ele me retorna -212,o que está de errado no algorítimo abaixo?


cpp code
char txt[16];
int total_8=0;
int total_16=0;
int total = 0;

EEPROM_Write(0x02,total);
delay_ms(20);
total_8 = EEPROM_Read(0x02);
total_16 = EEPROM_Read(0x03);

total=total_16;
total <<= 8;
total += total_8;

intToStr(total, txt);
Glcd_Write_Text_Adv(txt, 100, 20);


obrigado...
Alvarosan
Bit
 
Mensagens: 20
Registrado em: 14 Out 2006 10:55
Localização: Ribeirao Preto

Re: Lendo dados gravado na memoria

Mensagempor andre_luis » 22 Ago 2014 13:16

Alvaro,


O barramento interno da EEPROM é de 8 bits, o que significa que tudo o que for enviado pra lá acima disso vai ser ceifado, sendo escrito na verdade apenas o byte menos significativo, ou seja: 300-256 = 44. Por alguma razão, na leitura algum flag da ALU, como o de overflow deve estar sendo acionado, o que estaria fazendo esse valor ser convertido para negativo, ou seja: 44-256=-212.

Resumindo, você deve administrar a armazenagem de dados na EEPROM, separando os bytes alto e baixo, antes de enviar para a memoria.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Lendo dados gravado na memoria

Mensagempor ze » 22 Ago 2014 15:24

p.ex.

Código: Selecionar todos
unsigned int total_16=300;

escreve
Código: Selecionar todos
EEPROM_Write(0x02,total_16);//LSB
EEPROM_Write(0x03,total_16>>8);//MSB


Código: Selecionar todos
total_16=EEPROM_Read(0x03);//MSB
total_16<<=8;
total_16|=EEPROM_Read(0x02);//LSB
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Lendo dados gravado na memoria

Mensagempor Alvarosan » 22 Ago 2014 16:34

Olá Ze, fiz o seu exemplo, ele grava 300, mas retorna 44, o que pode estar errado?
Alvarosan
Bit
 
Mensagens: 20
Registrado em: 14 Out 2006 10:55
Localização: Ribeirao Preto

Re: Lendo dados gravado na memoria

Mensagempor Rodrigo_P_A » 23 Ago 2014 20:39

Para armazenar o valor 300 vc precisa de 2 bytes.
300 = 0x012C
44 = 0x2C

Ou seja, o MSB não está sendo lido.

dando uma pesquisada rápida sobre os tipos de dados no CCS, acredito que se você alterar a declaração da variável total_16 para: int16 total_16 vai resolver o problema, pois unsigned int é de 8 bits apenas.

Veja: http://www.ccsinfo.com/forum/viewtopic.php?p=61635
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Re: Lendo dados gravado na memoria

Mensagempor ze » 23 Ago 2014 21:13

não conheço o seu mas um compilador c deveria entender unsigned int como 16 bits. Testa a dica do rodrigo
abç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Lendo dados gravado na memoria

Mensagempor Rodrigo_P_A » 23 Ago 2014 22:08

Zé eu num acredito mais nisso. Eu sempre testo os tipos quando mudo de plataforma, assim economizo tempo. :)

Além disso eu procuro usar as definições padrões
uint8_t
uint16_t
Etc.

Quando não existe as definições nos headers do compilador eu mesmo defino para num ter problemas e facilitar a portabilidade.
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Re: Lendo dados gravado na memoria

Mensagempor andre_luis » 23 Ago 2014 22:38

Alvarosan escreveu:Olá Ze, fiz o seu exemplo, ele grava 300, mas retorna 44, o que pode estar errado?


O problema é que voce definiu a variavel txt como do tipo char, e array, o que é desnecessário:
char txt[16];

Experimenta declarar apenas assim:
int txt;
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Lendo dados gravado na memoria

Mensagempor Alvarosan » 24 Ago 2014 10:34

Olá pessoal, obrigado ao Ze , Rodrigo e Andre pelas dicas, quanto ao compilador, ele é somente de 8 bits, não tem outra opção, então acabei fazendo assim e deu certo, não sei se é a mais simples, mas para mim já está bom.

cpp code
var = 32512;
EEPROM_Write(0x02,var); // grava no end 0x02 parte baixa do byte
var=var>>8; // desloca a parte alta do byte
EEPROM_Write(0x03,var); // grava a parte alta do byte no end 0x03
delay_ms(20);
var = EEPROM_Read(0x03)*256; // lê a parte alta do byte e mult por 256
var += EEPROM_Read(0x02); // lê a parte baixa do byte e soma com o resultado
IntToStr(var,txt); // converte de INT para STR


as variáveis, assim como o resto do programa foram omitidas por serem desnecessárias.
um abraço a todos...
Alvarosan
Bit
 
Mensagens: 20
Registrado em: 14 Out 2006 10:55
Localização: Ribeirao Preto

Re: Lendo dados gravado na memoria

Mensagempor Rodrigo_P_A » 24 Ago 2014 12:24

Não interessa se o compilador é para 8 bits, ele tem outros tipos de dados!

O importante é que você resolveu, mas dá uma lida nos tipos de dados existentes, acho que o problema é mais conceitual do que de programação
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Re: Lendo dados gravado na memoria

Mensagempor Alvarosan » 25 Ago 2014 04:53

Olá Rodrigo, segue abaixo o help, é possível ler dois bytes sem ter que deslocar os bit´s?
EEPROM_Write.JPG

EEPROM.JPG
Você não está autorizado a ver ou baixar esse anexo.
Alvarosan
Bit
 
Mensagens: 20
Registrado em: 14 Out 2006 10:55
Localização: Ribeirao Preto

Re: Lendo dados gravado na memoria

Mensagempor ze » 25 Ago 2014 07:36

desculpe a intromissão e chute...... pelo que vi a função retorna 1 byte apenas pra ficar coerente como hw do chip. portanto tem sim que deslocar para formar um int.
agora o endereço, este sim, dependendo do chip pode ser de 2 bytes (int). o pic16 só tem 256 bytes de eeprom e o pic18 pode ter + que isso. mas nada impede você de criar sua propria função 16 bits num pic16 p.ex.:
Código: Selecionar todos
unsigned int eepromread16(unsigned int address) //só endereços pares por gentileza
{
unsigned int dado;
dado=eeprom_read(address+1);
dado<<=8;
dado|=eeprom_read(address);
return dado;
}
abç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Lendo dados gravado na memoria

Mensagempor Alvarosan » 27 Ago 2014 14:30

Olá Ze, obrigado pela ajuda, o código ficou assim, e funcionou legal.

cpp code
void eepromwrite16(unsigned int address, unsigned int dado )
{
EEPROM_Write(address,dado);
dado>>=8;
EEPROM_Write(address+1,dado);
}

unsigned int eepromread16(unsigned int address)
{
unsigned int dado;
dado=EEPROM_Read(address+1);
dado<<=8;
dado|=EEPROM_Read(address);
return dado;
}


um abraço
Alvarosan
Bit
 
Mensagens: 20
Registrado em: 14 Out 2006 10:55
Localização: Ribeirao Preto


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x