Ir ao conteúdo
  • Cadastre-se
josec123wy

Comunicação i2c com pic 18f4550 e eeprom serial

Recommended Posts

Boa Tarde!

 

Fiz este programa para gravação i2c, com eeprom e pic 18f4550 , simulei no proteus ,porém não consegui gravar , como resultado aparece na leitura os valores 255 ou FF.

Favor enviar soluções.

 

include<18F4550.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT
#use delay(clock=20000000)
#use RS232 (Baud=4800, xmit = PIN_C6, rcv = PIN_C7)
#use i2c(master, sda=PIN_B0, scl=PIN_B1)
#include <4bits.h>

//********************definiçÃO de bits*************
 #ORG 0x08, 0x0FFF {}               // espaço reservado ao bootloader
 #build (reset=0x1000, interrupt =0x1018)

int leitura;
void esc_ext_eeprom(long int end, int dado)
{
I2C_start();         //Envia uma condição de 'start' ao barramento I2C  
I2C_Write(0xA0);     //Identifica dispositivo para escrita
I2C_Write(end);      //Identifica endereço na memória
I2C_Write(dado);     //Envia o dado a ser gravado
I2C_Stop();          //Envia uma condição de 'stop' ao barramento I2C
delay_ms(5);         //Atraso de 5ms
}

int le_ext_eeprom(long int end)
{
int leitura;
I2C_Start();                 //Condição de Start
I2C_Write(0xA0);             //Envia byte ao I2C (Dispositivo + escrita)
I2C_Write(end);              //Envia byte ao I2C (endereço)
I2C_Start();                 //Condição de Restary
I2C_Write(0xA1);             //Envia byte ao I2C (Dispositivo + leitura)
leitura = I2C_Read(0);        //Faz a leitura do dado (NO acknowledge)
I2C_Stop();                   //Condição de Stop
delay_ms(5);
return leitura;
}


void main()
{
   config ();
   inicializa_lcd ();                   // inicialização do pic
   pos_lc(0,0);             
   printf (escreve_lcd,"eeprom serial\r\n");
   Delay_ms(500);
   limpa_lcd();

while(true)
   {
   if (!input(PIN_A2))  //Se o botão B0 for pressionado
     {
      pos_lc(0,0);             
      printf (escreve_lcd,"Gravando eeprom serial\r\n");
      Delay_ms(500);
      limpa_lcd();
      esc_ext_eeprom(0,'A');  //Escreve no endereço 0 da memória o caractere 'A'
      esc_ext_eeprom(1,'C');  //Escreve no endereço 1 da memória o caractere 'C'
      esc_ext_eeprom(2,'E');  //Escreve no endereço 2 da memória o caractere 'E'
      esc_ext_eeprom(3,'P');  //Escreve no endereço 3 da memória o caractere 'P'
      esc_ext_eeprom(4,'I');  //Escreve no endereço 4 da memória o caractere 'I'
      esc_ext_eeprom(5,'C');  //Escreve no endereço 5 da memória o caractere 'C'

      delay_ms(500);    //Atraso de 500ms

      }
   
     if (!input(PIN_A3))   //Se o botão B1 for pressionado
      {
      /*Envia as strings pela serial formatadas com os valores lido dos enderecos
        0 até 5 da memória EEPROM externa*/
      pos_lc(0,0);
      printf (escreve_lcd,"End %u\n:",le_ext_eeprom(0));
      pos_lc(1,0);
      printf(escreve_lcd,"End :%u\r\n",le_ext_eeprom(1));
      
                   
    
      }
   }

}
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja a diferença entre teu código e desse outro projeto, clica:

AQUI!

 

Você esta tentando ler uma variável char com um %u em vez de um %c. Vê se resolve. 

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

A rotina config() ajusta direitinho o hw i2c? O sinal não está preso? O endereço físico nos pinos do ci está correto? você vê os sinais com osciloscópio ou terminal i2c? Os dados estão coerentes?

Talvez você tenha que dar um repstarti2c() ou starti2c() 2x ou +

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi!

 Galera

 

Tentei compilar como char no ccs tanto a função como o printf. Estou simulando no proteus ,vou fazer os testes em

bancada , vou conferir os pinos obrigado a todos

adicionado 0 minutos depois
agora, josec123wy disse:

Oi!

 Galera

 

Tentei compilar como char no ccs tanto a função como o printf. Estou simulando no proteus ,vou fazer os testes em

bancada , vou conferir os pinos obrigado a todos Depois retorno

 

  • Triste 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 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

×