Autor Tema: CCS: ¿Como tomar cada byte que compone un word?  (Leído 6034 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
CCS: ¿Como tomar cada byte que compone un word?
« en: 05 de Diciembre de 2009, 17:43:31 »
Hola!
El problema que tengo es bien simple: tengo una variable de 16bits, y quiero trabajar con los dos bytes que la componen por separado.  Supongamos que la variable tipo Word es C y que A y B son dos variables tipo int8:

¿De que manera puedo hacer que A contenga el byte alto y B el byte bajo de C?  

Debe ser la pavada más grande del mundo, pero no me acuerdo de haberlo usado nunca  :lol:
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: CCS: ¿Como tomar cada byte que compone un word?
« Respuesta #1 en: 05 de Diciembre de 2009, 18:04:06 »
Que tal aitopes!
Bueno una forma seria usar desplazamiento de los bytes pa leer el byte bajo y luego el alto y creo que con Sprintf se puede tambien pero no recuerdo!  :?

Saludos
« Última modificación: 05 de Diciembre de 2009, 18:06:40 por RALF2 »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: CCS: ¿Como tomar cada byte que compone un word?
« Respuesta #2 en: 05 de Diciembre de 2009, 18:11:12 »
Esto en Ansi C
A = C>>8;
B = C & 0xFF;

Y en CCS también sirve esto:
A = make8(C,1);
B = make8(C,0);

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: CCS: ¿Como tomar cada byte que compone un word?
« Respuesta #3 en: 05 de Diciembre de 2009, 18:11:41 »
Hola Ariel

Aquí la función que buscas.

Código: [Seleccionar]
make8( )

--------------------------------------------------------------------------------

 

Syntax:
 i8 = MAKE8(var, offset)

 
 
Parameters:
 var is a 16 or 32 bit integer.

offset is a byte offset of 0,1,2 or 3.
 
Returns:
 An 8 bit integer
 
Function:
 Extracts the byte at offset from var. Same as: i8 = (((var >> (offset*8)) & 0xff) except it is done with a single byte move.
 
Availability:
 All devices
 
Requires:
 Nothing

 Examples:
 int32 x;

int y;

y = make8(x,3);  // Gets MSB of x

Example Files:
 None

Also See:
 make16(), make32()

jaja me ganó Manolo por segundos

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: CCS: ¿Como tomar cada byte que compone un word?
« Respuesta #4 en: 05 de Diciembre de 2009, 18:12:40 »
:)

Te has enfrentado en duelo al dedo más rápido del condado  :D

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: CCS: ¿Como tomar cada byte que compone un word?
« Respuesta #5 en: 05 de Diciembre de 2009, 18:14:25 »
:)

Gracias!
Al final, lo he hecho como dice Santiago.

Ya puestos a preguntar....si quiero los 4 bits mas altos o mas bajos de un Byte no me queda otra que trabajar "a pedal", no hay una funcion como esta para eso, no?  :lol:
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: CCS: ¿Como tomar cada byte que compone un word?
« Respuesta #6 en: 05 de Diciembre de 2009, 18:18:25 »
:)

Te has enfrentado en duelo al dedo más rápido del condado  :D

jajaja es que estoy usando el tocuhpad de la aspire one y me cuesta trabajo mover el mouse  :D

Ya puestos a preguntar....si quiero los 4 bits mas altos o mas bajos de un Byte no me queda otra que trabajar "a pedal", no hay una funcion como esta para eso, no?  :lol:

Mi no entender...  :z)

Hay otra forma de obtener los bytes sin tener que rotarlos o sin usar make8 y sería usando casting de apuntadores, por ejemplo si quisieras obtener los 3 bytes altos de un int32 depositándolos en otro int32.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: CCS: ¿Como tomar cada byte que compone un word?
« Respuesta #7 en: 05 de Diciembre de 2009, 18:23:21 »
Utilizando los operadores de máscara y desplazamiento, como en el primer ejemplo que he puesto, puedes obtener también el nibble alto o el bajo de un byte:

