Autor Tema: SUMAR -- LIMITE SUPERIOR 150.0000  (Leído 3342 veces)

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

Desconectado Sacahe

  • PIC12
  • **
  • Mensajes: 68
SUMAR -- LIMITE SUPERIOR 150.0000
« en: 30 de Abril de 2010, 23:07:02 »
Hola amigos!!!

Problema: Necesito me colaboren con una rutina que realice sumas sucecivas de numeros enteros, y que tenga como limite alcanzar el valor de 150.0000.

He revisado varias rutinas que realizan sumas de 16bit y 24 bits, las pruebo y no me funcionan para mi aplicacion...gracias y espero sus sabias respuestas
« Última modificación: 30 de Abril de 2010, 23:27:16 por un Moderador, Razón: Título corregido »

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: SUMAR -- LIMITE SUPERIOR 150.0000... AYUDA!!!!
« Respuesta #1 en: 30 de Abril de 2010, 23:22:06 »
Pues, con una rutina de 16bit no te puede funcionar ya que 150.000 ocupan 18 bit. La rutina que te puede servir es de 24 bit.
¿Podrías colocar la rutina que utilizaste?
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado Sacahe

  • PIC12
  • **
  • Mensajes: 68
Re: SUMAR -- LIMITE SUPERIOR 150.0000
« Respuesta #2 en: 30 de Abril de 2010, 23:51:03 »
Por ejemplo encontre esta:  http://www.piclist.com/techref/microchip/math/add/24b.htm  pero la he estando probando y no funciona para numeros grandes, que me puedes aconsejar? La idea es hacer sumas digamos como las que hace una calculadora donde el limite es 150.000

Desconectado Sacahe

  • PIC12
  • **
  • Mensajes: 68
Re: SUMAR -- LIMITE SUPERIOR 150.0000
« Respuesta #3 en: 01 de Mayo de 2010, 01:10:20 »
Quien me dice como utilizar adecuadamente la rutina anterior?, prueba tras prueba me he dado cuenta que algunos numeros no los suma bien por ejemplo 52189 + 12344. En el adjunto dejo el asm

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: SUMAR -- LIMITE SUPERIOR 150.0000
« Respuesta #4 en: 01 de Mayo de 2010, 02:18:24 »
Pregunta, ¿qué hace esta instrucción?

skpnc

Puedo sugerirte que lo realices tu mismo de una manera muy fácil.
Para ello tienes que saber como sumar en binario. La forma que se hace es sencilla. Antes de continuar tienes que decidir si vas a sumar 24 + 24  = 32 bit o 16 + 16 = 24 bit

En ambos casos, puedes llegar al límite que necesitas, pero con la segunda opción, no podrás sumar 149.999 + 1. Para ello tendrás que usar la primera opción 24 + 24 = 32 bit. Esto quiere decir que, necesitas tener 7 posiciones en la RAM como mínimo para poder lograr tu objetivo, de los cuales, 3 posiciones de la RAM compartirán el resultado y el sumando, los otros tres corresponde al siguiente número a sumar (segundo sumando) y la posición extra es la posición de un resultado.

Vamos a elegir la primera opción 24 + 24 = 32 bit y lo nombramos de la siguiente manera:

numeradorB; numeradorM; numeradoA + denominadorB; denominadorM; denominadorA = numeradorB; numeradorM; numeradorA; nemeradorAA

Primero sumas con la instrucción addwf el contenido de numeradorB con denominadorB y el resultado los guardas en numeradorB. Si hubo acarreo (bit C del registro STATUS) sumas 1 al numeradorM y chequeas su hubo acarreo, en caso afirmativo, sumás 1 al numeradorA (por el límite que necesitas sumar, acá no va haber acarreo, así que no lo chequeas).

