TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: micronet3 en 12 de Septiembre de 2009, 13:37:11

Título: guardar en la eeprom un numero de 16 bits
Publicado por: micronet3 en 12 de Septiembre de 2009, 13:37:11
hola amigos, una consulta.
estoy guardando numeros de 16 bits en la memoria eeprom interna del 18f4550, por ejemplo en la posicion 2,  y resulta que cuando leo solo me lee la parte baja, es decir los 8 primeros bits del numero.
fecha=65500;
write_eeprom(fecha,var_pos);
fecha5=read_eeprom(var_pos);
printf(lcd_putc,"\f%Lu",fecha5);
delay_ms(200);

se puede guardar numeros de 16 bits en la eeprom, si no es asi como haria para guardar este dato. muchas gracias por sus respuestas
Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: Suky en 12 de Septiembre de 2009, 13:53:00
La eeprom interna es de 8 bits por eso el resultado obtenido. Puedes usar make8() para dividir la variable de 16 bits en 2 de 8 bits y guardarlos en la eeprom.


Saludos!
Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: micronet3 en 12 de Septiembre de 2009, 14:12:37
muchas gracias amigo suky, si interesante, no habia visto la funcion,  make8(), voy a ver como lo acomdo.
otra posibilidad que estoy analizando es
1-------------> transformar el numero de 16 bits en string, y guardarlo en la eeprom
2-------------> leer el string de la eeprom
3------------->transformar el string en un int

seria factible asi amigo, voy a ver las dos posibilidades.
Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: Suky en 12 de Septiembre de 2009, 14:19:26
Es factible pero ocupas mucha mas memoria  :tongue:
Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: migsantiago en 12 de Septiembre de 2009, 14:27:43
Puedes usar punteros considerando que los datos en CCS se guardan con little endian.

Código: [Seleccionar]
write_16_eeprom(int16 dato, int8 direccion)
{
write_eeprom((int8)dato, direccion); //Guarda byte bajo
write_eeprom(*(&dato+1), direccion+1); //Guarda byte alto
}
Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: gera en 12 de Septiembre de 2009, 14:35:21
Otra alternativa es trabajar con desplazamiento de bits y mascaras:

Código: [Seleccionar]
write_16_eeprom(int16 dato, int8 direccion)
{
    write_eeprom( (int8) (dato>>8 & 0x00FF), direccion); //parte alta
    write_eeprom( (int8) (dato & 0x00FF), direccion+1);   //parte baja
}

Convertirlo en string no va a ayudar porq vas a tener un byte por cada cifra decimal, y va a ocupar mucha mas memoria.
saludos!!!
Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: migsantiago en 12 de Septiembre de 2009, 14:49:04
Otra alternativa es trabajar con desplazamiento de bits y mascaras:

Código: [Seleccionar]
write_16_eeprom(int16 dato, int8 direccion)
{
    write_eeprom( (int8) (dato>>8 & 0x00FF), direccion); //parte alta
    write_eeprom( (int8) (dato & 0x00FF), direccion+1);   //parte baja
}

Convertirlo en string no va a ayudar porq vas a tener un byte por cada cifra decimal, y va a ocupar mucha mas memoria.
saludos!!!

Gera, eso es exactamente lo que la macro make8 hace  ;-)

