Hola ha todos.
Estoy intentado comunicar el PIC16F877A i una EEPROM 24LC512 con bus I2C con Proteus y no me funciona. Programo con CCS y uso la libreria de CCS para controlar la EEPROM y no hay forma de escribir o leer un dato bien. Realmente no se donde esta el fallo si en escribir o en leer ya que no puedo comprovar si se ha escrito bien la memoria.
A ver vamos por partes:
El Bus I2C creo que me funciona bien por que tengo montado un RCT DS1307 que va con I2C y me funciona a la perfección. Aun con todo he provado de ir cambiando el calor de las resistencias de Pull-Up por que nunca se sabe... pero nada el RTC sige funcionando y la EEPROM sigue sin funcionar...
Supongo que la libreria de CCS para la EEPROM estabien, si alguien sabe algo... He provado de leer y escribir usando la libreria "external_EEPROM.c" de CCS pero la cosa no va...
He provado tb de cambiar de memòria poniendo una mas pequeña para provar que no sea la libreria de Proteus lo que no funciona, pero tampoco va...
Creo que la comunicación con la EEPROM se hace correctamente, ya que he comparado lo que pone en el datasheet de la memòria y CCS lo hace correctamente. A bajo pongo la foto del debuguer de Proteus con la comunicacion a ver si a alguien ve algun fallo...
He provado tb cambiar la libreria de CCS, poniendo el delay_ms(5); que pide el datasheet (aun que eso creo que ya esta controlado en la libreria) pero la cosa sigue sin funcionar...
He provado tb de escribir en una posicion distinta de memoria (que no sea la 00) y he provado de escribir varias posiciones... pero tampoco va. Solo saca o FF o basura...
En definitiba estoy un poco desesperado! Aun con todo he leido en el foro gente que se queja que simulando con Proteus estas memorias con bus I2C dan problemas... si es eso, alguien tiene otra opcion para mi?¿ otra memoria EEPROM?¿ (necessito que sea EEPROM por que los datos no se tienen que borrar...)
Os pongo el codigo y la foto de Proteus a ver si alguien ve algo...
GRACIAS!!
#include <16F877A.h>
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT
#use delay (clock=4000000)
#use rs232(baud=9600, xmit=PIN_A0, rcv=PIN_A1)
#include "lcd.c" //incluim la llibreria de CCS del LCD
#use standard_io (D)
// Libreria DS1307.c //////////////////////////////////////////////////////////
#define RTC_SDA PIN_C4
#define RTC_SCL PIN_C3
#include <_ds1307.c>
///////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
#define EEPROM_SDA PIN_C4
#define EEPROM_SCL PIN_C3
#include <24512.c> //incloem la llibriaria de la EEPROM 24LC512 de 512KBytes --> 64K posicions de memòria -->2^16 = 16 bits adesces
const char Version[]="1.0.D\0";
//int1 flanco=0;
//int1 dump,kdump;
int n,i=0;
char c=0x00;
//char rec=0x00;
byte sec;
byte min;
byte hrs;
byte day;
byte month;
byte yr;
byte dow;
char sdow[11];
// As defined in the following structure the pin connection is as follows:
// D0 enable
// D1 rs
// D2 rw
// D4 D4
// D5 D5
// D6 D6
// D7 D7
//
// LCD pins D0-D3 are not used and PIC D3 is not used.
////////////////////////////////////////////////////////////////////////////////////////
#include<csTeclat2.c> //Incloem la funcio del teclat
void InicialitzaLCD(){ //inicialitza el LCD i treu el missatge de benvinguda durant 3 segons
lcd_init(); //Inicia LCD
lcd_putc(" Benvingut\n"); //treu text
lcd_putc(" Control REG"); //treu text
delay_ms(1000);
}
void LCD_PosaDataHora(byte sec, byte min, byte hrs, byte day, byte month, byte yr, byte sdow){
lcd_putc("\f");
lcd_gotoxy(1,1); //per anar a la primera posicio anem a la (1,1)
printf(lcd_putc,"%02u:%02u:%02u\n",hrs,min,sec);
printf(lcd_putc,"%02u/%02u/%02u %s\n",day,month,yr,sdow);
}
void lee_y_transmite_date_and_time(void){ //llegeix i transmiet via rs232 la data y el temps
ds1307_get_day_of_week((char*) sdow);
ds1307_get_date(day,month,yr,dow);
ds1307_get_time(hrs,min,sec);
printf("\n\%s \%02d/\%02d/\%02d ",sdow,day,month,yr);
printf("\%02d:\%02d:\%02d\r\n", hrs,min,sec);
}
void main(void)
{
char k;
long int j;
set_tris_b(0xF0); //Instrucció obligatoria fent servir csTelcat2.c sino no funciona
//Files: entrades del teclat,
//Colúmnes: sortides de teclat
set_tris_b(0b00000000); //inicialltzo el port C tot com a sortides per la trans I2C
port_b_pullups(TRUE); //Instrucció obligatoria fent servir csTeclat2.c, sino no funciona a no se que posem pullups externes!!
//****************************treiem per la usart la info de base
delay_ms(500);
printf("\r\n");
printf("[RRBOARD2] Real Time Clock version %s\r\n",version);
printf("based on DS1307 Dallas Maxim Hardware\r\n\n");
InicialitzaLCD(); //inicialitzem el LCD i posem el missatge funcionant...
lcd_putc("\f"); //neteja pantalla
lcd_putc("Funcionant...\n"); //treu text
///////////////////AQUI EMPIEZAN MIS PROBLEMAS!!!**********************************
//inicialtizem la eeprom externa
printf("Inicialitzant EEPROM...\r\n");
init_ext_eeprom();
//TEST EEPROM primer escribim despres llegim
printf("Test de la EEPROM externa (Write and read) ...\r\n\n");
write_ext_eeprom(130,0x14);
printf("EEPROM escrita! i=%X Llegint...\r\n",i);
c=read_ext_eeprom(130);
printf(" %X %X \r\n",j,c);
// Inicializa DS1307
printf("Inicializando DS1307 ...\r\n\n");
ds1307_init(DS1307_ALL_DISABLED);
// Set date for -> 5 Agosto 2006 Viernes
// Set time for -> 02:50:00
printf("Set Date & Time to ...\r\n");
ds1307_set_date_time(9,8,6,2,18,51,00);
//delay_ms(1000);
// Llegeix Data i Hora actual y transmet
printf("Fecha y Hora actual en el DS1307\r\n\n");
lee_y_transmite_date_and_time();
printf("\r\n\n");
// Test de RAM -> primer Write, segon Read
printf("Test de la NVRAM interna del RCT (Write and read) ...\r\n\n");
for(i=Start_user_address_nvram;i<end_user_address_nvram+1;i++){
ds1307_write_nvram_byte(i,i);
}
n=0;
for(i=Start_user_address_nvram;i<end_user_address_nvram+1;i++){
c=ds1307_read_nvram_byte(i);
printf("%X ",c);
if(++n==0x0f){
n=0;
printf("\r\n");
}
}
printf("\r\n");
//despres de inicialitzar tot esperem per començar!
puts("\nPulsa una tecla: "); //escribim per la USART
LCD_PosaDataHora(sec, min, hrs, day, month, yr, sdow); //posem l'hora i la data al LCD. L'hora a dalt i la data a baix
while(1)
{
k=kbd_getc(); //llegim la tecla del teclat per polling
delay_ms(100); //per que no perpadegi
if(k)
{
//printf("\b"); //Retrocede una posicion(borra ultima tecla)
printf("%c",k); //Envio de tecla per virtual terminal
lcd_putc(k); //teriem la tecla pulsada pel LCD
}
}
}