Una vez sumado numeradorB con denominadorB y haber chequeado si hubo o no acarreo, tienes que sumar numeradorM con denominadorM y guardarlo en numeradorM. De nuevo chequear si hubo acarreo. En caso afirmativo, sumarle 1 a numeradorA. Chequear si hubo acarreo, en caso afirmativo sumarle 1 a numeradorAA.

Y para terminar, sumas numeradorA con denominadorA y el resultado lo guardas en numeradorA. Chequeas si hubo acarreo. En caso afirmativo, sumas 1 a numeradorAA. Al llegar aquí, tienes el resultado de la suma de numerador y denominador en numerador.

NOTA: He utilizado numerador y denominador para no confundir los lugares, ya que ambos o más números a sumar se llaman sumando.
B = parte baja
M = parte media
A = parte alta
AA = parte más alta.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
Re: SUMAR -- LIMITE SUPERIOR 150.0000
« Respuesta #5 en: 01 de Mayo de 2010, 02:43:18 »
. Si hubo acarreo (bit C del registro STATUS) sumas 1 al numeradorM y chequeas su hubo acarreo, en caso afirmativo, sumás 1 al numeradorA (por el límite que necesitas sumar, acá no va haber acarreo, así que no lo chequeas).
je je je SKIp (salta) si No hay aCarreo  :mrgreen:   btfsc STATUS,C
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado Sacahe

  • PIC12
  • **
  • Mensajes: 68
Re: SUMAR -- LIMITE SUPERIOR 150.0000
« Respuesta #6 en: 01 de Mayo de 2010, 03:31:22 »
Hermano Leon PIC que bien como me lo explicastes, clarisimo!!!...voy a realizar la rutina y luego te comento. Bendiciones!!! 

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: SUMAR -- LIMITE SUPERIOR 150.0000
« Respuesta #7 en: 01 de Mayo de 2010, 03:49:36 »
. Si hubo acarreo (bit C del registro STATUS) sumas 1 al numeradorM y chequeas su hubo acarreo, en caso afirmativo, sumás 1 al numeradorA (por el límite que necesitas sumar, acá no va haber acarreo, así que no lo chequeas).
je je je SKIp (salta) si No hay aCarreo  :mrgreen:   btfsc STATUS,C

Gracias Norberto. Ahora se una instrucción más en asm del pic (yo solo estaba con las del datsheet :mrgreen:)

Sacahe, de nada. Me alegro que lo hayas entendido. Bendiciones para ti también y a todos los del foro.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: SUMAR -- LIMITE SUPERIOR 150.0000
« Respuesta #8 en: 01 de Mayo de 2010, 06:04:05 »
ey ey, que a mi tambien me ha pillao desprevenío :shock: de ande salen esas instrucciones?? como skip. algun listado??

respecto a las sumas no puedo ayudar, asignatura pendiente :D pero por aqui ando, un saludo

Desconectado Sacahe

  • PIC12
  • **
  • Mensajes: 68
Re: SUMAR -- LIMITE SUPERIOR 150.0000
« Respuesta #9 en: 01 de Mayo de 2010, 13:21:17 »
Leon PIC como ubicarias por ejemplo los numeros de la suma 52189 + 12344 en los registros numeradorB; numeradorM; numeradoA + denominadorB; denominadorM; denominadorA?  :huh:

Cual es el maximo valor a cargar en cada registro de los sumandos?

Desconectado Sacahe

  • PIC12
  • **
  • Mensajes: 68
Re: SUMAR -- LIMITE SUPERIOR 150.0000
« Respuesta #10 en: 01 de Mayo de 2010, 16:27:00 »
Compañeros por fin lo hice, trasnforme la rutina anterior de tal forma que ya funciona para mi aplicacion, incluso el limite superior es llega hasta 2559999, les comparto la rutina (bien explicadita) por si alguna vez la pueden necesitar. Si le encuentran alguna inconsistencia me lo informan

Bendiciones para todos!!!

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: SUMAR -- LIMITE SUPERIOR 150.0000
« Respuesta #11 en: 02 de Mayo de 2010, 05:59:48 »
Felicitaciones por el logro.

