Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

25/02/2009 #1


Sintaxis en ensamblador o en c para separar un byte
hola que tal, alguien conoce alguna instruccion en lenguaje ensamblador o en c para separar un byte por su parte alta y baja ejemplo:
variable=0x1f;

y debe separar el byte como parte alta=1 y parte baja=f.

he estado intentando en el microc pero la instruccion lo(variable) y hi(variable) no me funciona....

alguien conoce alguna otra en c o ensamblador que me ayude?
gracias..
25/02/2009 #2

Avatar de Dr. Zoidberg

Re: Sintaxis en ensamblador o en c para separar un byte
transistor007 dijo:
hola que tal, alguien conoce alguna instruccion en lenguaje ensamblador o en c para separar un byte por su parte alta y baja ejemplo:
variable=0x1f;

y debe separar el byte como parte alta=1 y parte baja=f.

he estado intentando en el microc pero la instruccion lo(variable) y hi(variable) no me funciona....

alguien conoce alguna otra en c o ensamblador que me ayude?
gracias..
Es fácil hacer eso:

Código:
unsigned char variable, alta, baja;

byteCompleto = 0x1F;

alta = (variable & 0xF0) >> 4;
baja = variable & 0x0F;

/* Listo...alta y baja contienen en el nibble menos significativo la parte alta (0x01) y la baja (0x0F) del byte a partir*/
Saludos!
25/02/2009 #3


excelente funcionó ezavalla!

gracias hoy aprendí algo nuevo..
25/02/2009 #4

Avatar de Dr. Zoidberg

transistor007 dijo:
excelente funcionó ezavalla!

gracias hoy aprendí algo nuevo..
vas a tener que estudiar los operadores de bits en el C...es la forma mas facil de hacerlo y siempre anda.

Saludos!
25/02/2009 #5

Avatar de sangreaztk

Si solo quiere la parte alta o baja de un dato, en ensamblador puedes aplicarle al dato una operación lógica 'and' con 0x0F (para nibble bajo) y 0xF0 (para nibble alto).

Buena Vibra!
03/03/2009 #6


Re: Sintaxis en ensamblador o en c para separar un byte
Es fácil hacer eso:

Código:
unsigned char variable, alta, baja;

byteCompleto = 0x1F;

alta = (variable & 0xF0) >> 4;
baja = variable & 0x0F;

/* Listo...alta y baja contienen en el nibble menos significativo la parte alta (0x01) y la baja (0x0F) del byte a partir*/
Saludos![/quote]

Htal tengo algunos con este codigo que me paso el buen ezavalla!, primero: el numero que deseo convertir es decimal, de tal manera que cuando convierto un 17decimal, como parte alta me entrega un 0x01 y en la parte baja un 0x01 que si juntamos ambos son hexadecimales! y me gustaria que fueran decimales, pues posteriormente debo accesar a un calculo de una tabla...

alguien me puede ayudar o dar un idea?

gracias
03/03/2009 #7
Moderador

Avatar de Chico3001

Recuerda que en la computadora no existen numeros decimales, todo lo maneja en hexadecimal, como el equivalente decimal de 17d es 11h entonces la computadora lo esta haciendo bien

Lo que tendrias que hacer es una conversion Hexadecimal a BCD y despues aplicar el codigo de arriba, pero toma en cuenta que una vez que lo hagas tu numero ya no sera tan facil de procesar por la computadora, por lo que tendrias que aplicar algoritmos especiales para poder hacer calculos con un numero BCD

Para poderte resolver bien la duda necesitariamos que nos dijeras exactamente bien que quieres hacer con ese numero, y asi podriamos generar un codigo que te ayude....
03/03/2009 #8


oho perfecto gracias buen chico3001, te comento lo siguiente:

tomo un valor del adc de temperatura, mi adc es de 10 bits para lo cual ya realice una tabla de equivalencias ejemplo un valor de 65 en el adc equivale a 32°c. el valor de 65 lo estoy tomando como un numero decimal el cual lo fracciono en 2 partes: parte alta y parte baja. para que? pues para desplegarlo en un 7segmentos que tambien ya tengoi una tablita que funciona perfectamente y despliega los numeros que mando a desplegar...
el problema que ahorita enfrento es cuando separo la parte alta y la baja ya no me corresponde al numero que quiero recojer de mi tabla para desplegarlo en 7 segmentos!

saludos y gracias por tu ayuda espero me puedas brindar alguna idea!
03/03/2009 #9
Moderador

Avatar de Chico3001

aaaah.. si es como te dije.. primero tienes que convertir el numero a BCD y despues usar la tabla... puedes usar esta rutina para convertir el valor de un numero entero con signo

Código:
signed char		a, b, c, d;				// Variables de conversion BCD
signed int		n;					//
// ---------------------------------------------------------------------
//	b2bcd.- Convierte un numero de 16 bits con signo
//		de binario a BCD
// ---------------------------------------------------------------------
void b2bcd(signed int dato){

n=dato;
if (n < 0) {
	n = -n;
}

for ( a = -1; n >= 0; n -= 10000 ) ++a;
for ( b = 10; n <  0; n += 1000  ) --b;
for ( c = -1; n >= 0; n -= 100   ) ++c;
for ( d = 10; n <  0; n += 10    ) --d;
}
O esta es para un solo byte no mayor a 99:

Código:
int l_digit, h_digit;     // resultado de la conversion bin2bcd
 

void bin2bcd(int valor){  // Funcion que convierte de Binario a BCD

  h_digit=0;

  if (valor>=10){
    do{
      valor-=10;
      h_digit++;
    }while (valor>=10);
  }
  l_digit=valor;
}
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.