Grabar desde PIC a Memoria 24AA1025

Hola a todos.

Estoy realizando un proyecto final de carrera. Utilizo un pic 16f690 que hace un registro de 6 entradas Analogicas Digital y un RTC indica la hora. Todo esto se guarda en una memoria 24AA1025. Tanto la memoria como el RTC se hace por medio de I2C, pero cuando graba y envio para visualizarlo todo lo que esta almacenado no es lo que se tendria que ver, en cambio cuando solo funciona el RTC va perfecto.

Utilizo las librerias siguientes:

DS1307.C

#use i2c(Master,Fast,sda=PIN_B4,scl=PIN_B6)

#define Wrtc 0:LOL:0 //Slave address RTC DS1307 in Write
#define Rrtc 0:LOL:1 //Slave address RTC DS1307 in Read

BYTE bin2bcd(BYTE binary_value);
BYTE bcd2bin(BYTE bcd_value);

BYTE bin2bcd(BYTE decimal_value)
{
decimal_value=((decimal_value/10)<<4)|(decimal_value%10);

return decimal_value;
}

BYTE bcd2bin(BYTE bcd_value)
{
bcd_value=((bcd_value>>4)*10)+(bcd_value&0x0F);
return bcd_value;
}


void ds1307_introducir_tiempo(BYTE dia, BYTE mes, BYTE any, BYTE semana, BYTE hora, BYTE minuto, BYTE segundo)
{

i2c_start();
i2c_write(Wrtc); // I2C write address
i2c_write(0x00); // Start at REG 0 - Seconds
i2c_write(bin2bcd(segundo)); // REG 0
i2c_write(bin2bcd(minuto)); // REG 1
i2c_write(bin2bcd(hora)); // REG 2
i2c_write(bin2bcd(semana)); // REG 3
i2c_write(bin2bcd(dia)); // REG 4
i2c_write(bin2bcd(mes)); // REG 5
i2c_write(bin2bcd(any)); // REG 6
i2c_write(0x80); // REG 7 - Disable squarewave output pin
i2c_stop();
}

void ds1307_obtener_calendario(BYTE &dia, BYTE &mes, BYTE &any, BYTE &semana)
{
i2c_start();
i2c_write(Wrtc);
i2c_write(0x03); // Start at REG 3 - Day of week
i2c_start();
i2c_write(Rrtc);
semana = bcd2bin(i2c_read() & 0x7f); // REG 3
dia = bcd2bin(i2c_read() & 0x3f); // REG 4
mes = bcd2bin(i2c_read() & 0x1f); // REG 5
any = bcd2bin(i2c_read(0)); // REG 6
i2c_stop();
}

void ds1307_obtener_hora(BYTE &hora, BYTE &minuto, BYTE &segundo)
{
i2c_start();
i2c_write(Wrtc);
i2c_write(0x00); // Start at REG 0 - Seconds
i2c_start();
i2c_write(Rrtc);
segundo = bcd2bin(i2c_read() & 0x7f);
minuto = bcd2bin(i2c_read() & 0x7f);
hora = bcd2bin(i2c_read(0) & 0x3f);
i2c_stop();

}

24AA1025.c

#ifndef EEPROM_SDA

#define EEPROM_SDA PIN_B4
#define EEPROM_SCL PIN_B6

#endif


#define EEPROM_ADDRESS int32
#define EEPROM_SIZE 0x1FFFF

#use i2c(master, sda=EEPROM_SDA, scl=EEPROM_SCL)

void write_ext_eeprom(int32 address, BYTE data)
{
int1 status;
int command;

if (address>65535)command=0xa8; // Check if address is located in Block 0/1
else command=0xa0;

i2c_start();
i2c_write(command);
i2c_write(address>>8);
i2c_write(address);
i2c_write(data);

i2c_stop();
i2c_start();
status=i2c_write(command);
while(status==1)
{
i2c_start();
status=i2c_write(command);
}
}

BYTE read_ext_eeprom(int32 address) {
BYTE data;
int command;

if (address>65535)command=0xa8;
else command=0xa0;

i2c_start();
i2c_write(command);
i2c_write(address>>8);
i2c_write(address);
i2c_start();
i2c_write(command+1);
data=i2c_read(0);
i2c_stop();
return(data);
}
 
Atrás
Arriba