TODOPIC
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?
01 de Septiembre de 2014, 20:24:21

Ingresar con nombre de usuario, contraseña y duración de la sesión
Buscar:     Búsqueda Avanzada
347933 Mensajes en 39035 Temas por 40655 Usuarios
Último usuario: ejp_sharingan
* Inicio Ayuda Buscar Calendario Ingresar Registrarse
Buscar en TodoPIC
+  TODOPIC
|-+  Microcontroladores PIC
| |-+  Lenguaje C para microcontroladores PIC (Moderadores: Modulay, pikman, pocher, vszener, Suky)
| | |-+  multiplicacion de nueros hexadecimales
0 Usuarios y 1 Visitante están viendo este tema. « anterior próximo »
Páginas: [1] Marcar como favorito Imprimir
Autor Tema: multiplicacion de nueros hexadecimales  (Leído 5514 veces)
Medusa
PIC16
***
Desconectado Desconectado

Sexo: Femenino
Mexico Mexico

Mensajes: 225



« : 07 de Agosto de 2009, 18:06:39 »

hola, cual es el problema e este codigo?

Código:
int16 New_number ;

New_number = ((0x017 * 0x0E10) );

No puedo obtener el resultado corresto el cual es : 0x14370 pero obtengo este valor: 17264, cual es mi error????
En línea
RedPic
Administrador
DsPIC33
*******
Desconectado Desconectado

Sexo: Masculino
Tibet Tibet

Mensajes: 5190



WWW
« Respuesta #1 : 07 de Agosto de 2009, 18:26:08 »

Medusa, 0x14370 en decimal es 82800 y en binario es 10100001101110000 ... o sea 17 bits para una variable de 16 bits, que solo alcanza hasta 65536 valores.

De hecho 82800 - 65536 = 17264 que es el número que tu obtienes tras haber alcanzado el límite de la variable New_number, la has desbordado y te muestra el resto tras ello.

Utiliza int32 New_number; y veras como funciona correctamente.  Mr. Green
« Última modificación: 07 de Agosto de 2009, 18:31:19 por RedPic » En línea

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania
Medusa
PIC16
***
Desconectado Desconectado

Sexo: Femenino
Mexico Mexico

Mensajes: 225



« Respuesta #2 : 07 de Agosto de 2009, 18:50:41 »

Hola RedPic, hay algo que esta mal por que el resultado es el mismo a pesar de que he variado el formato.

Código:
int32 New_number ;

New_number = ((0x017 * 0x0E10) );
En línea
RedPic
Administrador
DsPIC33
*******
Desconectado Desconectado

Sexo: Masculino
Tibet Tibet

Mensajes: 5190



WWW
« Respuesta #3 : 07 de Agosto de 2009, 19:52:16 »

Escríbelo así a ver si te funciona:

Código
GeSHi (csharp):
  1. int32 New_number;
  2. New_number = (int32) (0x0017 * 0x0E10);
  3. printf("%LX",New_number);
  4.  

Nota: ¿Como ves el valor del resultado?
« Última modificación: 07 de Agosto de 2009, 19:54:43 por RedPic » En línea

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania
Medusa
PIC16
***
Desconectado Desconectado

Sexo: Femenino
Mexico Mexico

Mensajes: 225



« Respuesta #4 : 07 de Agosto de 2009, 20:27:48 »

Citar
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?

El resultado se imprime correctamente, estoy usando el UART para leer esto,
Pero dime para leer este valor tu lo estas formateando con "%LX" pero como puedo hacer para que este valor con este formato pase a una variable ???
En línea
gera
Colaborador
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 2126


linux - the future is open


« Respuesta #5 : 07 de Agosto de 2009, 21:04:01 »

Medusa, la pregunta q te hizo red pic es que como haces para ver el resultado. Q funcion usas? printf?
Si queres poner el resultado en ese formato, tendrias q ponerlo en un string de la siguiente manera:
sprintf(string,"%LX",New_number);
Donde string es un puntero a un arreglo de chars.
saludos!
En línea


"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein
MLO__
Colaborador
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Colombia Colombia

Mensajes: 4497

MLO


« Respuesta #6 : 07 de Agosto de 2009, 21:35:35 »

.. pero como puedo hacer para que este valor con este formato pase a una variable ???

Pues ... con un = !!!!!

El valor no se esta formateando, lo que se hace es asignar el tipo de salida:

para la funcion printf():

Citar
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.

Saludos
En línea

El papel lo aguanta todo
BrunoF
Administrador
DsPIC30
*******
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 3767



« Respuesta #7 : 07 de Agosto de 2009, 23:06:38 »

MLO me parece que a lo que se refiere medusa es que quiere guardar el valor TEXTUAL en hexadecimal.

Es decir, no quiere guardar el valor 0x14370. Quiere guardar "0x14370"...así que lo que te propone gera es la solución más fácil.
En línea

