Hola a todos, y gracias por toda su ayuda pero realmente estoy mas confundida ahora.
Partiendo del trabajo de RedPic sombre el
DS1307 lo que pretendo es comparar la lectura que me entrega el RTC (hrs, min, sec) cada segundo con otros valor de hrs, min, sec que se encuentran alamcenado en una region de la memoria EEprom (apartir de la direccion 200), para hecer esto he tratado de convertir todos estos valores a segundos:
RTC = ((hrs *3600)+(min*60)+sec)
RTC = ((hrs * 0x0E10) + (min * 0x03C) + (sec * 0X01))Alarma = ((Alar_hrs * 0x0E10) + (Alar_min * 0x03C) + (Alar_sec * 0X01))
El problema es que no puedo obtener los valores corectos de RTC ni de Alarma para hacer la comparacion.
Alguien me podria dar una sugerencia de como solucionar esto
He modificado el #include <DS1307x.h> para tener acceso solamente la los valores de tiempo.
Aqui esta mi codigo:
#include <18F452.h>
#include <string.h>
#include <stdlib.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#define RTC_SDA PIN_C4
#define RTC_SCL PIN_C3
#define SIRENA PIN_D0
#define Alarma_ON output_high
#define Alarma_OFF output_low
#include <DS1307x.h>
char Alarma_Seg[] = "00";
char Alarma_Min[] = "30";
char Alarma_Hrs[] = "23";
int i;
int8 sec ;
int8 min ;
int8 hrs ;
int16 Alar_sec;
int16 Alar_min;
int16 Alar_hrs;
int32 Alarma;
int32 RTC;
int32 var1;
int32 var2;
char Buffer_Seg[3];
char Buffer_Min[3];
char Buffer_Hrs[3];
#INT_EXT
void IntRB0()
{
ds1307_get_time(hrs,min,sec);
}
void Init_Alarma_EEprom(){
for (i = 0; i< 2; i++) write_eeprom( 210+i, Alarma_Seg[i]);
for (i = 0; i< 2; i++) write_eeprom( 212+i, Alarma_Min[i]);
for (i = 0; i< 2; i++) write_eeprom( 214+i, Alarma_Hrs[i]);
}
void Compara_RTC_Alarma(){
for (i = 0; i< 2; i++){ Buffer_Seg[i] = read_eeprom(210+i);
Alar_sec = atoi(Buffer_Seg);}
for (i = 0; i< 2; i++){ Buffer_Min[i] = read_eeprom(212+i);
Alar_min = atoi(Buffer_Min);}
for (i = 0; i< 2; i++){ Buffer_Hrs[i] = read_eeprom(214+i);
Alar_hrs = atoi(Buffer_Hrs);}
RTC = ((hrs * 0x0E10) + (min * 0x03C) + (sec * 0X01));
var1 = printf("%lx \n\r ", RTC);
Alarma = ((Alar_hrs * 0x0E10) + (Alar_min * 0x03C) + (Alar_sec * 0X01));
var2 = printf("%lx \n\r ", Alarma);
if (var2 >= var1)
Alarma_ON(SIRENA);
else
Alarma_OFF(SIRENA);
}
void main() {
enable_interrupts(int_ext);
ext_int_edge(H_TO_L);
enable_interrupts(GLOBAL);
Init_Alarma_EEprom();
ds1307_init();
Delay_ms(300);
while (TRUE){
Compara_RTC_Alarma();
}
}
Este es el include
/********************************************************************************
* DS1307.C *
* Driver para el Time Clock DS1307 *
*********************************************************************************/
#define RTC_SDA PIN_C4
#define RTC_SCL PIN_C3
#use i2c(master, sda=RTC_SDA, scl=RTC_SCL)
BYTE bin2bcd(BYTE binary_value);
BYTE bcd2bin(BYTE bcd_value);
void ds1307_init(void)
{
BYTE seconds = 0;
i2c_start();
i2c_write(0xD0); // WR to RTC
i2c_write(0x00); // REG 0
i2c_start();
i2c_stop();
delay_us(3);
i2c_start();
i2c_write(0xD0); // WR to RTC
i2c_write(0x00); // REG 0
i2c_write(0x00);
i2c_write(0x00); // WR to RTC
i2c_write(0x00); // WR to RTC
i2c_write(0x00); // WR to RTC
i2c_write(0x00); // WR to RTC
i2c_write(0x00); // WR to RTC
i2c_write(0x00); // Control Register
i2c_write(0x10); // Disable squarewave output pin
i2c_stop();
}
void ds1307_set_time(BYTE hr, BYTE min, BYTE sec)
{
sec &= 0x7F;
hr &= 0x3F;
i2c_start();
i2c_write(0xD0); // I2C write address
i2c_write(0x00); // Start at REG 0 - Seconds
i2c_write(bin2bcd(sec)); // REG 0
i2c_write(bin2bcd(min)); // REG 1
i2c_write(bin2bcd(hr)); // REG 2
i2c_stop();
}
void ds1307_get_time(BYTE &hr, BYTE &min, BYTE &sec)
{
i2c_start();
i2c_write(0xD0);
i2c_write(0x00); // Start at REG 0 - Seconds
i2c_start();
i2c_write(0xD1);
sec = bcd2bin(i2c_read() & 0x7f);
min = bcd2bin(i2c_read() & 0x7f);
hr = bcd2bin(i2c_read(0) & 0x3f);
i2c_stop();
}
BYTE bin2bcd(BYTE binary_value)
{
BYTE temp;
BYTE retval;
temp = binary_value;
retval = 0;
while(1)
{
// Get the tens digit by doing multiple subtraction
// of 10 from the binary value.
if(temp >= 10)
{
temp -= 10;
retval += 0x10;
}
else // Get the ones digit by adding the remainder.
{
retval += temp;
break;
}
}
return(retval);
}
// Input range - 00 to 99.
BYTE bcd2bin(BYTE bcd_value)
{
BYTE temp;
temp = bcd_value;
// Shifting upper digit right by 1 is same as multiplying by 8.
temp >>= 1;
// Isolate the bits for the upper digit.
temp &= 0x78;
// Now return: (Tens * 8) + (Tens * 2) + Ones
return(temp + (temp >> 2) + (bcd_value & 0x0f));
}