Página 1 de 1

Salvar um String na EEProm interna

MensagemEnviado: 25 Mar 2010 14:53
por buiz
Olá a todos,

Necessito gravar um String de 30 caracteres na memoria EEprom do PIC 18f4620, e depois ler ela novamente e atribuir a uma variavel.

Exemplo:

Receberei pela serial uma frase de até 30 caracteres em uma String.

Ao término da execução do programa necessito salvar esta frase na EEProm e na inicialização tenho que ler a ultima frase gravada na EEProm.


Como fazer isso em C?

Grato pela ajuda,

Buiz.

MensagemEnviado: 25 Mar 2010 15:33
por Francesco
Você já tem alguma rotina que escreve ou lê um byte da eeprom?

Francesco

MensagemEnviado: 25 Mar 2010 15:45
por EDSONCAN
No CCS:
Syntax:
write_eeprom (address, value)



Parameters:
address is a (8 bit or 16 bit depending on the part) int, the range is device dependent

value is an 8 bit int



Returns:
undefined



Function:
Write a byte to the specified data EEPROM address. This function may take several milliseconds to execute. This works only on devices with EEPROM built into the core of the device.



For devices with external EEPROM or with a separate EEPROM in the same package (line the 12CE671) see EX_EXTEE.c with CE51X.c, CE61X.c or CE67X.c.





Availability:
This function is only available on devices with supporting hardware on chip.



Requires:
Nothing



Examples:
#define LAST_VOLUME 10 // Location in EEPROM



volume++;

write_eeprom(LAST_VOLUME,volume);



Example Files:
ex_intee.c, ex_extee.c, ce51x.c, ce62x.c, ce67x.c



Also See:
read_eeprom(), write_program_eeprom(),

read_program_eeprom(), data eeprom overview

MensagemEnviado: 25 Mar 2010 16:00
por douglaslps
buiz, desculpe pela intromissão no seu topico.

Alguém sabe o equivalente ao que o EdsonCan postou para o C18?

[Resposta]: Procurei um pouco e encontrei esse tópico:
http://www.asm51.eng.br/phpBB/viewtopic ... highlight=

Obrigado.

MensagemEnviado: 25 Mar 2010 16:16
por EDSONCAN
Serve em assembler?

Entra no meu site www.idroid.com.br no item Arquivos.

Baixa o codigo fonte do item 2 - projeto completo de um bloqueador telefone pulse e tone programavel de 3 digitos.

As rotinas para eeprom estão no final e são para 16f84, mas acredito que sirva para entender como funciona.

Edson

MensagemEnviado: 25 Mar 2010 16:21
por buiz
Sim,

Ja utilizo:


Código: Selecionar todos

write_eeprom(endereço,valor);// para gravar

valor = read_eeprom(endereço); // para ler




O problema é, isso é para gravar e ler um inteiro de 8 bits.

Eu preciso gravar uma frase:

Exemplo: "O rato roeu a roupa do rei"

Depois eu tenho que ler ela novamente numa posição da memoria e atribuir a uma variavel.

Ja tentei de algumas forma mas não tive sucesso.

MensagemEnviado: 25 Mar 2010 16:46
por Francesco
Intaum... há duas formas, ou você grava o tamanho junto, ou grava um delimitador. Como na linguagem C já há um delimitador, é melhor seguir o mesmo padrão. Se você alocar, por exemplo, 32 bytes, você pode gravar até 31 caracteres.

Vamos imaginar que você tenha uma rotina como esta abaixo:

Código: Selecionar todos
#define OFFSET 0x0000

void gravaTexto( char * texto )
{
    unsigned char i ;

    // Grava cada byte.
     for( i = 0 ; ( i < 31 ) && ( texto[ i ] != '\0' ) ; i++ )
        write_eeprom( OFFSET + i , ( unsigned char ) texto[ i ] ) ;

    // Grava delimitador.
    write_eeprom( OFFSET + i , '\0' ) ;
}


No código acima, ele grava byte a byte. Possui duas formas de limitar a escrita, ou chega a 31 bytes ou encontra o delimitador de fim da string. Após isso ele grava o delimitador para sinalizar.

A outra rotina ficará assim:

Código: Selecionar todos
void leTexto( char * texto )
{
    unsigned char i ;

    for( i = 0 ; i < 31 ; i++ )
    {
        texto[ i ] = read_eeprom( OFFSET + i ) ;
        if( texto[ i ] == '\0' )
            break ;
    }
}


Este segundo código carrega letra por letra. Como o delimitador foi gravado, ele é testado. Se chegou, carregou a string toda.

Francesco

MensagemEnviado: 25 Mar 2010 16:52
por buiz
Edsoncan,

Obrigado pelo tempo dedicado a me dar estas informações mas sou um 0 em assembler.
Mesmo assim olhei o seu código lá na sua página.
Valeu.

Francesco,

Acho que é essa uma possivel solução, vou gravar aqui e experimentar.

Postarei os resultados.

Obrigado por enquanto.

MensagemEnviado: 25 Mar 2010 16:54
por Francesco
Meu amigo, eu não testei... escrevi a rotina agora no forum. Pode não funcionar.

MensagemEnviado: 25 Mar 2010 17:05
por buiz
Ok, vamos descobrir então se vai funcionar, hehe!

Estou colocando ela no meu programa mas mesmo que não funcione ja deu para clarear um pouco a ideia.

Valeu.

MensagemEnviado: 25 Mar 2010 18:46
por barboza
Postei aquialgumas funções genericas para leitura e escrita de multiplos bytes na eeprom.

MensagemEnviado: 26 Mar 2010 13:39
por buiz
Ok Barboza,

Obrigado pelas informações.

Estou aqui acertando os detalhes pois isso fara parte de um UpGrade num equipamento ja pronto.

Valeu,

E mais uma vez obrigado a todos!