Hola, muchas gracias, y no hay que disculparse por intentar ayudar!!! (lo agradezco igualmente). La verdad que es bastante curioso y por eso he decidido postearlo porque hoestamente haciendo paso a paso las ejecuciones no logro darme cuenta, pero voy a mirar los registros que comentas y luego comento el resultado (en paralelo si a alguien se le ocurre algo más será más que bienvenido). Por cierto, por si sirve de ayuda, lo estoy simulando con el MPLABX. El ejemplo sobre el que me baso y que tiene la función en assembler es para un dsPIC33FJ12MC202 y en C uso un dsPIC33EP128MC204.
Miestras estaba escribiendo esta respuesta me he puesto a ejecutar mirando los registros. Efectivamente en el registro CORCON los bits US e IF están por default (US=0 y IF=0). El único bit que está en 1 es el SATDW, con lo que el valor del registro completo es CORCON=0x0020
En assembler:
Antes de ejecutar la
línea 35 del primer post mov.w #OneBySq3,Sq3W ; 1/sqrt(3) in 1.15 formatLos registros tienen estos valores:
ACCA=0xFFFE930000
ACAAH=0xFE93
ACCAL=0x0000
ACCAU=0xFFFF
WREG0=0xFFFF
WREG1=0xFFFF
WREG2=0x4B55
WREG3=0x430B
WREG4=0xFD26
WREG5=0xFD26
WREG6=0xE103
WREG7=0x00B2
Al pasar a la siguiente linea
mov.w _ParkParm+Park_qIa,IaW (tener en cuenta que ejecuta la línea anterior, con lo que marco con << los registros que han cambiado de aqui en adelante):
ACCA=0xFFFE930000
ACAAH=0xFE93
ACCAL=0x0000
ACCAU=0xFFFF
WREG0=0xFFFF
WREG1=0xFFFF
WREG2=0x4B55
WREG3=0x430B
WREG4=0x49E7 <<
WREG5=0xFD26
WREG6=0xE103
WREG7=0x00B2
Al pasar a la siguiente linea,
mpy Sq3W*IaW,A:
ACCA=0xFFFE930000
ACAAH=0xFE93
ACCAL=0x0000
ACCAU=0xFFFF
WREG0=0xFFFF
WREG1=0xFFFF
WREG2=0x4B55
WREG3=0x430B
WREG4=0x49E7
WREG5=0xFD26
WREG6=0xFE3E <<
WREG7=0x00B2
Al pasar a la siguiente linea,
mov.w _ParkParm+Park_qIb,IbW:
ACCA=0xFFFEFC2FE4 <<
ACAAH=0xFEFC <<
ACCAL=0x2FE4 <<
ACCAU=0xFFFF
WREG0=0xFFFF
WREG1=0xFFFF
WREG2=0x4B55
WREG3=0x430B
WREG4=0x49E7
WREG5=0xFD26
WREG6=0xFE3E
WREG7=0x00B2
Al pasar a la siguiente linea,
mac Sq3W*IbW,A (he seguido consejo de mantener qIb=0):
ACCA=0xFFFEFC2FE4
ACAAH=0xFEFC
ACCAL=0x2FE4
ACCAU=0xFFFF
WREG0=0xFFFF
WREG1=0xFFFF
WREG2=0x4B55
WREG3=0x430B
WREG4=0x49E7
WREG5=0xFD26
WREG6=0xFE3E
WREG7=0x0000 <<
Al pasar a la siguiente linea,
mac Sq3W*IbW,A (no he notado cambio ¿?):
ACCA=0xFFFEFC2FE4
ACAAH=0xFEFC
ACCAL=0x2FE4
ACCAU=0xFFFF
WREG0=0xFFFF
WREG1=0xFFFF
WREG2=0x4B55
WREG3=0x430B
WREG4=0x49E7
WREG5=0xFD26
WREG6=0xFE3E
WREG7=0x0000
Al pasar a la siguiente linea,
mov.w _ParkParm+Park_qIa,IalphaW(no he notado cambio ¿?):
ACCA=0xFFFEFC2FE4
ACAAH=0xFEFC
ACCAL=0x2FE4
ACCAU=0xFFFF
WREG0=0xFFFF
WREG1=0xFFFF
WREG2=0x4B55
WREG3=0x430B
WREG4=0x49E7
WREG5=0xFD26
WREG6=0xFE3E
WREG7=0x0000
Al pasar a la siguiente linea (
mov.w _ParkParm+Park_qIa,IalphaW, como copia el mismo valor no hay cambios esperados...):
ACCA=0xFFFEFC2FE4
ACAAH=0xFEFC
ACCAL=0x2FE4
ACCAU=0xFFFF
WREG0=0xFFFF
WREG1=0xFFFF
WREG2=0x4B55
WREG3=0x430B
WREG4=0x49E7
WREG5=0xFD26
WREG6=0xFE3E
WREG7=0x0000
Al pasar a la siguiente linea (
mov.w IalphaW,_ParkParm+Park_qIalpha, aqui tampoco se esperan cambios, copia a la estructura):
ACCA=0xFFFEFC2FE4
ACAAH=0xFEFC
ACCAL=0x2FE4
ACCAU=0xFFFF
WREG0=0xFFFF
WREG1=0xFFFF
WREG2=0x4B55
WREG3=0x430B
WREG4=0x49E7
WREG5=0xFD26
WREG6=0xFE3E
WREG7=0x0000
Al pasar a la siguiente linea (
sac A,IbetaW):
ACCA=0xFFFEFC2FE4
ACAAH=0xFEFC
ACCAL=0x2FE4
ACCAU=0xFFFF
WREG0=0xFFFF
WREG1=0xFFFF
WREG2=0x4B55
WREG3=0x430B
WREG4=0x49E7
WREG5=0xFD26
WREG6=0xFE3E
WREG7=0xFEFC <<
finalmente al ejecutar la linea
mov.w IbetaW,_ParkParm+Park_qIbeta, no se esperan cambios en los registros porque actualiza la estructura
0xFEFC=-260 porque el valor de
qIa=-450 .
En C:
ParkParm.qIbeta = ParkParm.qIa * dqOneBySq3 + 2 * ParkParm.qIb * dqOneBySq3;
Como no puedo analizarlos registros y veo el resultado directamente (incluso mirando el acumulador tras el calculo veo que esta todo a 0). El resltado teniendo los mismos valores incluido qIb=0x0000 es
0x17F2=6130Seguiré investigando, pero se me está escapando algo... quiza de tanto hacer y deshacer....
Gracias por la ayuda!