Autor Tema: multiplicacion Q15  (Leído 5885 veces)

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

Desconectado fram_22

  • PIC18
  • ****
  • Mensajes: 316
multiplicacion Q15
« en: 15 de Marzo de 2011, 19:10:32 »
Hola:

Hace ya algun tiempo tome un función para multiplicar números Q15 que publicó blackcat aqui en el foro, anexo el código.

Código: [Seleccionar]
;
; file: mult16x16.s
;

.global _mult15

_mult15:

MUL.SS W0, W1, W0

RLC W0, W0
RLC W1, W1

MOV W1, W0

return
.end

dicha función es llamada desde c de la siguiente forma:

Código: [Seleccionar]
extern int mult15(int, int);
La función trabaja perfectament, pero recibo las siguientes advertencias:


filtro_pasa_bajas.s: Assembler messages:
filtro_pasa_bajas.s:13: Warning: Implied attributes for section '.xdata' are deprecated
filtro_pasa_bajas.s:30: Warning: Quoted section flags are deprecated, use attributes instead
filtro_pasa_bajas.s:30: Warning: Implied attributes for section '.ybss' are deprecated


Desgraciadamente no conosco la programación en assembler de estos dispositivos y me siento un tanto perdido en cuando al significado de estas advertencias y sobre como corregirlo.
Cualquier ayuda se las agradecere ampliamente.

Saludos!!

Desconectado fram_22

  • PIC18
  • ****
  • Mensajes: 316
Re: multiplicacion Q15
« Respuesta #1 en: 16 de Marzo de 2011, 12:50:11 »
Olvidaba decirlo, compilo en utilizando el cmpilador C30 de microchip

Saludos!!

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: multiplicacion Q15
« Respuesta #2 en: 21 de Abril de 2011, 13:30:39 »
Hola!

Intenta hacerlo con este código:

Código: [Seleccionar]
.global _mult15

_mult15:

MOV W0, W4
MOV W1, W5
MPY W4*W5, A
SAC A, W0

return

.end

Esta fue otra forma que concluimos ... a mi no me despliega ningun warning.

Esta relacionada con la memoria X y Y ... pero no se a que se deberia.

Control Automático, DSP & Microcontroladores

Desconectado fram_22

  • PIC18
  • ****
  • Mensajes: 316
Re: multiplicacion Q15
« Respuesta #3 en: 25 de Abril de 2011, 15:55:16 »
Hola:

Lo he intentado y ha funcionado. Muchas gracias por tu ayuda!

Desconectado seba85

  • PIC10
  • *
  • Mensajes: 28
Re: multiplicacion Q15
« Respuesta #4 en: 15 de Agosto de 2013, 23:55:40 »
hola!
tengo varias dudas perdón que sea insistidor he seguido este tema por todo el foro y lo necesito para terminar con mi tesis...

Por que la función se declara como entero si le pasa fraccional?
extern int mult15(int, int);

Como le pasa estos valores al código asm cuando la llamamos en el main como coloca las variables en W0 y W1?
.global _mult15

_mult15:

MOV W0, W4
MOV W1, W5
MPY W4*W5, A
SAC A, W0

return

.end

y por ultimo como importo el asm a mi proyecto uso el MPLAB X XC16
Saludos!!
« Última modificación: 15 de Agosto de 2013, 23:59:18 por seba85 »

Desconectado fram_22

  • PIC18
  • ****
  • Mensajes: 316
Re: multiplicacion Q15
« Respuesta #5 en: 16 de Agosto de 2013, 12:54:31 »
hola:

me parece que la función se declara como int porque se trata de variables de punto dijo de 16 bits.
Si checas el directorio libq.h y dsp.h veras que las variables Q15 y fractional están declaradas como int.

Respecto al funcionamiento del código en asm me temo que no puedo ayudarte, en realidad es un tema que no domino, esta función me fue proporcionada amablemente por blackcat,.

Respecto a importar en XC16 no deberías tener ningún problema, simplemente pon el cursor sobre la carpeta de source files en tu proyecto de MPLABX. Posteriormente haz clic derecho con el mouse y selecciona add existing file. En ese momento selecciona el archivo y se agregara al proyecto.

espero la info te sea de utilidad

saludos

Desconectado seba85

  • PIC10
  • *
  • Mensajes: 28
Re: multiplicacion Q15
« Respuesta #6 en: 16 de Agosto de 2013, 19:25:51 »
Hola gracias por responder!
Leyendo el datasheet "16 bit MCU and DSC Programmer " encontré unas funciones optimizadas para multiplicar en formato Q15 y revisando la "Dissasembly listen file"
se ve que utiliza las funciones dsp como MPY.
Migsantiago ya la había posteado y no le preste atención, pero cuando leí el datasheet recordé que la había visto en algún lado... jejeje
la vuelvo a copiar del post:

Código: [Seleccionar]
fractional d, e, f;

   e = Q15(0.25); //0.25
   f = Q15(0.5); //0.5

register int result asm("A"); //usa acumulador A

//ni * n2 sin prefetches
result = __builtin_mpy(n1, n2, 0, 0, 0, 0, 0, 0);

d = __builtin_sac(result, 0); //regresa el MSB de A

También las estoy combinando con las que se encuentran en libq.h para poder optimizar el código y obtener los menores tiempos de calculo.

Otra cosa el código en ensamblador me sigue sin funcionar... no se que estaré haciendo mal...
Saludos!
« Última modificación: 16 de Agosto de 2013, 19:47:10 por seba85 »