TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Franc749 en 05 de Enero de 2007, 22:24:50

Título: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hacerlo?
Publicado por: Franc749 en 05 de Enero de 2007, 22:24:50
Tengo que multiplicar dos registros de 8 bits y el resultado me tiene que quedar en 8 bits

para luego sacar por un DAC de 8 bit.

Martín me dijo que si tengo dos registros A y B.
La multiplicacion seria sumar A asi mismo B veces = AxB

Aguien alguna vez lo hizo???


Ayuda por favor :-/
Título: Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hacerlo?
Publicado por: Veguepic en 05 de Enero de 2007, 22:54:31
Dale una mirada a estos dos links:

http://www.todopic.com.ar/asm/varios/arith.txt

http://www.physics.brocku.ca/courses/2p31/References/datasheets/00526e.html

espero nos cuentes que tal te fue y mejor aun si pegas tus resultados.

Suerte.
Título: Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hace
Publicado por: maunix en 06 de Enero de 2007, 11:13:41
Franc749 te dejo el link directo a notas de aplicación de Microchip que justamente tratan este tema.

AN526: Math Routines (http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en011000)

Ahí tienes el pdf y el código fuente

Saludos
Título: Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hacerlo?
Publicado por: PalitroqueZ en 06 de Enero de 2007, 15:51:02
Mira este link (http://www.todopic.com.ar/foros/index.php?topic=15107.0) a ver si te sirve.

Salu2
Título: Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hacerlo?
Publicado por: Franc749 en 13 de Enero de 2007, 17:21:05
Muchas gracias a todos. :)

Era justo lo que buscaba. Solo esperemos que la multiplicacion me quede en 8 bit y no se desvorde jeje.


Saludos :mrgreen:
Título: Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hace
Publicado por: maunix en 16 de Enero de 2007, 16:29:50
Muchas gracias a todos. :)

Era justo lo que buscaba. Solo esperemos que la multiplicacion me quede en 8 bit y no se desvorde jeje.


Saludos :mrgreen:

Si es así, es porque tienes muuuuuuuuuuuucha suerte.

Una multiplicación de 8 bits x 8 bits, tiene muchas más chances de ser mayor a 255 que menor, ya que el rango es hasta 65536 y para que sea de 8 bits nomas, no debiera superar el valor 255.

Con que ambos sean mayores o iguales a 16, ya te dará un número superior a 256.

Saludos
Título: Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hacerlo?
Publicado por: ascii en 16 de Enero de 2007, 19:15:20
Asi es lo mas probable es que el resultado de la multiplicacion supere un registro 8bits, por lo que te recomendaria que guardes la parte baja de tu multiplicacion en un registro de 8 y la parte alta en otro registro de 8.
Título: Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hace
Publicado por: maunix en 16 de Enero de 2007, 20:23:53
Asi es lo mas probable es que el resultado de la multiplicacion supere un registro 8bits, por lo que te recomendaria que guardes la parte baja de tu multiplicacion en un registro de 8 y la parte alta en otro registro de 8.

Eso es lo que hace precisamente la rutina de 8bits x 8bits de la application note.

   :) :)
Título: Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hacerlo?
Publicado por: Franc749 en 01 de Febrero de 2007, 16:49:49
Se podría hacer la multiplicacion en punto flotante en assembler?

Necesito multiplicar a  un valor de 0 a 256 que está en un registro por un nro= 0.00435 que es una contante de una ecuacion de diferencias de un PID.
 
No sé si es punto flotante o no. creo que es "punto flotante" por que el numero esta en decimales.

Ayuda :-/
Título: Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hace
Publicado por: maunix en 01 de Febrero de 2007, 17:27:45
Se podría hacer la multiplicacion en punto flotante en assembler?

Necesito multiplicar a  un valor de 0 a 256 que está en un registro por un nro= 0.00435 que es una contante de una ecuacion de diferencias de un PID.
 
No sé si es punto flotante o no. creo que es "punto flotante" por que el numero esta en decimales.

Ayuda :-/