"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.
Suky
Moderador Local
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 6761


Con Qt...


WWW
« Respuesta #8 : 07 de Agosto de 2009, 23:16:39 »

Si es pasar de un string al valor numérico se usa:

8bitsValue=atoi(String)
16bitsValue=atol(String)
32bitsValue=atoi32(String)


String puede ser decimal o hexadecimal.

Saludos!
En línea

MLO__
Colaborador
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Colombia Colombia

Mensajes: 4497

MLO


« Respuesta #9 : 08 de Agosto de 2009, 01:09:07 »

Ah!!!

Es que no especifica que la variable es del tipo string jeje.

Y si, es recomendable usar sprintf() para pasarlo a una variable tipo string.

En línea

El papel lo aguanta todo
Medusa
PIC16
***
Desconectado Desconectado

Sexo: Femenino
Mexico Mexico

Mensajes: 225



« Respuesta #10 : 10 de Agosto de 2009, 14:13:56 »

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)
Código:
RTC = ((hrs * 0x0E10) + (min * 0x03C) + (sec * 0X01))

Código:
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:
Código:
#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

Código:
/********************************************************************************
*                               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));
}
En línea
BrunoF
Administrador
DsPIC30
*******
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 3767



« Respuesta #11 : 10 de Agosto de 2009, 16:09:37 »

Mal:

for (i = 0; i< 2; i++){ Buffer_Seg = read_eeprom(210+i);
            Alar_sec = atoi(Buffer_Seg);}
       for (i = 0; i< 2; i++){ Buffer_Min = read_eeprom(212+i);
            Alar_min = atoi(Buffer_Min);}
       for (i = 0; i< 2; i++){ Buffer_Hrs = read_eeprom(214+i);
            Alar_hrs = atoi(Buffer_Hrs);}

Bien:

for (i = 0; i< 2; i++){ Buffer_Seg = read_eeprom(210+i);}
            Alar_sec = atoi(Buffer_Seg);
       for (i = 0; i< 2; i++){ Buffer_Min = read_eeprom(212+i);}
            Alar_min = atoi(Buffer_Min);
       for (i = 0; i< 2; i++){ Buffer_Hrs = read_eeprom(214+i);}
            Alar_hrs = atoi(Buffer_Hrs);

Mal:
    RTC = ((hrs * 0x0E10) + (min * 0x03C) + (sec * 0X01));
    Alarma = ((Alar_hrs * 0x0E10) + (Alar_min * 0x03C) + (Alar_sec * 0X01))    

Bien:
    RTC = (((int32)hrs * 0x0E10) + (min * 0x03C) + (sec * 0X01));
    Alarma = (((int32)Alar_hrs * 0x0E10) + (Alar_min * 0x03C) + (Alar_sec * 0X01));

Mejor:
    RTC = (int32)hrs*3600+min*60+sec;
    Alarma = (int32)Alar_hrs*3600+ Alar_min*60+Alar_sec;

Tendrías que leer un poco más cómo hace los casting implícitos el CCS

No miré el resto...Saludos
« Última modificación: 10 de Agosto de 2009, 19:57:53 por BrunoF » En línea

"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.
MLO__
Colaborador
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Colombia Colombia

Mensajes: 4497

MLO


« Respuesta #12 : 10 de Agosto de 2009, 16:43:30 »

Hola.

Yo creo que la opcion mas facil es cargar todo a un buffer (horas, minutos y segundos leidos del RTC) y hacer la comparacion completa con strncmp(), el otro string seria con los valores que tienes almacenados en la memoria EEPROM.

Citar
strncmp  (s1, s2, n) Compare s1 to s2 (n bytes)

Saludos
En línea

El papel lo aguanta todo
Medusa
PIC16
***
Desconectado Desconectado

Sexo: Femenino
Mexico Mexico

Mensajes: 225



« Respuesta #13 : 10 de Agosto de 2009, 17:39:48 »

   rebotando   rebotando   rebotando hola, gracias a todos por toda la ayuda, ya resolvi el problem,   Mr. Green
En línea
RedPic
Administrador
DsPIC33
*******
Desconectado Desconectado

Sexo: Masculino
Tibet Tibet

Mensajes: 5190



WWW
« Respuesta #14 : 10 de Agosto de 2009, 18:41:03 »

¿Como?
En línea

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania
Medusa
PIC16
***
Desconectado Desconectado

Sexo: Femenino
Mexico Mexico

Mensajes: 225



« Respuesta #15 : 10 de Agosto de 2009, 21:53:39 »

Con las correciones que me hizo BrunoF  Mr. Green
En línea
TODOPIC
   

 En línea
Páginas: [1] Imprimir 
« anterior próximo »
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.19 | SMF © 2006-2008, Simple Machines XHTML 1.0 válido! CSS válido!
Página creada en 0.06 segundos con 24 consultas.