TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Diego E. en 16 de Mayo de 2009, 11:32:12

Título: pasar 8bit a 16 bit
Publicado por: Diego E. en 16 de Mayo de 2009, 11:32:12
Hola grupo, tengo dos variables de 8 bit, hay forma de pasar los valores de estas 2 variables, una a la parte baja y otra a la parte alta de una variable de 16 bit ?, pues he tratado de utilizar la función swap pero veo que solo funciona en 8 bit

gracias.
Título: Re: pasar 8bit a 16 bit
Publicado por: QIQE en 16 de Mayo de 2009, 11:35:24
Primero iguala la variable de 16 a la de 8 y haz un desplazamiento de ocho bits con la función << y después simplemente utiliza swap como dices o una or
Título: Re: pasar 8bit a 16 bit
Publicado por: cerebro en 16 de Mayo de 2009, 11:44:10
si utilizas CCS usa la función 

i16 = MAKE16(varhigh, varlow)

ejemplo

Código: [Seleccionar]
long x;

int hi,lo;

x = make16(hi,lo); 
Título: Re: pasar 8bit a 16 bit
Publicado por: gera en 16 de Mayo de 2009, 11:47:07
Jaja, yo lo hubiera hecho con mascaras y rotacion de bits. Las cosas q uno se entera de CCS cada dia :P Estaba pensando en pasarme a c18, pero la verdad q va a costar jeje.
saludos!
Título: Re: pasar 8bit a 16 bit
Publicado por: cerebro en 16 de Mayo de 2009, 12:04:36
Jaja, yo lo hubiera hecho con mascaras y rotacion de bits. Las cosas q uno se entera de CCS cada dia :P Estaba pensando en pasarme a c18, pero la verdad q va a costar jeje.
saludos!

 :shock:  yo estaba meditando justo sobre eso en estos días, como una introducción al c30 dentro de "algúnnn" tiempo...
Título: Re: pasar 8bit a 16 bit
Publicado por: migsantiago en 16 de Mayo de 2009, 12:05:10
Estuve probando otros métodos para armarla pero MAKE16 es la más rápida y compacta que se puede usar.

Código: [Seleccionar]
.................... //MAKE16
.................... var16=MAKE16(varhigh,varlow);
0024:  MOVF   23,W
0025:  MOVWF  21
0026:  MOVF   22,W
0027:  MOVWF  20
Título: Re: pasar 8bit a 16 bit
Publicado por: Diego E. en 16 de Mayo de 2009, 13:31:56
Mil gracias a todos por estos aportes tan oportunos,
efectivamente con la función make16 logré obtener lo que necesitaba.
Título: Re: pasar 8bit a 16 bit
Publicado por: gera en 16 de Mayo de 2009, 14:29:30
Jaja, yo lo hubiera hecho con mascaras y rotacion de bits. Las cosas q uno se entera de CCS cada dia :P Estaba pensando en pasarme a c18, pero la verdad q va a costar jeje.
saludos!

 :shock:  yo estaba meditando justo sobre eso en estos días, como una introducción al c30 dentro de "algúnnn" tiempo...

Lo que pasa es q fui al seminario de microchip la semana pasada, y todos los ejemplos q dieron de USB y ethernet estaban hechos en c18. Y a simple vista se ve mucho mas facil trabajar dichos stacks en c18 q en CSS. Y no esta de mas aprender a usar otro compilaodr :wink:
saludos!
Título: Re: pasar 8bit a 16 bit
Publicado por: RICHI777 en 16 de Mayo de 2009, 15:20:20
Hola, si el compilador no tiene esta función se puede construir una macro.

Código: C
  1. /* Make an word with High byte and Low byte */
  2. #define MAKEWORD( High, Low )                                     \
  3.            (( word ) (((( word )( High )) << 8 ) +                \
  4.             (( word )( Low ))))                                   \

Saludos !
Título: Re: pasar 8bit a 16 bit
Publicado por: ASTROCAR en 16 de Mayo de 2009, 22:28:15
Hola buenas tardes y que funcion habra para separarla ahora en caso contrario a variables de  8 bit en proton es super sencillo voy a revisar la ayuda de ccs para ver que ofrece.

Saludos y esta super bien el dato de como unir variables de 8bit a una variable de 16bit.
Atten.
Alexander Santana.
Venezuela-Barcelona.
Título: Re: pasar 8bit a 16 bit
Publicado por: Suky en 16 de Mayo de 2009, 23:56:54
Código: C
  1. int Data_High, Data_Low;
  2. long Datalong;
  3.  
  4. Data_High=make8(Datalong,1);
  5. Data_Low=make8(Datalong,0);
Título: Re: pasar 8bit a 16 bit
Publicado por: micro_pepe en 22 de Marzo de 2012, 20:10:55
He echo lo siguiente segun se indica en este hilo:

Código: [Seleccionar]
Frecuencia = aux_frec[2];
Frecuencia = Frecuencia << 8;
Frecuencia = Frecuencia | aux_frec[1];
Frecuencia = Frecuencia << 8;
Frecuencia = Frecuencia | aux_frec[0];

