Autor Tema: Convertir unsigned int a binario  (Leído 4173 veces)

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

Desconectado Crotoz

  • PIC10
  • *
  • Mensajes: 5
Convertir unsigned int a binario
« en: 19 de Marzo de 2019, 11:00:04 »
Hola! Soy nuevo en el foro. Estoy realizando un proyecto en donde debo almacenar 2000 muestras de un ADC correspondiente a un PIC 18F4550, y necesito almacenarlo en una memoria EEPROM de 32Kbyte, es decir de 256Kbit. estuve probando de almacenar la información por medio de caracteres pero no es lo mas optimo, dado que si un carácter son 8 bits=1byte, necesito almacenar 16bit, ocupo 16 byte de información a eso multiplicado por las 2000 muestras, me ocupa un espacio total de 32Kbyte. Me gustaría poder almacenar esa información en bits, es decir 16 bit de información, me ocupan 2 byte, es decir que por las 2000 muestras ocupo solamente 4Kbyte de memoria. Soy nuevo en programación en C y no logro con dar la solución de convertir un entero a binario de 16 bit.

Desconectado Robert76

  • PIC24F
  • *****
  • Mensajes: 577
Re:Convertir unsigned int a binario
« Respuesta #1 en: 19 de Marzo de 2019, 11:14:03 »
Hola, veamos lo sig.
Una variable tipo INT tiene un formato de 8bits.
El ADC arroja un valor de 16bits? o sea una variable tipo LONG.
Entonces para almacenar una variable de 16 bits, en una memoria de 8 bits.
Tienes que partir la variable en dos. Es decir, los primeros 8 bits menos significativos por un lado y por el otro los 8bits de mayor peso.
Puedes usar algo así

int val_l, val_h;
long val;


val=read_adc(); <--- Adquisición de dato de 16bits a variable val.

val_l=val;           <--- Almacena los 8 bits de menor peso en val_l

val_h=(val>>8 ); <--- Almacena los 8bits de mayor peso, pero antes desplazando 8 lugares hacia el menor peso.

« Última modificación: 19 de Marzo de 2019, 11:17:15 por Robert76 »

Desconectado Crotoz

  • PIC10
  • *
  • Mensajes: 5
Re:Convertir unsigned int a binario
« Respuesta #2 en: 19 de Marzo de 2019, 11:44:34 »
a
« Última modificación: 19 de Marzo de 2019, 11:51:31 por Crotoz »

Desconectado Crotoz

  • PIC10
  • *
  • Mensajes: 5
Re:Convertir unsigned int a binario
« Respuesta #3 en: 19 de Marzo de 2019, 11:49:31 »
Gracias por responder,
hasta donde tengo entendido un unsigned int es una variable de 16 bits, no estoy seguro.
el ADC arroja 10 bit pero dado que la memoria graba de a 8 bit uso 16 bit de información, donde 6 bit son redundantes que van a ser siempre 0.

asi me quedo el programa:

unsigned int val_l, val_h;      //16bits?
unsigned int address = 0;
       
val= ReadADC();
add_l = address;
add_h = address>>8;

while (freq_init<=freq_end){
    val_l = val;
    val_h =val>>8;
    ByteWriteI2C(0xA0,add_h,add_l,val_l);
    +address;
    add_l = address;
    add_h = ( address>>8 );
    ByteWriteI2C(0xA0,add_h,add_l,val_h);
    +address;
}
       
void ByteWriteI2C( unsigned char ByteControl, unsigned char HighDireccion,
               unsigned char LowDireccion, unsigned char DataI2C ){

   IdleI2C();                                           //El modulo esta activo
   StartI2C();                                   //Condicion de START
   while ( SSPCON2bits.SEN );   
   WriteI2C ( ByteControl );                   //Envia Byte de control
   WriteI2C ( HighDireccion );
   WriteI2C ( LowDireccion );
   WriteI2C ( DataI2C );                     //Guarda Data en Eeprom en la direccion establecida
   StopI2C();   //Condicion de Stop
   while ( SSPCON2bits.PEN );
   while ( EEAckPolling(ByteControl));   //Espera a que se complete escritura
}

Pretendo hacerlo de esta forma (asignar la posicion de memoria) y no por escritura por pagina, por el mero hecho de que cada pagina tiene 64byte y luego el contador de la memoria se resetea y puede haber problemas de sobreescritura.

Desconectado Robert76

  • PIC24F
  • *****
  • Mensajes: 577
Re:Convertir unsigned int a binario
« Respuesta #4 en: 19 de Marzo de 2019, 12:03:04 »
Me quedé con la duda sobre el formato de variable int.

Según el compilador que uso que es el CCS, una variable tipo int o unsigned int, la reconoce cómo int8.
Para que tenga formato de 16bits, hay que declararla cómo  unsigned int16 o signed int16.
« Última modificación: 19 de Marzo de 2019, 12:06:06 por Robert76 »

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Convertir unsigned int a binario
« Respuesta #5 en: 19 de Marzo de 2019, 16:55:41 »
Va en función de la arquitectura del pic. Al menos en XC.

 Si el micro es de 16 bits, una variable int es de 16 bits.
 Si es un Pic32, un int es de 32 bits.

 Como CCS creo que no llega a los DSPIC pues los int serán de 8 bits, ya sean con o sin signo.

 Saludos.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Convertir unsigned int a binario
« Respuesta #6 en: 19 de Marzo de 2019, 21:56:57 »
Bueno, vengo a corregir un par de cositas y a organizar un poco el post :P.

Separemos los temas:

Citar
Soy nuevo en programación en C y no logro con dar la solución de convertir un entero a binario de 16 bit.

Todo numero SI o SI se guarda en binario, por mas que pongas float, no significa que vas a tener 1 byte por cada digito, internamente es con binarios. Como bien decis necesitas 2 bytes por cada dato.

Respecto a como enviarlos

Como bien te dicen, primero envias el primer byte. Y luego envias el segundo, sea rotandolo o usando punteros, pero este ultimo mejor dejarlo para cuando tengas mas confianza con C.

Respecto al tamaño de las varaibles int

Mas que de la arquitectura como ocurre en las arquitecturas x86, aca dependen del compilador usado.

int de CCS ( compilador 8 bits ) = 8 bits
int de XC8 = 16 bits
int de XC16 = 16 bits
int de XC32 = 32 bits

Es por eso que siempre discutí y recomiendo el uso de stdint.h sea el compilador que sea.. Ya que al poner uint16_t se que va a tener 16 bits.

Fuente ( buscar por Data types ):
MPLAB® XC8 C Compiler User’s Guide
MPLAB® XC16 C Compiler User’s Guide
MPLAB® XC32 C/C++ Compiler User’s Guide
Manual de CCS ( de 8 bits )