Código: [Seleccionar]
Function:
Extracts the byte at offset from var. Same as: i8 = (((var >> (offset*8)) & 0xff) except it is done with a single byte move.
Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: gera en 12 de Septiembre de 2009, 17:33:29
Las cosas q uno se entera. Tenian q hacer una macro para algo tan simple? jeje.
Gracias por el dato, es bueno saberlo por si en el futuro me encuentro con un pedazo de codigo jeje.
Hay alguna macro o funcion "unmake"? porq si no a la larga vamos a tener q hacer desplazamiento de bits y mascara para recuperar el valor.
saludos!
Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: micronet3 en 12 de Septiembre de 2009, 17:53:31
si ahora me doy cuenta, cada digito se guardaria en una posicion de memoria si estuviera en string.
con respecto a

write_16_eeprom(int16 dato, int8 direccion)
{
write_eeprom((int8)dato, direccion); //Guarda byte bajo
write_eeprom(*(&dato+1), direccion+1); //Guarda byte alto
}

esta instruccion:
write_eeprom((int8)dato, direccion);
lo que hace es guardar el byte bajo, se entiende perfectamente, pues al convertirlo en int8 solo alcanza para el primer byte, y el ccs no hace nada(algun redondeo).
 la siguiente instruccion es la que no esta muy claro

write_eeprom(*(&dato+1), direccion+1)
 por (&dato+1) entiendo que dato es un puntero, y lo que hacer es escribir en la direccion mas uno apuntado por dato?
 es esto asi amigos


y la lectura seria algo parecido?





Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: Suky en 12 de Septiembre de 2009, 17:56:28
Exactamente, lo que hace esa linea es apuntar la dirección del byte alto de dato.
Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: gera en 12 de Septiembre de 2009, 18:12:51
micronet3, me parece q tenes mal el concepto de string. Un string es un arreglo de caracteres, o sea q un numero se representaria a traves de los caracteres '1' 2' '3', etc...
Lo q vos decis es simplemente un arreglo de enteros de 8 bits. Q seria algo parecido a lo q estamos haciendo cuando apuntamos a la posicion de memoria baja y alta donde esta el numero.
saludos!
Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: micronet3 en 12 de Septiembre de 2009, 18:13:50
para el proceso de lectura de datos de la eeprom, ahorita lo que se me ocurre hacer lo siguiente, ya que se tiene que unir los byte alto y bajo


numero_escrito en la eeprom=BYTE(bajo)+b8*2(8)+b9*2(9)+b10*2(10)+ b11*2(11)+ b12*2(12)+ b13*2(13)+ b14*2(14)+ b15*2(15).

este seria la forma o existe alguna funcion predefinida que realiza la lectura de un numero de 16bits
Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: Suky en 12 de Septiembre de 2009, 18:15:53
Leer los 2 bytes y utilizar make16  :mrgreen:

Cita de: ayuda CCS
i16 = MAKE16(varhigh, varlow)



Saludos!
Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: micronet3 en 12 de Septiembre de 2009, 18:21:09
gera, mi concepto de string es el siguiente por ejemplo y bueno lo que entendi de ustedes

por ejemplo tenemos un numero grande 11625.
si lo convierto a string quedaria de la siguiente manera

num1[0]='5'
num1[1]='2'
num1[2]='6'
num1[3]='1'
num1[4]='1'
num1[5]='0x00'

 para guardarlo lo haria de la siguiente manera, o se guardaria

for(i=0;i<6;i++)
write_eeprom(i);


ese es mi concepto si estoy equivocado por favor corregirlo. el caracter nulo me entra una duda, es la siguiente, si se tiene que guardar tambien en la eeprom?


Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: micronet3 en 12 de Septiembre de 2009, 18:23:06
disculpen se me paso
 for(i=0;i<6;i++)
write_eeprom(i, num1);
Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: micronet3 en 12 de Septiembre de 2009, 18:27:13
ok amigo suky gracias , que bueno que se pueda encontrar personas como ustedes aqui en el foro.

Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: micronet3 en 12 de Septiembre de 2009, 18:28:59
podria ser asi

i16 = MAKE16(read_eeprom(position+1), read_eeprom(position));

Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: gera en 12 de Septiembre de 2009, 18:43:32
El q se equivoco fui yo entonces, tenes bien el concepto de string (aunq los indices estan al reves jeje). Pero fijate q necesitas un byte por cada digito. No es muy eficiente.
Y si, podes hacer un make16 asi, siempre y cuando hayas guardado primero la parte baja y luego la alta en la eeprom. O sea, restitui los int8 en el mismo orden q los guardaste
saludos!!
Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: micronet3 en 12 de Septiembre de 2009, 19:09:52
si amigo gera tienes razon
 seria asi

num1[0]='1'
num1[1]='1'
num1[2]='6'
num1[3]='2'
num1[4]='5'
num1[5]='0x00'


Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: micronet3 en 12 de Septiembre de 2009, 19:12:16
a bueno ya no voy a utilizar este metodo, mas bien voy a utilizar para escribir en la eeprom las funciones que amablemente han puesto ustedes, y para leer los datos de la eeprom, la funcion make.


Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: micronet3 en 12 de Septiembre de 2009, 20:26:20
estaba intentando guardar un numero de 16 bits en  la memoria eeprom pero sin resultados, a ver si ustedes encuentran el error

#include <18F452.h>
#fuses XT,NOWDT,PUT,BROWNOUT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)

//======================================
void write_16_eeprom(int16 dato, int8 direccion)
{
write_eeprom((int8)dato, direccion); //Guarda byte bajo
write_eeprom(*(&dato+1), direccion+1); //Guarda byte alto
}

void main(void)
{
int8 num1,num2;
int8 direccion=0;
int16 RTC;
int16 RTC2;
int16 min = 35;

RTC = (int16)min*60;
write_16_eeprom(RTC,direccion);
num1=read_eeprom(direccion);
num2=read_eeprom(direccion+1);

RTC2=MAKE16(num2,num1);
printf("RTC = %lu\n\r", RTC2);

while(1);
}

Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: PalitroqueZ en 13 de Septiembre de 2009, 10:27:07
también podias haber usado:

Código: C
  1. ...
  2. int16 pepe[1];
  3. /////////////////////////////////////
  4. void main(){
  5.    pepe[0]=0xBECA;
  6.    vGrabar_Trama_Eeprom(pepe,0);
  7. }
  8. ////////////////////////////////////////////////////////////////
  9. void Grabar_Eeprom(int8 *dato, int16 direccion){
  10.         write_eeprom(direccion++, *dato++); // byte alto
  11.         write_eeprom(direccion, *dato++);       // byte bajo
  12. }

Grabar_Eeprom() solo funciona si el argumento está declarado como un array. ej: pepe[1]

Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: migsantiago en 13 de Septiembre de 2009, 10:49:24
estaba intentando guardar un numero de 16 bits en  la memoria eeprom pero sin resultados, a ver si ustedes encuentran el error


Pero nos tienes que decir qué es lo que llega a hacer el código.
Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: Suky en 13 de Septiembre de 2009, 11:13:47
Aparte en write_eeprom el primer parámetro es la dirección y el segundo el dato a grabar!
Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: migsantiago en 13 de Septiembre de 2009, 11:15:33
Aparte en write_eeprom el primer parámetro es la dirección y el segundo el dato a grabar!

jeje seguramente es eso, escribí la función sin fijarme en eso  :oops:  :D
Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: septiembre_negro en 13 de Septiembre de 2009, 16:22:29
Hola e seguido este hilo con mucha atención me a servido de mucho,
Tengo el siguiente problema de la lectura de un rtc obtengo dos variables tipo byte hora y minutos para poder visualizar estos datos en un  display de 7seg y 4 dígitos requiero trasformar dichas variables en una tipo long e intentado lo que se expone en este hilo pero obtengo como resultado un numero que no tiene nada que ver con la información que intento mostrar en el display me explico
Mi variable hora=12
Mi variable minutos=55
Y requiero que la variable long sea =  1255
Como siempre agradezco la ayuda que me puedan brindar

Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: Suky en 13 de Septiembre de 2009, 17:05:40
Muéstranos el código así vemos que puede ser  :mrgreen:
Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: septiembre_negro en 13 de Septiembre de 2009, 17:58:34
Muéstranos el código así vemos que puede ser  :mrgreen:



Pues bien aquí esta el código  donde esta el inconveniente, esta sugestivamente rotulado  “aquí esta el problema”    :mrgreen: cabe señalar que es mi primer hijo así que no sean demasiado rudos   :oops: :oops:



 
Código: [Seleccionar]
 

 #include "C:\proyectos ccs\16f877meteoro.h"
 #include <math.h>
 #include <MAX7219.h>            
 #include "DS1624p.C"
 #include <tiempo.c>
 #define vs 5.1
 #define p_0 1013.3
 #define led_verde pin_b0
 
 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 //                                                                          ++                                                                    ++
 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++      
 
long medida;
int8 p_d;
float temp;

int8 promedio;
int8 x;
int8 q ;
int16 r;
float pro ;
float volts;
long muestras;



int16 vadc ;
float vout;
float loga ;
float defp ;
float m1 ;
float m2 ;
float h ;
float p ;
float hp ;
float c ;
float b ;

//********************************************************
  long hora;
  BYTE sec;
  BYTE min;
  BYTE hrs;
  BYTE day;
  BYTE month;
  BYTE yr;
  BYTE dow;


//&&&&&&&&&&&&&&&&&                         &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&




//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//                                                                          ++
//                                                                          ++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


void destripa()      
{                  
int8 digit[5];
int8 z ;


  digit[1]=medida%10;    
  digit[2]=(medida/10)%10;
  digit[3]=(medida/100)%10;
  if (p_d==1)
  {
  bit_set(digit[3],7);
  }
  else
  {
  bit_clear(digit[3],7);
  }
  
  digit[4]=(medida/1000)%10;
  for (z=1;z<=4;z++)    
  {
   write_LED(z,digit[z]);    
  
  }
   delay_ms(2000);
}



//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//                                                                           ++
//                                                                           ++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
void limpiar_display()
{
int8 x;
for (x=1;x<=4;x++)
{
write_LED(x,15);
delay_ms(1);

}
}


 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//                                                                           ++
//                                                                           ++
//                                                                           ++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 void transmitir_lecturas ()
 
 {
 
 printf("  \f\%02d/\%02d/\%02d\r\n",day,month,yr);
 printf("  \%02d:\%02d:\%02d", hrs,min,sec);
 printf("  mcp700 = %01.2f c \n\r ", pro);
 printf("  tp101= %lu mwatts \n\r ", r);
 printf("  precion = %01.2f kp \n\r ",p);
 printf("  altura = %01.2f mt_snm \n\r ", h);
 printf("  dec1624 = %1.2f C\n\r",temp);
 printf("  ***********************\n\r ",);

 }
 
 
 
 //***********************++++++++++++++++++++++++++++++++++++++++++++++++++++++
 //                                                                           ++
 //                     Aquí esta el problema                                 **                                                                  
 //                                                                           ++
 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 
 void imprimir_display ()
 
 
  //*******************                                  ******************
  hora = make16(min,hrs);// <<<<<<<---------------------------  (( * ))
  printf(" make= %lu \n\r ",hora );
 
  write_LED(5,0);    
  delay_ms(1000);
  p_d=1;
  medida= hora ;
  destripa();  
  limpiar_display();
 
 
  ////****************                          *********************************
  
  
  write_LED(5,1);    
  delay_ms(1000);
  p_d=1;
  medida=pro*100.0;
  destripa();  
  limpiar_display();
  
   //********************                     ********************************
  
  
  write_LED(5,2);    
  delay_ms(1000);
  p_d=0;
  medida=r;
  destripa();  
  limpiar_display();
  
  
  ///*********************                             ********************
  
  
  write_LED(5,3);    
  delay_ms(1000);
  p_d=1;
  medida=p*100;
  destripa();  
  limpiar_display();
  
  
  
  
  
   //**********************                           ******************
  
 
  write_LED(5,4);    
  delay_ms(1000);
  p_d=0;
  medida=h;
  destripa();  
  limpiar_display();
  
   //******************                       **************************
  
  write_LED(5,5);    
  delay_ms(1000);
  p_d=1;
  medida=temp*100;
  destripa();  
  limpiar_display();
  
  
  
 }
 


