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

Temas similares

11/07/2012 #1


¿Se puede manejar números reales con MCU de 8bits?
Tengo que realizar operaciones matemáticas que dan como resultado números reales y luego presentarlos en un display.
Ejemplo: 125/256 = 0.4882
Si solo uso números enteros, el resultado de la anterior cuenta es cero, lo cual no me sirve.

(Voy a programar en C, el micro es de la familia S08 de Freescale)

Muchas gracias y espero que alguien me pueda ayudar!
11/07/2012 #2

Avatar de cosmefulanito04

Podés:

- Usar Nº flotantes -> más código de programa y posiblemente menor velocidad.

- Usar Nº enteros, multiplicando por 10^(n) el numerador previamente y luego dividiendo -> no requiere tanto código, pero si más desarrollo de tu parte (no mucho) y en cuanto a la velocidad, habría que ver si resulta más rápido que el anterior.

En tu caso, para esa cuenta en particular yo haría esto:

Código PHP:
#define n_decimales 2

int main(){

unsigned long int auxiliar;

....
// Tú código

auxiliar=(unsigned long int)(tu_valor*10^(n_decimales)); //Podrías reemplazar la función ^ por un for, si es que tu uC necesita mucho código para eso

auxiliar=(auxiliar>>8); //Desplazas 8 veces a la izq = dividís por 256, en caso de dividir por un Nº distinto a base 2, deberás usar "/" y no el desplazamiento.

...

Entonces de ese código el resultado final se encuentra en la variable "auxiliar" y será 48, ese resultado lo tenés que interpretar como 0,48.

Si quisieras más decimales, simplemente lo declarás en el define, ej. 4 => auxiliar=4882 y lo tenés que interpretar como 0,4882.

Acordate que un "long int" son 32 bits y un "unsigned long int" te permite ir de 0 a 2^32, con lo cual en el caso de 125 el n_decimales no deberá superar a 7.
11/07/2012 #3


Podrías analizar el rango del número (del 125 en tu caso) y multiplicarlo por 10 o 100 antes de dividirlo. Luego, al momento de expresarlo en el display, agregas los "0," correspondientes.

En 8 bits no podes expresar números con coma, solo en los tipo float.
Saludos
11/07/2012 #4

Avatar de Scooter

Busca información sobre "coma flotate"
11/07/2012 #5


cosmefulanito04 dijo: Ver Mensaje
Podés:

- Usar Nº flotantes -> más código de programa y posiblemente menor velocidad.

- Usar Nº enteros, multiplicando por 10^(n) el numerador previamente y luego dividiendo -> no requiere tanto código, pero si más desarrollo de tu parte (no mucho) y en cuanto a la velocidad, habría que ver si resulta más rápido que el anterior.

En tu caso, para esa cuenta en particular yo haría esto:

Código PHP:
#define n_decimales 2

int main(){

unsigned long int auxiliar;

....
// Tú código

auxiliar=(unsigned long int)(tu_valor*10^(n_decimales)); //Podrías reemplazar la función ^ por un for, si es que tu uC necesita mucho código para eso

auxiliar=(auxiliar>>8); //Desplazas 8 veces a la izq = dividís por 256, en caso de dividir por un Nº distinto a base 2, deberás usar "/" y no el desplazamiento.

...

Entonces de ese código el resultado final se encuentra en la variable "auxiliar" y será 48, ese resultado lo tenés que interpretar como 0,48.

Si quisieras más decimales, simplemente lo declarás en el define, ej. 4 => auxiliar=4882 y lo tenés que interpretar como 0,4882.

Acordate que un "long int" son 32 bits y un "unsigned long int" te permite ir de 0 a 2^32, con lo cual en el caso de 125 el n_decimales no deberá superar a 7.
Voy a probar de las 2 maneras, ya que no trabajo con procesos muy rápidos y ver cual me conviene.

Gracias a todos por la ayuda y los consejos!!!
11/07/2012 #6
Moderador

Avatar de Chico3001

Si se pueden manejar.. solo que hay que dividirlos en 4 bloques de 8 bits... para un gran total de 32 bits...

En microchip hay algunas notas de aplicacion de como implementarlos... solo que si es lento, tedioso y requiere mucho tiempo para hacer el calculo... si puedes evitarlo multiplicando por 10, 100 o 1000 es mejor....
11/07/2012 #7

Avatar de cosmefulanito04

Chico3001 dijo: Ver Mensaje
Si se pueden manejar.. solo que hay que dividirlos en 4 bloques de 8 bits... para un gran total de 32 bits...

En microchip hay algunas notas de aplicacion de como implementarlos... solo que si es lento, tedioso y requiere mucho tiempo para hacer el calculo... si puedes evitarlo multiplicando por 10, 100 o 1000 es mejor....
De todas formas si está trabajando en C, no debería costarle mucho, en asm si debe ser un despelote .
14/07/2012 #8


los pics de 8 bits por lo general no tiene multiplicador nio divisor real en su alu , para multiplicar o dividir tienen quye hacer algoritmos que toman mucho tiempo de procesamiento. no he usado ese micro , pero es de suponer que es igual ya que para numeros reales con punto fltante necestas 32 bits y una ALU que pueda procesarlas directamente..
15/07/2012 #9

Avatar de Scooter

Cuando yo era joven ningún ordenador tenía una unidad de coma flotante pero los ordenadores lo hacían. Es cuestión de implementar el código y ver si es lo bastante rápido.
15/07/2012 #10


Solo un apunte, desplazar a la izquierda es multiplicar y a la derecha dividir. Lo digo por el codigo comentado de cosmefulanito04, que aunque solo sea un error al comentar puede confundir.
15/07/2012 #11


Gracias por su colaboración!
15/07/2012 #12

Avatar de cosmefulanito04

flesk dijo: Ver Mensaje
Solo un apunte, desplazar a la izquierda es multiplicar y a la derecha dividir. Lo digo por el codigo comentado de cosmefulanito04, que aunque solo sea un error al comentar puede confundir.
Cierto, me equivoqué de lado cuando comenté (en el código desplacé bien)
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.