Todo todo todo se puede hacer en assembler, el tema es que es trabajoso.

De hecho un compilador de C , basic, pascal o cualquier otro lenguaje, en definitiva termina pasando el código a assembler.

Hay también un par de application notes de Microchip que tratan el tema.  Te sugiero que te pases una vuelta por su página.

Saludos
Título: Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hacerlo?
Publicado por: Franc749 en 07 de Febrero de 2007, 20:05:20
Si en verdad es todo un tema lo de la multiplicacion en punto flotante. :?

He decidido hacerlo en C pues no es dificil y ya tengo el codigo, pero solo quiero hacer la multiplicacion en C.

¿Hay alguna forma de pasar el codigo en C de la multiplicacion a Assembler?
Así tengo todo en assembler o la mayor parte.
Así no cominezo desde el principio todo mi programa en C.

Les pregunto por que capaz que ya habian tratado el tema.

Saludos :)
Título: Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hace
Publicado por: maunix en 07 de Febrero de 2007, 20:20:32
Si en verdad es todo un tema lo de la multiplicacion en punto flotante. :?

He decidido hacerlo en C pues no es dificil y ya tengo el codigo, pero solo quiero hacer la multiplicacion en C.

¿Hay alguna forma de pasar el codigo en C de la multiplicacion a Assembler?
Así tengo todo en assembler o la mayor parte.
Así no cominezo desde el principio todo mi programa en C.

Les pregunto por que capaz que ya habian tratado el tema.

Saludos :)

Mirá, podrías analizar el assembler generado aunque también te comento que las rutinas de coma flotante del C18 están completamente escritas en assembler.

El tema es que usan el stack que usa el compilador C18 para paso y devolución de parámetros con lo cual debieras estar muy familiarizado con su uso. 

Título: Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hacerlo?
Publicado por: mariano_pic en 04 de Marzo de 2007, 16:01:17
Aca lo tengo jeje y lo probe en MPLAB ojala les sirva.  :mrgreen:

Código: [Seleccionar]
           CBLOCK
           byte_H, byte_L, Mult1, Mult2
           ENDC
           ;los registros utilisados son byte_H y byte_L almasenan el resultado de la multiplicacion
           ;los registros Mult1, Mult2 los operandos

    Mult
           clrf       byte_L               ; borramos para inicilisar
           clrf       byte_H                     
           movf    mult1 ,  w          ;cargamos el operando 1
           bcf       status , c           ;borramos c

    Mult_
           addwf   byte_L , f          ;El valor mult1 nunca se pierde aca
           btfsc    status , c           ;ahi llevada?
           call       Mult_2              ;si
           decfsz   mult2 ,  f          ;no y termino?
           goto      Mult_               ;no
           return                          ;si, regresa

    Mult_2
           incf       byte_H , f
           return




Luego les pongo mas jeje
Título: Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hacerlo?
Publicado por: BrunoF en 04 de Marzo de 2007, 16:45:43
Código: [Seleccionar]
           CBLOCK
           byte_H, byte_L, Mult1, Mult2
           ENDC
           ;los registros utilisados son byte_H y byte_L almasenan el resultado de la multiplicacion
           ;los registros Mult1, Mult2 los operandos

    Mult
           clrf       byte_L               ; borramos para inicilisar
           clrf       byte_H                     
           movf    mult1 ,  w          ;cargamos el operando 1
    Mult_
           addwf   byte_L , f          ;El valor mult1 nunca se pierde aca
           btfsc    status , c           ;ahi llevada?
           incf       byte_H , f

           decfsz   mult2 ,  f          ;no y termino?
           goto      Mult_               ;no
           return                          ;si, regresa

El programa es un poquito mas corto. Elimine dos lineas. Pero tu algoritmo tiene un error si Mult2 es cero. Multiplica 256 veces incorrectamente.
¿Solucion?:

Código: [Seleccionar]
           CBLOCK
           byte_H, byte_L, Mult1, Mult2
           ENDC
           ;los registros utilizados son byte_H y byte_L almacenan el resultado de la multiplicacion
           ;los registros Mult1, Mult2 los operandos

    Mult
           clrf       byte_L               ; borramos para inicializar
           clrf       byte_H                     
           movf    mult2,f               ; Si es cero...
           btfsc    STATUS,Z
           return                            ; volver con resultado= 0

           movf    mult1 ,  w          ;cargamos el operando 1
    Mult_
           addwf   byte_L , f          ;El valor mult1 nunca se pierde aca
           btfsc    status , c           ;hay llevada?
           incf       byte_H , f

           decfsz   mult2 ,  f          ;no y termino?
           goto      Mult_               ;no
           return                          ;si, regresa

Saludos.
Título: Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hacerlo?
Publicado por: PalitroqueZ en 05 de Marzo de 2007, 15:20:09
Si en verdad es todo un tema lo de la multiplicacion en punto flotante. :?

He decidido hacerlo en C pues no es dificil y ya tengo el codigo, pero solo quiero hacer la multiplicacion en C.
...

esa es una de las razones por las que uso el lenguaje C.  8)

Salu2
Pedro
Título: Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hacerlo?
Publicado por: AARON en 06 de Diciembre de 2007, 02:12:43
HOLA, EN LA AN DE MICROCHIP DE RUTINAS MATEMATICAS VIENE LA MULTIPLICACION 8X8, PERO NO ENTIENDO COMO FUNCIONA, ALGUIEN SABE COMO?
LA ADJUNTO, LOS NUMEROS A MULTIPLICAR DEBEN SER CARGADOS PRIMERO CADA UNO EN mulcnd Y mulplr RESPECTIVAMENTE


1997 Microchip Technology Inc. DS00526E-page 7
mulcnd equ 09 ; 8 bit multiplicand
mulplr equ 10 ; 8 bit multiplier
H_byte equ 12 ; High byte of the 16 bit result
L_byte equ 13 ; Low byte of the 16 bit result
count equ 14 ; loop counter


include “p16c5x.inc”
 
Same equ 1

 ; ***************************** Begin Multiplier Routine
 mpy_S clrf H_byte
clrf L_byte
 movlw 8
 movwf count
movf mulcnd,W
 bcf STATUS,C ; Clear the carry bit in the status Reg.
loop rrf mulplr, F
 btfsc STATUS,C
addwf H_byte,Same
 rrf H_byte,Same

 
 rrf L_byte,Same
 decfsz count, F
 goto loop
 retlw 0
Título: Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hacerlo?
Publicado por: AARON en 06 de Diciembre de 2007, 02:18:39
ALGUIEN ENTIENDE LA RUTINA DE MULTIPLICACION 8X8 DE MICROCHIP?
Ó
1997 Microchip Technology Inc. DS00526E-page 7
00029 mulcnd equ 09 ; 8 bit multiplicand
00000010 00030 mulplr equ 10 ; 8 bit multiplier
00000012 00031 H_byte equ 12 ; High byte of the 16 bit result
00000013 00032 L_byte equ 13 ; Low byte of the 16 bit result
00000014 00033 count equ 14 ; loop counter
00034 ;
00035 ;
00036 include “p16c5x.inc”
00001 LIST
00002 ;P16C5X.INC Standard Header File, Ver. 3.30 Microchip Technology, Inc.
00224 LIST
00037
00000001 00038 Same equ 1
00039
00040 ;
00041 ; ***************************** Begin Multiplier Routine
0000 0072 00042 mpy_S clrf H_byte
0001 0073 00043 clrf L_byte
0002 0C08 00044 movlw 8
0003 0034 00045 movwf count
0004 0209 00046 movf mulcnd,W
0005 0403 00047 bcf STATUS,C ; Clear the carry bit in the status Reg.
0006 0330 00048 loop rrf mulplr, F
0007 0603 00049 btfsc STATUS,C
0008 01F2 00050 addwf H_byte,Same
0009 0332 00051 rrf H_byte,Same
AN526
 