nibble_alto = C >> 4;
nibble_bajo = C & 0xF;


Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: CCS: ¿Como tomar cada byte que compone un word?
« Respuesta #8 en: 05 de Diciembre de 2009, 18:26:39 »
Que va yo llegue primero   :D
Interesante ese make8 no lo conocia, gracias por la informacion!  :mrgreen:

Saludos

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: CCS: ¿Como tomar cada byte que compone un word?
« Respuesta #9 en: 05 de Diciembre de 2009, 18:30:49 »
Utilizando los operadores de máscara y desplazamiento, como en el primer ejemplo que he puesto, puedes obtener también el nibble alto o el bajo de un byte:

nibble_alto = C >> 4;
nibble_bajo = C & 0xF;



La neurona no termina de arrancarme hoy... :)

Quiero hacer que (por ejemplo) los 4 bits más bajos del puerto A tengan la mitad mas alta de una variable int8 ....

¿como hago para lograrlo sin "toquetear" los otros bits?

(Hoy viene pesada la tarde...ja ja ja)
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: CCS: ¿Como tomar cada byte que compone un word?
« Respuesta #10 en: 05 de Diciembre de 2009, 18:54:10 »
Al principio del programa defines esto:
#byte PORTA xxx // en las xxx pones la dirección de memoria del puerto A

Y luego haces lo siguiente, asumiendo que tu variable se llama V
PORTA = (PORTA & 0xF0) | (V >> 4);

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: CCS: ¿Como tomar cada byte que compone un word?
« Respuesta #11 en: 05 de Diciembre de 2009, 18:59:36 »
Joder!
Buenisimo!

Te voy a decir como lo hacia solo para que te rias un rato... ;)

   output_bit (PIN_C7 ,bit_test(byte_bajo, 7));
   output_bit (PIN_C6 ,bit_test(byte_bajo, 6));
   output_bit (PIN_C5 ,bit_test(byte_bajo, 5));
   output_bit (PIN_C4 ,bit_test(byte_bajo, 4));
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: CCS: ¿Como tomar cada byte que compone un word?
« Respuesta #12 en: 05 de Diciembre de 2009, 19:05:15 »
Que mas aitopes!
Bajate el ejemplo


Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: CCS: ¿Como tomar cada byte que compone un word?
« Respuesta #13 en: 05 de Diciembre de 2009, 19:07:09 »
Joder!
Buenisimo!

Te voy a decir como lo hacia solo para que te rias un rato... ;)

   output_bit (PIN_C7 ,bit_test(byte_bajo, 7));
   output_bit (PIN_C6 ,bit_test(byte_bajo, 6));
   output_bit (PIN_C5 ,bit_test(byte_bajo, 5));
   output_bit (PIN_C4 ,bit_test(byte_bajo, 4));


No es para reírse, hombre, es la forma más lógica de hacerlo si no tienes dominado los operadores de máscara.
De todas formas, habría que compilar las dos opciones para ver cuál ocupa menos.

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: CCS: ¿Como tomar cada byte que compone un word?
« Respuesta #14 en: 05 de Diciembre de 2009, 19:11:14 »
Joder!
Buenisimo!

Te voy a decir como lo hacia solo para que te rias un rato... ;)

   output_bit (PIN_C7 ,bit_test(byte_bajo, 7));
   output_bit (PIN_C6 ,bit_test(byte_bajo, 6));
   output_bit (PIN_C5 ,bit_test(byte_bajo, 5));
   output_bit (PIN_C4 ,bit_test(byte_bajo, 4));


No es para reírse, hombre, es la forma más lógica de hacerlo si no tienes dominado los operadores de máscara.
De todas formas, habría que compilar las dos opciones para ver cuál ocupa menos.

O cual es más rápido...en mi caso me va a interesar la velocidad. Pero por ahora no importa. Cuando el proyectin esté mas avanzado, quizas esta partecita pueda hacerse en ASM y a otra cosa.

Pero por el momento me sirve de mucho la ayuda que me han dado. Me bajo el ejemplo de RALF2 y tomo nota del método de la máscara ;)

Gracias!
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert


 

anything