//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//                                                                            ++
//                                                                            ++
//                                                                            ++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


void main()
{

   setup_adc_ports(AN0_AN1_AN2_AN3_AN4);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   // TODO: USER CODE!!
   set_tris_a(0b11111111);
   set_tris_b(0b00000000);
   set_tris_c(0b10011111);
   # use fast_io(a)
   # use fast_io(b)
   # use fast_io(c)
  
   init_ds1624();
   display_init();              
                              
   output_high(L_SC);        
   output_low(L_SCK);          
                                
  
  limpiar_display();          
  
   ds1307_init();
  
  // Set date for -> 15 June 2005 Tuesday
  // Set time for -> 15:20:55
  ds1307_set_date_time(13,9,9,0,12,56,00);
  
 
  
 do
 {
 
 //**********************       ds1307   **************************************
  
    ds1307_get_date(day,month,yr,dow);
    ds1307_get_time(hrs,min,sec);
    
 
 //  ********                 mcp7000    **********************************
  
  set_adc_channel(0);
  delay_us(20);
  muestras=0;
  for (x=0;x<=20;x++)
  {
  q=read_adc();
  q=q >> 2;    /// resolucion 8bits
  muestras+=q;
  delay_ms(20);
  
  }
  promedio=muestras/20;
  volts=(promedio*.0195)-.400;
  Pro=volts /.0195 ;
  
  ///********************         luxometro     ********************* *********
  set_adc_channel(1);
  delay_us(20);
  r=read_adc();
  r=r >> 2 ;    // resilucion 8bits

  
  
  //************                altimetro              *************************
  
  
  ///***** get_vout***********
  set_adc_channel(2);
  delay_ms(20);
  vadc = read_adc();
  vout = vadc*5/1023;
  
  //*********                   get_precion           **************************
  c=.095*vs;
  b=.009*vs;
  p=(vout+c)/b;
  //********                    get_altura              ************************
  
  hp=p*10;
  defp=p_0/hp;
  loga=log(defp);
  m1=8430.153*loga;
  m2=(loga*.095)+1;
  h=m1/m2;
  
  
  //******************             leer ds1624          ***********************
  
      init_temp();
      temp =read_temp();
      
 //*************                   resultados               *  ************
      transmitir_lecturas ();
      imprimir_display ();
 
 }
 
while(1);    

}


Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: Suky en 13 de Septiembre de 2009, 18:11:59
Cuando postees código realizalo entre [code = c .][ /code . ] (Sin los puntos)  ;-)

