write_16_eeprom(int16 dato, int8 direccion)
{
write_eeprom((int8)dato, direccion); //Guarda byte bajo
write_eeprom(*(&dato+1), direccion+1); //Guarda byte alto
}
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
}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!!!
Function:
Extracts the byte at offset from var. Same as: i8 = (((var >> (offset*8)) & 0xff) except it is done with a single byte move.
i16 = MAKE16(varhigh, varlow)
estaba intentando guardar un numero de 16 bits en la memoria eeprom pero sin resultados, a ver si ustedes encuentran el error
Aparte en write_eeprom el primer parámetro es la dirección y el segundo el dato a grabar!
Muéstranos el código así vemos que puede ser :mrgreen:
#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);
}
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!
12 = 0x0C
55 = 0x37
0x0C37
0x0C37 = 3127
int16 dato;
int8 hora, min;
dato = hora*100 + min;
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;
Hola.
Si vas a usar BCD luego, conviene guardar el dato en hexadecimal directamente no?
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