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

Temas similares

18/11/2008 #1


Valor absoluto de un numero en pic
Buenas,

tengo una duda, hay alguna instruccion para pasar un numero a absoluto, es decir, que siempre sea positivo?
Muchas gracias!
18/11/2008 #2

Avatar de Moyano Jonathan

si en c de ccs usando la librería math..h

si tu variable es x: para sacar el valor absoluto es f= abs(x)
18/11/2008 #3


¿Para qué familia de pic estás hablando y en que lenguaje?

Los pic de gama media y baja, no manejan negativos y flotante. Para saber si una resta es negativa, te tiene que fijar en el bit C del registro Status. Pero al fin y al cabo, el resultado es un valor absoluto.
19/11/2008 #4

Avatar de Ardogan

Los tipos con signo tiene el bit de signo en el MSB (bit más significativo).
Poniendo a 0 ese bit ya tenes el valor absoluto.
Ojo!, dije tipos con signo, si a un unsigned char (tipo sin signo) le cambiás el MSB vas a cambiar el valor y no el signo = problemas.
19/11/2008 #5


Ardogan tiene razón. Si manejas números negativos en el pic y programas en ensamblador en un número negativo el MSB siempre será igual a 1. Para obtener el valor absoluto simplemente revisas este bit y si es igual a 1 sacas su complemento a 2. Con eso tendrás el mismo número pero positivo.

Recordemos que el complemento a 2 se realiza complementando el valor de un número y después sumandole 1. En ensamblador esto se hace asi:
Código:
   comf    NUMERO,f
   incf    NUMERO,f
Donde NUMERO tiene el valor que deseamos pasar a positivo.
19/11/2008 #6

Avatar de Ardogan

Cierto Pic-man... menos mal que aclaraste lo del complemento a 2. Si es un número complemento a 2 y uno solo le pone a 0 el bit de signo sonamos, no es el valor absoluto, hay que hacer el complemento a 2 como decís.
Si se trata de un float creo que con el bit de signo solamente alcanza no?
20/11/2008 #7


Hm, pero se me ocurre que en pics de gama baja igual se puede hacer, pero se complica si trabajas con números más grandes que 255. Y en general es complicado. Te explico lo que me imagino yo:

Si haces por ejemplo, 10 - 20, el resultado será 245, pero esto no es cierto, verdad? Entonces:
Una vez hecha la resta, revisas el Bit C del Status para ver si el resultado se hizo negativo. Para llegar al resultado correcto debes tomar el resultado que acabas de encontrar (245), y haces "255 - 245" = 10, pero por haber revisado el bit C del Status y haber visto que está en 1, ya sabrás que ese 10 es negativo.
... pero no te interesa que sea negativo, nisiquiera revises el C del Status. Entonces el 10 que acabas de obtener... es simplemente el resultado en valor absoluto.

Resumen:
Paso 1:
10 - 20 = 245

Paso 2:
255 - resultado anterior (245) = 10, siempre positivo!

Se entiende lo que dije?
Es una idea nomás...

Saludos!
21/11/2008 #8


El modo de hacer una resta en assembler es:

restas los dos valores, revisas el bit C del STATUS, si este es 0 realizas el complemento y luego le sumas 1, por el contrario, si el bit C es 1, el resultado es positivo y no hay que hacer nada.

Les adjunto una rutina que cree para restar 2 números de 8 bit. Luego subo una rutina para restar 2 números de 32 bit en pic de 8 bit.
Archivos Adjuntos
Tipo de Archivo: lib resta_8_bits_751.lib (1,6 KB (Kilobytes), 63 visitas)
21/11/2008 #9


muchas gracias a todos!
13/08/2009 #10


esa restas de 10-20=245
no esta bien el resultado

en realidad es 456 y no da
13/08/2009 #11


jaja 246

asi que abria que restarle 256 mmm.. pero en assembler es complicado jaja
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.