Salvar um String na EEProm interna

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Salvar um String na EEProm interna

Mensagempor buiz » 25 Mar 2010 14:53

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.
Avatar do usuário
buiz
Byte
 
Mensagens: 165
Registrado em: 20 Out 2006 14:59
Localização: Cachoeira do Sul - RS

Mensagempor Francesco » 25 Mar 2010 15:33

Você já tem alguma rotina que escreve ou lê um byte da eeprom?

Francesco
Avatar do usuário
Francesco
Word
 
Mensagens: 699
Registrado em: 04 Mar 2008 00:22
Localização: São Paulo - SP

Mensagempor EDSONCAN » 25 Mar 2010 15:45

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
EDSONCAN
Word
 
Mensagens: 876
Registrado em: 11 Out 2006 14:11

Mensagempor douglaslps » 25 Mar 2010 16:00

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.
douglaslps
Bit
 
Mensagens: 7
Registrado em: 02 Jul 2008 14:22

Mensagempor EDSONCAN » 25 Mar 2010 16:16

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
EDSONCAN
Word
 
Mensagens: 876
Registrado em: 11 Out 2006 14:11

Mensagempor buiz » 25 Mar 2010 16:21

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.
Avatar do usuário
buiz
Byte
 
Mensagens: 165
Registrado em: 20 Out 2006 14:59
Localização: Cachoeira do Sul - RS

Mensagempor Francesco » 25 Mar 2010 16:46

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
Avatar do usuário
Francesco
Word
 
Mensagens: 699
Registrado em: 04 Mar 2008 00:22
Localização: São Paulo - SP

Mensagempor buiz » 25 Mar 2010 16:52

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.
Avatar do usuário
buiz
Byte
 
Mensagens: 165
Registrado em: 20 Out 2006 14:59
Localização: Cachoeira do Sul - RS

Mensagempor Francesco » 25 Mar 2010 16:54

Meu amigo, eu não testei... escrevi a rotina agora no forum. Pode não funcionar.
Avatar do usuário
Francesco
Word
 
Mensagens: 699
Registrado em: 04 Mar 2008 00:22
Localização: São Paulo - SP

Mensagempor buiz » 25 Mar 2010 17:05

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.
Avatar do usuário
buiz
Byte
 
Mensagens: 165
Registrado em: 20 Out 2006 14:59
Localização: Cachoeira do Sul - RS

Mensagempor barboza » 25 Mar 2010 18:46

Postei aquialgumas funções genericas para leitura e escrita de multiplos bytes na eeprom.
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor buiz » 26 Mar 2010 13:39

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!
Avatar do usuário
buiz
Byte
 
Mensagens: 165
Registrado em: 20 Out 2006 14:59
Localização: Cachoeira do Sul - RS


Voltar para PIC

Quem está online

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

x