Cuando se generan rutinas para sumar, restar, multiplicar o dividir, es mejor trabajarlas directamente en hexadecimal o binario ya que el CP trabaja en base a dos (el ser humano cuenta en base de 10); es por ello que has tenido que restar 100 para saber si hubo acarreo o no.

El número 30.000 (decimal) ocupa dos posiciones de RAM y se expresa como 7530. Esto quiere decir que, si tenemos dos posiciones de RAM llamadas sumandoB y sumandoA, para grabarle el número 30.000, sumandoB tiene que tener grabado 30 y samandoA 75.
Por ejemplo, veamos en distintas anotaciones el contenido de estas dos posiciones de memoria para un valor de 30.000 (en decimal)


          HEX       BIN       DEC
sumandoA  75     01110101     117
sumandoB  30     00110000     48


Noten los valores en decimales (11748) que irónicamente, es igual a 30.000; esta "paradoja" ocurre porque el microcontrolador, no es capaz de contar más allá de 255 y hay que usar un truco por software para que logre hacerlo.

Lo bueno de tu rutina, es que puedes guardar los valores en notaciones decimales (en base a 10) y esto evita un posible error y la contra que tiene es que agrega una resta en la suma.

La forma más común de hacer una suma que supere los 255 es de la siguiente manera.
Supongamos 4 posiciones de memorias llamadas sumandoA; sumandoB; resultadoA; resultadoB y haremos 8.447 + 4.097 = 12.544 (en decimal)
8.447 = 20FF (hex); 4.097 = 1001 (hex) y 12.544 = 3100 (hex)

sumandoA = 20
sumandoB = FF
resultadoA = 10
resultadoB = 01

La rutina sería así:

Código: ASM
  1. MOVFW  sumandoB
  2. ADDWF  resultadoB,F   ;sumo sumandoB + resultadoB y el resultado de la operación queda guardado en resultadoB
  3. BTFSS   STATUS,C      ;¿hubo acarrero?
  4. GOTO   $+3               ;no hubo acarreo.
  5. MOVLW  .1                 ;si, hubo acarreo entonces sumo uno a sumandoA (también es válido sumárselo a resultadoA)
  6. ADDWF  sumandoA,F
  7. MOVFW  sumandoA
  8. ADDWF  resultadoA,F   ;sumo sumandoA + resultadoA y el resultado de la operación queda guardado en resultadoA

Cuando el CP haga la suma de sumandoB + resultadoB hará lo siguiente FF + 01 = 00 (con acarreo y se lo suma a sumandoA, ahora sumandoA vale 21). Luego sumará 21 + 10 = 31 y como se puede apreciar queda formado la cifra 3100 que es igual a 12.544
La ventaja de trabajar de esta forma, es que directamente trabajas en los números que puede operar el CP, en cambio de la otra manera, tienes que transformar un valor en HEX a decimal.

Espero que se entienda la ventaja de sumar en HEX con respecto en sumar en DEC (decimal), además de quedar un programa/rutina más corto.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado Sacahe

  • PIC12
  • **
  • Mensajes: 68
Re: SUMAR -- LIMITE SUPERIOR 150.0000
« Respuesta #12 en: 02 de Mayo de 2010, 11:56:04 »
Compadre LeonPIC, habia hecho pruebas con un programa (el primero que adjunte) que realizaba el metodo que me explicas, pero tu ejemplo me hizo caer en cuenta que estaba ubicando los numeros de los sumandos en los registros como no era, en formato decimal, y es en hexadecimal. Ya todos los numeros me suman correctamente. Gracias mi hermano por el tiempo dedicado!!!

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: SUMAR -- LIMITE SUPERIOR 150.0000
« Respuesta #13 en: 02 de Mayo de 2010, 19:03:12 »
 :azn: :azn:
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.


 

anything