Ir ao conteúdo

Posts recomendados

Postado

preciso realizar a escrita e a leitura de dados na memoria EEPROM interna de um pic18f4550, no entanto como estou aprendendo linguagem C ainda, não tenho muito conhecimento a respeito e não consigo adquirir alguma biblioteca para o C18 da Microchip.

Tentei procurar pelas bibliotecas descritas no livro Microcontroladores PIC18 aprenda e programe em linguagem C, do autor Alberto Noboru Miyadaira, no entanto não obtive resultados, caso alguém possa me dar alguma dica agradeço desde já.

Postado

no datasheet tem o código em assembler se não me engano de como escrever e ler.

 

Eu buscando tutoriais no google :

Programando para MikroC

https://electrosome.com/internal-eeprom-pic-microcontroller/

Use o google tradutor se não entender uma passagem ou pergunte por aqui...

 

como não uso o c18... e também Para o c18 eu não achei de cara tutorial específico

mas se procurar por "pic18 EEPROM write read c18" no google você acha alguns

 

T_T

Postado

obg, vou continuar procurando para ver se acho alguma coisa, o que achei no datasheet se encontra apenas em linguagem assembly infelizmente kk

  • Membro VIP
Postado

 

não precisa ser em c18

#define  EEPROM_WRITE(addr, value) \
do{ \
    while(WR)continue;EEADR=(addr);EEDATA=(value); \
    CARRY=0;if(GIE) CARRY=1;GIE=0; \
    WREN=1;EECON2=0x55;EECON2=0xAA;WR=1;WREN=0; \
    if(CARRY) GIE=1; \
}while(0)

#define  EEPROM_READ(addr) ((EEADR=(addr)),(RD=1),EEDATA)

É pra família pic16f. Pra 18f é bem igual. Se achares que deves, deves consultar o datasheet, observares e perceberes as funções dos registros

  • Curtir 1
Postado
7 minutos atrás, vtrx disse:

Respondi no outro forum.

Quero links uhahuahuahua

Postado
void Write_b_eep( unsigned int Endere,unsigned char bdata ) 
{ 
   EEADR = (Endere & 0x0ff);           
   EEDATA =bdata;       
   EECON1bits.EEPGD = 0;     
   EECON1bits.CFGS = 0;     
   EECON1bits.WREN = 1;     
   INTCONbits.GIE = 0;     
   EECON2 = 0x55;     
   EECON2 = 0xAA;     
   EECON1bits.WR = 1; 
   while(EECON1bits.WR);   
   INTCONbits.GIE = 1;     
   EECON1bits.WREN = 0;
 }
// EXEMPLO DE ESCRITA ->Write_b_eep(0x0069,0x0010);     
//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 unsigned char Read_b_eep( unsigned int badd ) 
   {     
   EEADR = (badd & 0x0ff);       
   EECON1bits.CFGS = 0;     
   EECON1bits.EEPGD = 0;     
   EECON1bits.RD = 1;     
   return ( EEDATA );              // return with read byte
// EXEMPLO DE LEITURA ->Read_b_eep( 0x0069) 
    }

 

  • Curtir 1
Postado

obrigado ae pessoal, ajudou bastante, mas acho que me deparei com outro problema devido a não ser possível gravar valores acima de 255, terei de encontrar outra forma ou aprender a usar a EEPROM externa também, pois meu projeto consiste em um contador o qual sera necessário guardar valores grandes. 

 

mas ja ajudou muito, agradeço a todos.

  • Membro VIP
Postado
7 minutos atrás, rafa.dss disse:

não ser possível gravar valores acima de 255

Isso é o que você pensa... ainda. Basta usar 2 ou + bytes(+ bytes há outra técnica) . Desmembrar pra gravar, remembrar após ler

Algo como

void grava16bits(unsigned char endereco, unsigned int dado)

{

EEPROM_WRITE(endereco, dado);

EEPROM_WRITE(endereco+1, dado>>8);

}

 

pra recompor...

 

unsigned int le16bits(unsigned char endereco)

{

unsigned int dado;

dado=EEPROM_READ(endereco);

dado|=EEPROM_READ(endereco+1);

return dado;

}

 

  • Curtir 1
Postado

hmmm interessante, você teria algum exemplo de como realizar esse processo para guardar o valor de uma variavel, estou com um pouco de dificuldade nisso

adicionado 43 minutos depois

Ouvi dizer que utilizando uma forma de concatenar os bytes é possível armazenar uma quantidade maior, mas não faço a menor ideia de como fazer isso...

  • Membro VIP
Postado

tente...

10 horas atrás, Isadora Ferraz disse:

Algo como

void grava16bits(unsigned char endereco, unsigned int dado)

{

EEPROM_WRITE(endereco, dado);

EEPROM_WRITE(endereco+1, dado>>8);

}

 

pra recompor...

 

unsigned int le16bits(unsigned char endereco)

{

unsigned int dado;

dado=EEPROM_READ(endereco);

dado|=EEPROM_READ(endereco+1);

return dado;

}

Se mesmo assim ainda não tiver ....

9 horas atrás, rafa.dss disse:

a menor ideia de como fazer isso...

ambos nós precisamos de mais ajuda do que achamos que precisamos.

 

Bem de fato há um pequeno bug...Tentemos assim...

 

unsigned int le16bits(unsigned char endereco)

{

unsigned int dado;

dado=EEPROM_READ(endereco+1);//MSB

dado<<=8;

dado|=EEPROM_READ(endereco);//LSB

return dado;

}

 

ah sim...

9 horas atrás, rafa.dss disse:

um exemplo de como realizar esse processo para guardar o valor de uma variavel

unsigned int a=23456;//argumento - endereço deve ser par, dado a gravar, int

...

grava16bits(0,a);

...

a=0;

a=le16bits(0); //argumento - endereço deve ser par

 

+1

for (i=0;i<128;i+=2) grava16bits(i,i*256);

  • Amei 1
Postado

muito obrigado, ele passou a gravar valores acima de 255, no entanto único problema que houve foi quando carrego o programa e o valor inicial não aparece no display, ele apresenta alguns caracteres aleatórios até que eu realize o incremento da variável, após isso ele funciona perfeitamente.

adicionado 3 minutos depois

for (i=0;i<128;i+=2) grava16bits(i,i*256);

me desculpe mas não entendi a função desta linha para o programa

adicionado 31 minutos depois

OBS: poderiam me esclarecer uma duvida ? como o programa tera de reescrever a informação na EEPROM  varias vezes, pois o projeto consiste em um "contador de entrada e saída de pessoas" resumindo, não há nenhum limite para quantas vezes é possível alterar o valor presente na memoria EEPROM há ?

  • Membro VIP
Postado
2 horas atrás, rafa.dss disse:

valor inicial não aparece no display

que valor? que display? que programa?

 

2 horas atrás, rafa.dss disse:

for (i=0;i<128;i+=2) grava16bits(i,i*256);

Essencialmente o c diz:  'comece i com zero, e até atingir cento e vinte e oito, vá incrementando de dois em dois. A cada incremento, grave no endereço (par) i o valor de i vezes duzentos e 56'. Mas isso é um dos conceitos básicos da linguagem c os quais prefiro que busques aprender ok?

 

Sim há limite da ordem de milhões. Pra contornar isso há algumas técnicas , você não precisa gravar a cada evento. Há uma técnica que te orienta assim: só grave na ram uma variável qualquer e SÓ registre na eeprom um pouco antes de desligar E se houve mudança do dado. Não é difícil mas depende um pouco do seu ... digamos... nível evolutivo que, devido à sua dúvida anterior, penso que ainda precisa de alguns passos.

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!