Después 12 y 55 del ejemplo que mostraste están en decimal, por eso que al realizar el make y mostrarlo te da cualquier cosa, si cambias esto:
printf(" make= %lu \n\r ",hora );
a esto, seguro visualizará lo que tu quieres:
printf(" make= %x \n\r ",hora );


Saludos!
Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: micronet3 en 14 de Septiembre de 2009, 12:54:14
bueno si era eso primero tenia que ir la direccion y luego el dato

void write_16_eeprom(int16 dato, int8 direccion)
{
    write_eeprom(direccion, (int8) (dato & 0x00FF));   //parte baja
    write_eeprom(direccion+1, (int8) (dato>>8 & 0x00FF) ); //parte alta
   
}


ahora si funciona de maravillas, cada dia el c me parece mas hermoso que el dia anterior.
Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: septiembre_negro en 14 de Septiembre de 2009, 15:35:48
Cuando postees código realizalo entre [code = c .][ /code . ] (Sin los puntos)  ;-)

Después 12 y 55 del ejemplo que mostraste están en decimal, por eso que al realizar el make y mostrarlo te da cualquier cosa, si cambias esto:
printf(" make= %lu \n\r ",hora );
a esto, seguro visualizará lo que tu quieres:
printf(" make= %x \n\r ",hora );