Funciona, pero estoy usando Hi-Tech, y me gustaría saber si existe alguna función como la "MAKE16(varhigh, varlow)" de CCS, pero para H-Tech, y 32 bit.

Un abrazo.
Título: Re: pasar 8bit a 16 bit
Publicado por: MerLiNz en 22 de Marzo de 2012, 22:41:14
union {
char BYTE[2];
int DBYTE;
}tal;

tal.BYTE[0]=; contiene 8bits
tal.BYTE[1]=; 8bits
tal.DBYTE contiene los 16bits de byte[0] y [1].

es muchisimo mas sencillo, muchisimo mas optimizado ya que no se usa desplazamientos de bits ninguno (funciones adicionales), el compilador lo traduce a asm moviendo unicamente los bytes en la memoria.

para 32bits por 8bits seria BYTE[4] y en vez de int seria long, antes de nada mirar si es cierto que en el hitech los longs son de 32bits y los chars de 8bits, lo digo porque a veces cambia y yo estoy acostumbrado a C18, C30, C32
Título: Re: pasar 8bit a 16 bit
Publicado por: micro_pepe en 23 de Marzo de 2012, 11:38:32
OK, de esa forma me he ahorrado un 4% de memoria  :-/ :-/

Un abrazo.
Título: Re: pasar 8bit a 16 bit
Publicado por: Simon21 en 30 de Mayo de 2012, 19:05:19
Buenas, interesante lo que hacen con el make16.
Ahora tengo una consulta, si quisiera unir 3 variables de 8 bits
para formar una de 24 bits ??

por ejemplo:

int8 a, b, c;

int32 variable=0;

// variable= (a, b, c); Quiero formar la "variable" uniendo a, b, c y d  :lol:

Que sucede con los bits que sobran ?? me refiero a que si uso 24 van a sobrar 8, por ello
lo que hice fue iniciarla a cero, para asegurarme que los que quedan libres sean efectivamente
cero.

Saludos a todos :) :)
Título: Re: pasar 8bit a 16 bit
Publicado por: MerLiNz en 30 de Mayo de 2012, 19:14:03
los que sobran se quedarian en 0.

Para hacerlo de forma mas sencilla podrias usar una union

union {
int8 BYTE[4];
int32 variable
}var;

ahora si pones var.BYTE[0]=a; var.BYTE[1]=b; ... en "var.variable" tendras los 3 bytes (24bits), en caso de querer usar 4 bytes pues usas el BYTE[3]
Título: Re: pasar 8bit a 16 bit
Publicado por: Simon21 en 07 de Junio de 2012, 22:57:02
jaja nadie me dijo que tambien existia el make32...
Extracto de la ayuda de CCS


Syntax:
 i32 = MAKE32(var1, var2, var3, var4)

Parameters:
 var1-4 are a 8 or 16 bit integers.  var2-4 are optional.

Returns:
 A 32 bit integer
 
Function:
 Makes a 32 bit number out of any combination of 8 and 16 bit numbers. Note that the number of parameters may be 1 to 4. The msb is first. If the total bits provided is less than 32 then zeros are added at the msb.

Availability:
 All devices
 
Requires:
 Nothing
 
Examples:
 int32 x;

int y;

long z;

x = make32(1,2,3,4);  // x is 0x01020304

y=0x12;

z=0x4321;

x = make32(y,z);  // x is 0x00124321   

x = make32(y,y,z);  // x is 0x12124321   

  :-/          :-/            :-/                  :-/                 :-/           :-/
Título: Re: pasar 8bit a 16 bit
Publicado por: RICHI777 en 08 de Junio de 2012, 00:21:08
Hola, estas funciones deben ser macros y no funciones, nose si el CSS las reemplazas por inline.

Saludos !
Título: Re: pasar 8bit a 16 bit
Publicado por: Simon21 en 08 de Junio de 2012, 00:45:03
No entendi.  :?
Título: Re: pasar 8bit a 16 bit
Publicado por: bigluis en 08 de Junio de 2012, 01:47:17
Así es, estas funciones son macros.
Título: Re: pasar 8bit a 16 bit
Publicado por: Simon21 en 08 de Junio de 2012, 16:26:17
No se bien a que se refieren con esto, pero anda espectacular la funcion en el CCS ;)
Título: Re: pasar 8bit a 16 bit
Publicado por: RICHI777 en 08 de Junio de 2012, 18:30:34
Hola, me refería a que es si es una función el compilador tiene que generar código para pushear los parámetros en stack y el código necesario para la llamada a la función. Si es una macro o una función inline el compilador reemplaza directamente el código de la función en donde es invocada, reduciendo tamaño de código y tiempo de ejecución.

Saludos !
Título: Re: pasar 8bit a 16 bit
Publicado por: Palomino86 en 09 de Junio de 2012, 12:40:35
Algun hilo o web que me recomienden para saber desde cero acerca de los macros...

Saludos  :)
Título: Re: pasar 8bit a 16 bit
Publicado por: Suky en 09 de Junio de 2012, 15:04:45
http://es.wikipedia.org/wiki/Preprocesador_de_C