TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: neoakira en 29 de Diciembre de 2010, 08:34:03

Título: Grabar desde PIC a Memoria 24AA1025
Publicado por: neoakira en 29 de Diciembre de 2010, 08:34:03

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 0xD0        //Slave address RTC DS1307 in Write   
#define Rrtc 0xD1        //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);
}

Título: Re: Grabar desde PIC a Memoria 24AA1025
Publicado por: Nocturno en 29 de Diciembre de 2010, 09:01:43
¿Y si haces trabajar en solitario a la memoria EEPROM sí funciona, o tampoco?