Saludos!





Hola
no me explique  el problema no es enviar los datos con el pritf esa parte funciona ok ya que como atinada mente comentas hay que darle el formato adecuado.
El problema es este tengo dos variable tipo byte (hrs,min) las cuales requiero convertir en una variable tipo long para poderla mandar a mi procedimiento destripa.
Tengo esto
hrs=12
min=55
y requiero
esto
long=1255
0
 
long=5512

en realidad la pocion no me importa siempre y cuando cada byte se mantenga integro
e intentado con  make16(min,hrs) pero me devuelve un valor que no tiene nada que ver con  lo que quiero, incluso me devuelve 5 dígitos en ves de 4.
se me ocurre  que se podría pasar a caracteres cada variable, después pegarlas y por ultimo pasarla a long.
Pero no se como hacer esto
cualquier sugerencia se agradece 
Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: migsantiago en 14 de Septiembre de 2009, 15:42:37
Hola, no te devuelve el valor que esperas porque hace una conversión de hexadecimal a decimal...

Código: [Seleccionar]
12 = 0x0C
55 = 0x37

Al unirlos en un int16 queda:

Código: [Seleccionar]
0x0C37

Al imprimirlos como un int16 en decimal queda:

Código: [Seleccionar]
0x0C37 = 3127

Estás atacando el problema erróneamente. Explícanos que es lo que "destripa" hace exactamente y te podremos guiar en cómo armar tu dato. Seguramente lo que necesitas es pasarlo a BCD o algo por el estilo.

