Autor Tema: suma de numeros pares para pic16f877a  (Leído 181 veces)

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

Desconectado aldodavilam

  • PIC10
  • *
  • Mensajes: 6
suma de numeros pares para pic16f877a
« en: 29 de Mayo de 2018, 04:02:07 »
Hola amigos, como estan??.. estoy de vuelta, y bueno primeramente muchas por toda la ayuda de me ha ofrecido con el problema anterior. Ahora traigo otro problema, y pues acudo aqui, por que se que muchos jovenes que dominan el ensamblador..

bueno, comienzo.. deseo realizar un programa que haga lo siguiente::

Que ingresando un numero "N", el programa calcule la suma de los "n" primeros numeros pares no multiplos de 4...

realmente no se me ha ocurrido algo concreto, de como realizar, por ello acudo a esta excelente comunidad..

Les deseo muchos exitos .. y les agradezco por su tiempo..
Muchas gracias de antemanos, Saludos desde Perú. :o

Desconectado Eduardo2

  • PIC10
  • *
  • Mensajes: 49
Re:suma de numeros pares para pic16f877a
« Respuesta #1 en: 29 de Mayo de 2018, 09:10:25 »
Los pares no mútiplos de 4 son: 2,6,10,14,18,...  es decir, números de la forma p = 2+4*k = 2*(1+2*k)

- Podés generarlos inicializando una variable con 2 , ir incrementándola de a 4 n veces e ir llevando su suma.

- Podés hacer la suma de los primeros n impares y multiplicar el resultado x2.

- Podés aprovechar que la suma de n impares es n^2 y devolver directamente S = 2*n^2

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6621
Re:suma de numeros pares para pic16f877a
« Respuesta #2 en: 29 de Mayo de 2018, 10:32:18 »
Eduardo2 te dio toda la solucion: 2*(1+2*k)

Segun lo que entiendo es que vas a tener que sumar N cantidad de numeros( ya que los llamaste 'N' y 'n' no se que relacion tienen entre ambos) de los cuales esos numero son los pares no multiplos de 4. Entonces tenes que realizar un loop desde 0 hasta N ( o de N hasta 0), y hacer la ecuacion que te presento eduardo, al final de esa ecuacion lo sumas en otro registro. Hacer esa ecuacion es muy simple en ASM ( a comparacion de las otras que dio).


Código: ASM
  1. LOOP:
  2.       RLF  NUMERO, W      ;Procedo a multiplicarlo por 2 primero (2*k)
  3.       MOVWF TEMP           ; Lo guardo en un registro temporal
  4.       INCF   TEMP, F          ; Le sumo 1 (1 + 2*k)
  5.       RLF  TEMP, W            ; Lo multiplico por 2 y guardo en W - 2*(1+2*k)
  6.       ADDWF  RESULTADOL ; Lo sumo al total
  7.       BTFSC    STATUS,C     ; Se excedio de lso 8 bits ?
  8.       INCF   RESULTADOH   ; Incremento en 1 la parte alta si es que fue asi.
  9.       DEFSZ NUMERO, F      ; Decremento de a 1 numero para pasarlo por todos los valores
  10.       GOTO  LOOP              ; Mientras no llegue a 0 vuelva a repetir

Eso si.. el LOOP requiere un par de condiciones antes... Primero que va de N a 1, lo cual nos faltaria sumar el 0, esto lo podes hacer antes o despues. Falta el borrado de los RESULTADOx, y falta la proteccion en caso de que NUMERO sea 0, ya que de ser asi se devolveria un valor erroneo.

Desconectado aldodavilam

  • PIC10
  • *
  • Mensajes: 6
Re:suma de numeros pares para pic16f877a
« Respuesta #3 en: 29 de Mayo de 2018, 11:59:45 »
Muchas gracias amigos, por tener el tiempo de ayudarme y pues No Tengo basto conocimiento  en ensamblador pero estoy aprendiendo.. Y sobre el mensaje de la relación que existe ... por decir asi...

N= numero ingresado
n= números impares no múltiplos a sumar..

Por ejemplo.

Ingresamos N= 30...
Entonces sumará los n=8 números pares no múltiplos de 4. Que sería 2,6,10,14,18,22,26,30

Y nos dará el resultado de = 128

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6621
Re:suma de numeros pares para pic16f877a
« Respuesta #4 en: 29 de Mayo de 2018, 14:03:43 »
Entonces te conviene comenzar desde 0, realizar la formula que te paso Eduardo2, y al finalizar la formula (antes de sumarlo) comprobar si el numero calculado es menor o igual al ingresado. De serlo así continuas al otro, si no lo es, es decir N > f(n) (N mayor a lo calculado) salis y no lo sumas.
« Última modificación: 29 de Mayo de 2018, 14:09:15 por KILLERJC »