Autor Tema: suma y acarreo  (Leído 3335 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado arnoldojrm

  • PIC10
  • *
  • Mensajes: 16
suma y acarreo
« en: 26 de Noviembre de 2004, 09:46:00 »
Hola a todos y gracias por leer mi comentario.

Necesito sumar un word y un byte, pero, si existe acarreo, como hago para guardar todos los bit, sin peder ninguno. supongo que debo usar otra variable, pero como verifico el carry en pbp?

Saludos Arnoldo - Venezuela

Desconectado lager

  • PIC18
  • ****
  • Mensajes: 258
RE: suma y acarreo
« Respuesta #1 en: 26 de Noviembre de 2004, 10:00:00 »
arnoldojrm,
Una opcion para evitar ese problema seria guardar el resultado en una variable tipo float que va de -2147483646.999 a +2147483646.999.
Otra opcion seria chekar a la hora de hacer la suma que no sobre pase el limite de la variable con un condicionante if...then....,

Salu2 pana

Desconectado arnoldojrm

  • PIC10
  • *
  • Mensajes: 16
RE: suma y acarreo
« Respuesta #2 en: 26 de Noviembre de 2004, 10:45:00 »
Gracias Lager, por tu respuesta.

El problema es que necesito hacer esa suma,  no puedo condicionarla, y por otro lado estoy trabajando con pbp y MicroCode Studio y este no permite variables float, la más grande es la tipo word Ardiendo. por esta razon no puedo resolver el problema tan facilmente.

Es posible verificar el valor de carry y asi hacerlo manualmente, o sea que despues de sumar verique el C y se lo sume a otra variable

w1 var word
w2 var word
b    var byte

    W1 = $ffff
    b = $ff
    w2 = w1 + b
    portb.7 = status.0          " muestra el carry
    W1 = $ff00
    b = $ff
    w2 = w1 + b
    portb.6 = status.0          " muestra el carry

con esto estoy verificando que valor tiene el c despues de la operación

Saludos desde Venezuela

Desconectado lager

  • PIC18
  • ****
  • Mensajes: 258
RE: suma y acarreo
« Respuesta #3 en: 26 de Noviembre de 2004, 12:36:00 »
pana arnoldojrm,
Una opcion mas  es desbaratar cualquier numero en bytes, asi puedes manejar cualqueir longitud de numero, asi la informacion o cada byte(para un word serian dos bytes, para un dword serian 4 bytes) estara contenida en el low byte de cada word, para procesarla(dividirla o restarla, o multip. etc) se haria el mismo proceso ya que pbp no soporta variables con mayor capacidad, aqui te ongo un ejemplo "SIN OPTIMIZACION" para que lo tomes de base para mejorarlo a tus necesidades:

alto var w1.1
bajo var w1.0
w1 var word
w2 var word
pb var word
sb var word
tb var word
pba var pb.1
pbb var pb.0
sba var sb.1
sbb var sb.0
tba var tb.1
tbb var tb.0
b var byte

W1 = $ffff
b = $ff
w2 = w1 + b
if status.0 =1 then  "Es neceasrio desbaratar??(sobre pasa el limite del word?
pb=bajo+b               "sumamos y obtenemos en el hight byte el c
sb=alto+pba                 "sumamos c
tbb=1                             "constante  limitante a suma MAXIMA de 2 words
LCDOUT $FE, 1,#tbb ,#sbb,#pbb   "impresion de Msb a Lsb
else                           " como no es necesario no perdemos tiempo y lo imprimimos
w2 = w1 + b
LCDOUT $FE, 1,#w2
end if
Tampoco e probado el codigo(ya que no uso pbp), pero es la base del proceso.
Un abrazo pana

Desconectado arnoldojrm

  • PIC10
  • *
  • Mensajes: 16
RE: suma y acarreo
« Respuesta #4 en: 27 de Noviembre de 2004, 23:56:00 »
gracias lager, tu idea de separar los byte uno por uno me dio la solución definitiva al problema de la suma.


Que seria de los pic maniacos sin el foro!

Nuevamente, gracias !
RebotadoRebotadoGiñoRebotadoRebotado

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: suma y acarreo
« Respuesta #5 en: 28 de Noviembre de 2004, 16:58:00 »
PERFECTO pana arnoldojrm, RebotadoRebotadoRebotadoRebotadoRebotado
No tienes que agradecer nada pana, solo fue una idea ,tu encontraste la solucion a tu problema en especifico,(acuerdate que no es lo mismo decir que hacer y tu lo hiciste) ademas de eso se trata el foro de ideas productivas
Un abrazo pana

Desconectado arnoldojrm

  • PIC10
  • *
  • Mensajes: 16
RE: suma y acarreo
« Respuesta #6 en: 01 de Diciembre de 2004, 21:42:00 »
esta fue la solucion definitiva que consegui al problema


" rutina que suma 4 bytes       
" el menos significativo esta en arreglo(7)
" el mas significativo en arreglo(4)
" la variable a sumar es el arreglo contra varanalog
suma1:
    acarreo = 0
    if (arreglo1(7) + varanalog) > 255  then
        arreglo1(7)= arreglo1(7) + varanalog
        acarreo = 1
    else
        arreglo1(7)= arreglo1(7) + varanalog
        acarreo = 0
    endif
    if acarreo = 1 then
        gosub suma2
    endif
return

suma2:
    if (arreglo1(6) + acarreo) > 255  then
        arreglo1(6)= arreglo1(6) + acarreo
        acarreo = 1
    else
        arreglo1(6)= arreglo1(6) + acarreo
        acarreo = 0
    endif
    if acarreo = 1 then
        gosub suma3
    endif
return

suma3:
    if (arreglo1(5) + acarreo) > 255  then
        arreglo1(5)= arreglo1(5) + acarreo
        acarreo = 1
    else
        arreglo1(5)= arreglo1(5) + acarreo
        acarreo = 0
    endif
    if acarreo = 1 then
        arreglo1(4) = arreglo1(4) + acarreo
    endif
return

Saludos Venezuela

Desconectado RGL

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 634
RE: suma y acarreo
« Respuesta #7 en: 02 de Diciembre de 2004, 15:39:00 »
La solución a este problema está en el Protón que tiene variables DWORD y FLOAT.
Con lo que para este tipo de cosas te viene a pelo y te facilita mucho la vida.

Saludos
Ricky


 

anything