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));
}
}
}