int16 New_number ;
New_number = ((0x017 * 0x0E10) ); int32 New_number ;
New_number = ((0x017 * 0x0E10) );
Escríbelo así a ver si te funciona:
Código
int32 New_number;New_number = (int32) (0x0017 * 0x0E10); printf("%LX",New_number);
Nota: ¿Como ves el valor del resultado?
.. pero como puedo hacer para que este valor con este formato pase a una variable ???
c Character
s String or character
u Unsigned int
d Signed int
Lu Long unsigned int
Ld Long signed int
x Hex int (lower case)
X Hex int (upper case)
Lx Hex long int (lower case)
LX Hex long int (upper case)
f Float with truncated decimal
g Float with rounded decimal
e Float in exponential format
w Unsigned int with decimal place inserted. Specify two numbers for n. The first is a total field width. The second is the desired number of decimal places.
RTC = ((hrs * 0x0E10) + (min * 0x03C) + (sec * 0X01))Alarma = ((Alar_hrs * 0x0E10) + (Alar_min * 0x03C) + (Alar_sec * 0X01))
#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();
}
}
/********************************************************************************
* 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));
}
strncmp (s1, s2, n) Compare s1 to s2 (n bytes)