TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: AKENAFAB en 31 de Marzo de 2010, 02:56:21
-
Hola!
Estoy tratando de reducir intrucciones generadas por el compilador , asi ahorrar tiempo.Uso un pic18F252
Leyendo sus especificaciones este contiene Hardware multiplicador de 8x8 con resultado de 16bits
Estoy multiplicando 8*8=16bits en CCS
tiempos[servos]*=40; <---- Esto con el CCS
y me genera este asm que consume 38ciclos
117: tiempos[servos]*=40; //250 pasos 8us x paso como prescala 0.2xtic
056E 90D8 BCF 0xfd8, 0, ACCESS
0570 343D RLCF 0x3d, W, ACCESS
0572 6A03 CLRF 0x3, ACCESS
0574 0F3E ADDLW 0x3e
0576 6EE9 MOVWF 0xfe9, ACCESS
0578 0E00 MOVLW 0
057A 2003 ADDWFC 0x3, W, ACCESS
057C 6EEA MOVWF 0xfea, ACCESS
057E CFEC MOVFF 0xfec, 0x6b
0582 52ED MOVF 0xfed, F, ACCESS
0584 CFEF MOVFF 0xfef, 0x6a
0588 6A6D CLRF 0x6d, ACCESS
058A 0E28 MOVLW 0x28
058C 6E6C MOVWF 0x6c, ACCESS
058E DF01 RCALL 0x392
0590 C001 MOVFF 0x1, 0xfef
0594 C002 MOVFF 0x2, 0xfec
Revisando las especificaciones la Instruccionconsume solo 1ciclo MULWF
;Por lo que escribi esto
int aux=50;
#asm
movf aux,0
MULWF 0x0a
#endasm
en el Disasembley list
78: #asm
79: movf aux,0
050E 5062 MOVF 0x62, W, ACCESS
80: MULWF 0x0a
0510 020A MULWF 0xa, ACCESS
81:
82: #endasm
No me da problemas de compilacion pero en el mplab no veo que multiplique , no hay ningun valor en el registro PRODH:PRODL
Alguno de ustedes ha tenido el mismo problema , o trabaja con estas intrucciones con el CCS
Revise el foro de CCS C pero no dan respues y parece que no funciona esa instruccion en el compilador >_<
Agradezco su ayuda
Adjunto imagen, como ven despues de ejecutar no hay ningun resultado , veo que W si carga bien el valor.Pero la multiplicacion no se hace >_<
(http://img143.imageshack.us/img143/6749/mulwf.jpg)
http://img143.imageshack.us/img143/6749/mulwf.jpg
-
Yo acabo de probar esto:
char Cte;
Cte=20;
#asm
MOVLW 0x0A;
MULWF Cte
MOVFF 0xFF3,Cte
#endasm
Y en CCS 4.093 funciona :?
-
al hacer MULWF 0x0a, estás multiplicando el registro W con lo que contiene el lugar de memoria 0x0a, no se que es lo que tienes guardado alli, lo más probable es que sea 0x00.
-
al hacer MULWF 0x0a, estás multiplicando el registro W con lo que contiene el lugar de memoria 0x0a, no se que es lo que tienes guardado alli, lo más probable es que sea 0x00.
No, por lo que se ve en el código, mueve aux a W, donde aux es 50, luego multiplica W*10.
En mi caso hice lo mismo que hacer Cte*=10 y funciono, lo comprobé en proteus que se me olvido mencionar.
Saludos!
-
:? :? :? :5] :5] :5]
Probaré nuevamente , Tengo la version 4.105
--------------------------------------------
para que ocupas esto : MOVFF 0xFF3,Cte
Con esa linea pasas PRODL a Cte ????
Todavia no obtengo nada de nada en PRODH:PRODL >_<
-
Gracias por su ayuda
Se ha resuelto el problema y de manera misteriosa >_<
No modifique nada ,se cerró MPLAB y CCS como 3 veces , luego se murio el MPLAB y ahora que probe nuevamente ha funcionado sin problemas. :5] :5] :5] :5]
Probe MULWF y MULLW
Las dos funcionaron correctamente
#asm
movlw 0xff
mullw 0xff
#endasm
Y probe la anterior y el ejemplo que pusiste Suky
Esto de MULWF y MULLW hay unos cuantos post en el foro de CCS con mismos problemas que no les funciona >_<
Muchas gracias!
-
:shock: Ese MPLAB :x :D
-
Me había quedado con la duda, y al final lo simulé.
al hacer
#asm
movlw 0xff
mullw 0xff
#endasm
la multiplicación la hace correctamente
Al hacer
#asm
movlw 0xff
mulwf 0x0a
#endasm
en este caso el producto da 0,
me fijo en el lugar de memoria 0x0a, y efectivamente tiene el valor 0,
lo que hice es cargarle 0xff en ese lugar de memoria y ahora si la multiplicación la hace correctamente.
cuando haces
char Cte;
Cte=20;
#asm
MOVLW 0x0A;
MULWF Cte
MOVFF 0xFF3,Cte
#endasm
lo que estás haciendo, creo yo, es decirle que multiplique lo que está en el registro W con lo que contiene el lugar de memoria apuntado por Cte, que en este ejemplo vale 20.
Espero se haya entendido lo que dije.
-
Asi es pablomanieri
Hice las 2 operaciones como lo comentas e igual cargaba valor en 0x0A , tambien ejecute MULLW , pero ya ven , eran problemas técnicos pues no cambie nada de nada.
Gracias!
Saludos!
-
ok, aunque no era ese el problema me había quedado con la duda de lo que hacía mulwf. Por eso lo simulé.