000A 0333 00052 rrf L_byte,Same
000B 02F4 00053 decfsz count, F
000C 0A06 00054 goto loop
00055 ;
000D 0800 00056 retlw 0
Título: Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hace
Publicado por: BrunoF en 06 de Diciembre de 2007, 14:18:17
Bueno: la rutina que expusiste es bastante avanzada para quien no está ágil con el assembler.

1)         La rutina se basa en el principio matemático:                           
           Una multiplicación puede descomponerse en sumas finitas del multiplicando * 2^X
           Ej:
           100 * 254 = 100 * 2^7 + 100 * 2^6 + 100 * 2^5 + 100 * 2^4 + 100 * 2^3 + 100 * 2^2 + 100 * 2^1
                          = 100 * 128 + 100 * 64 + 100 * 32 + 100 * 16 + 100 * 8 + 100 * 4 + 100 * 2

           Las rotaciones son perfectas para llevar a la práctica este principio.

2)          Rotar a la izquierda un registro es multiplicarlo por dos.
             Rotarlo a la derecha un registro es dividirlo por dos.

Acá puede que les surja la primer aparente incongruencia entre lo que digo y lo que hace la rutina porque si bien la rutina es de multiplicación, la rutina rota los registros hacia la derecha( lo que implicaria división y no multiplicación). Pero si observan bien, verán que las sumas (addwf H_byte,Same) se realizan sobre el byte alto del resultado(H_byte), lo que produce una multiplicación tácita inicialmente por 256, pero que se irá dividiendo por dos a medida que se roten a la derecha los registros. Entonces:

Descompongamos las 8 pasadas del algorítmo:

1era pasada: se comprueba el bit0 del multiplicador. Si es un 1 se procede a realizar la suma:
                    la suma se acumula en H_byte.

Pausa aquí:
Ejemplo:
                    1 * 1
Durante la primera pasada:
                  H_byte = .1
                  L_byte = .0                   
Entonces, el resultado es .256 si consideramos ambos registros como uno solo de 16 bits.
Resumiendo: el bit0 del multiplicador(que es factor x1) en realidad produjo un factor x256.
Pero no olvidemos que todos los registros se van rotando a la derecha, hasta un total de ocho veces entonces:

En la primer pasada del algoritmo:
                            H_byte       L_byte
                Res= b'00000001 00000000'

Pero luego de la octava pasada, se rotaron ocho veces a la derecha los registros, entonces queda:
                Res= b'00000000 00000001'

Bueno, sólo resta hacer esto 8 veces, y las rotaciones son las que van acomodando por si solas el factor de multiplicación adecuado.

¿Logré explicarlo, al menos medianamente? :D
Título: Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hacerlo?
Publicado por: SavageChicken en 17 de Diciembre de 2007, 14:30:57
Visita este Link (http://www.todopic.com.ar/foros/index.php?topic=17479.0)

Salud  8)
Título: Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hacerlo?
Publicado por: microcom en 17 de Diciembre de 2007, 18:43:15
todo bien


Código: ASM
  1. MULTIPLICACION  BCF     STATUS,0        ;RUTINA PARA MULTIPLICAR LOS NUMEROS
  2.                 CLRF    UNIDAD
  3.                 CLRF    DECENAS
  4.                 CLRF    RESULTADO
  5.                 MOVF    RESULT1,0
  6.                 BTFSS   STATUS,2
  7.                 GOTO    COL
  8.                 CLRF    RESULTADO
  9.                 GOTO    DECODIFICAR
  10. COL             MOVF    RESULT2,0
  11.                 BTFSS   STATUS,2       
  12.                 GOTO    SUCE
  13.                 CLRF    RESULTADO
  14.                 GOTO    DECODIFICAR
  15. SUCE    MOVF    RESULT1,0
  16.                 ADDWF   RESULTADO,1
  17.                 BTFSC   STATUS,0
  18.                 GOTO    EXCESO
  19.                 DECFSZ  RESULT2,1
  20.                 GOTO    SUCE
  21.                                return


saludos