Autor Tema: guardar en la eeprom un numero de 16 bits  (Leído 15340 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: guardar en la eeprom un numero de 16 bits
« Respuesta #15 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.


Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: guardar en la eeprom un numero de 16 bits
« Respuesta #16 en: 12 de Septiembre de 2009, 18:28:59 »
podria ser asi

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


Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: guardar en la eeprom un numero de 16 bits
« Respuesta #17 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!!

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

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: guardar en la eeprom un numero de 16 bits
« Respuesta #18 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'



Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: guardar en la eeprom un numero de 16 bits
« Respuesta #19 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.



Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: guardar en la eeprom un numero de 16 bits
« Respuesta #20 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);
}


Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: guardar en la eeprom un numero de 16 bits
« Respuesta #21 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]

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: guardar en la eeprom un numero de 16 bits
« Respuesta #22 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.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: guardar en la eeprom un numero de 16 bits
« Respuesta #23 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!
No contesto mensajes privados, las consultas en el foro

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: guardar en la eeprom un numero de 16 bits
« Respuesta #24 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

Desconectado septiembre_negro

  • PIC18
  • ****
  • Mensajes: 310
Re: guardar en la eeprom un numero de 16 bits
« Respuesta #25 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


Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: guardar en la eeprom un numero de 16 bits
« Respuesta #26 en: 13 de Septiembre de 2009, 17:05:40 »
Muéstranos el código así vemos que puede ser  :mrgreen:
No contesto mensajes privados, las consultas en el foro

Desconectado septiembre_negro

  • PIC18
  • ****
  • Mensajes: 310
Re: guardar en la eeprom un numero de 16 bits
« Respuesta #27 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);    

}


« Última modificación: 13 de Septiembre de 2009, 20:43:05 por septiembre_negro »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: guardar en la eeprom un numero de 16 bits
« Respuesta #28 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!
No contesto mensajes privados, las consultas en el foro

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: guardar en la eeprom un numero de 16 bits
« Respuesta #29 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.