Edito:
Creo que esto es lo que necesitas:

Código: [Seleccionar]
int16 dato;
int8 hora, min;

dato = hora*100 + min;
Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: MLO__ en 14 de Septiembre de 2009, 16:07:23
Hola.

Si vas a usar BCD luego, conviene guardar el dato en hexadecimal directamente no?
Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: septiembre_negro en 14 de Septiembre de 2009, 16:35:20
Hola, no te devuelve el valor que esperas porque hace una conversión de hexadecimal a decimal...

Código: [Seleccionar]
12 = 0x0C
55 = 0x37

Al unirlos en un int16 queda:

Código: [Seleccionar]
0x0C37

Al imprimirlos como un int16 en decimal queda:

Código: [Seleccionar]
0x0C37 = 3127

Estás atacando el problema erróneamente. Explícanos que es lo que "destripa" hace exactamente y te podremos guiar en cómo armar tu dato. Seguramente lo que necesitas es pasarlo a BCD o algo por el estilo.

Edito:
Creo que esto es lo que necesitas:

Código: [Seleccionar]
int16 dato;
int8 hora, min;

dato = hora*100 + min;




Exacto esa es la solucion    :-/ :-/ :-/ como dices estaba atacando mal el problema
gracias. :) :)
el pro sedimentooo destripa lo que hace es que resive un valor long y lo separa en digitos
si le paso 1255 me devuelve
digito[1]=5
digito[2]=5
digito[3]=2
digito[1]=1
y así  ya puedo trabajar con el max7219 así

max7219(numero_display,digito)
Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: septiembre_negro en 14 de Septiembre de 2009, 16:44:50
Hola.

Si vas a usar BCD luego, conviene guardar el dato en hexadecimal directamente no?

Hola
en este caso no por que la librería del ds1307  ase la convercion de bcd a decimal  el asunto es  que la función make convierte los datos tengo que checar bien que es lo que hace.
Ademas de que yo estaba atacando mal el problema lo que quería hacer era pegar dos variables byte y el asunto era tan simple como hacer  dato=hora*100+min  :mrgreen:
Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: Cryn en 14 de Septiembre de 2009, 20:13:58
espero no llegar tan tarde y no repetir si es que ya lo dijeron, pero el CCS tiene una librería para manejar varios tipos de datos y almacenarlos en la eeprom interna, los use una vez en una memoria externa, cambiando las funciones de lectura y escritura, pero no la idea nada del algoritmo, la librería se llama internal_eeprom.c y esta dentro la carpeta Drivers

saludos!
Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: migsantiago en 14 de Septiembre de 2009, 20:49:57
Uff Cryn sí es cierto  :D

Yo la busqué en la ayuda de CCS pero no la encontré  :P
Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: micronet3 en 15 de Septiembre de 2009, 11:13:36
si que bien, gracias amigo cryn :-/
Título: Re: guardar en la eeprom un numero de 16 bits
Publicado por: Cryn en 15 de Septiembre de 2009, 11:39:52
que bueno que haya servido

ya saben fácilmente se puede cambiar para memorias externas i2c, funciona muy bien también, solo hay que tener bien las drecciones

saludos.
Título: Re:guardar en la eeprom un numero de 16 bits
Publicado por: alexmorales en 06 de Enero de 2018, 00:38:10
buen dia estoy viendo a barios amigos que estan colocando los parametros de la funcion write_eeprom (valor,dirección) y para mi concepto esta malo ya que la funcion es write_eeprom(dirección,valor) direccion es la posicion en la memoria y valor es el dato que se guardara ojo con eso
Título: Re:guardar en la eeprom un numero de 16 bits
Publicado por: KILLERJC en 06 de Enero de 2018, 00:46:10
buen dia estoy viendo a barios amigos que estan colocando los parametros de la funcion write_eeprom (valor,dirección) y para mi concepto esta malo ya que la funcion es write_eeprom(dirección,valor) direccion es la posicion en la memoria y valor es el dato que se guardara ojo con eso

Si fue un error por escribir el codigo sin mirar el manual o de memoria. En la 2da pagina se advierte el error y se modifica el contenido de alli en adelante.