Autor Tema: problemas con MULTIPLICACIONES EN CCS-- PIC18F452  (Leído 1989 veces)

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

Desconectado e-l-e-n

  • PIC10
  • *
  • Mensajes: 10
problemas con MULTIPLICACIONES EN CCS-- PIC18F452
« en: 02 de Agosto de 2011, 04:26:25 »
Hola, estoy realizando un programa que calcula medias ponderadas y saca el resultado por los puertos B y D y he topado con un problema. No me calcula bien las medias, y he podido constatar que es por culpa de las multiplicaciones. Asi que he creado un codigo muy simple para hacer pruebas con multiplicaciones que es este:

#define compiler __PCWH__

#include "18F452.h"
#include "stdlib.h"

#fuses HS,NOWDT,NOPROTECT,NOLVP// fusibles deben activarse en el dispositivo cuando se programa. Watchdog desactivado por hardware
#use delay(clock=20000000) // frecuencia del procesador 4 Mhz


void main() //programa que prueba si va el micro

{


long valor0=20;
long cnt=2;
long valor1=0;


#DEFINE PORTA=0xF80;
#DEFINE PORTB=0xF81;
#DEFINE PORTD=0xF83;


setup_WDT(WDT_OFF); //desactivo el watchdog tb por software



set_tris_b(0x00); // puerto B salidas

set_tris_d(0x00); // puerto D salidas

//inicializo los puertos de salida a 0

output_B(0x00); //inicializo los puertos de salida a 0
output_D(0x00);


valor1=valor0*cnt;//multiplico las variables cnt y valor 0 y saco el resultado del producto por los puertos B y D

output_B(valor1>>8);//saco por el puerto B el valor
output_D(valor1&0xFF);//saco por el puerto D el valor


}


Cuando lo simulo me da bien el resultado, sin embargo cuando lo pruebo me da el resultado 0x4000 independientemente de los valores que multiplique (he probado cambiando a varios valores) No puede ser problema de la placa en la que lo pruebo ya que la he utilizado para probar las salidas, y los resultados de varias operaciones sin ningún problema. Así que algo me esta fallando en la multiplicación ¿Alguna idea? Había pensado en alguna libreria que me faltase pero no parece que sea necesario incluir ninguna más de las que tengo

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: problemas con MULTIPLICACIONES EN CCS-- PIC18F452
« Respuesta #1 en: 02 de Agosto de 2011, 04:49:29 »
Mirando asi aunque no se mucho de C, de cualquier C...

Valor1 es un long , el cual es de 16 bits ( 2^16 ) por mas q le hagas un shift de 8 lugares sigue siendo uno de 16 bits.. y utilizas output_X(value) donde value es un byte,, al otro le haces una AND..

Porbaste haciendo algo asi ?

(valor1 >> 8 )&0xFF

algo asi?..

Es todo lo que se me ocurre :S, sino esperaremos a alguien que sepa mas que yo ^^. De todas formas me parece muy raro que tengas que hacer shift para sacar un resultado asi,, ya que los registros son de 8 bits xD.

Estuve viendo el manual un poco de CCS y vi una funcion llamada make8(var,offset). En el cual, lo que hace exactamente es esto:

Código: [Seleccionar]
Extracts the byte at offset from var. Same as: i8 = (((var >> (offset*8)) & 0xff) except it is done with a single byte move.
O sea lo que te dije yo xD.. Lo que acierta en cierto punto lo que digo, abajo terminas usando una value de 8bits y arriba o seal Output_B uno de 16 bits..
« Última modificación: 02 de Agosto de 2011, 05:01:09 por KILLERJC »

Desconectado e-l-e-n

  • PIC10
  • *
  • Mensajes: 10
Re: problemas con MULTIPLICACIONES EN CCS-- PIC18F452
« Respuesta #2 en: 02 de Agosto de 2011, 07:17:50 »
Si, lo que hago en las dos últimas líneas de código es sacar un long por puertos B y D. no podía sacarlo por un sólo puerto porque al ser de 16 bits se truncaba, por eso utilizo dos.  el poner >> y despues un 8 hace que saco los 8 primeros bits por el puerto B y la isntruccion output_D(valor0&0xFF) saca los 8 menos significativos por el puerto D.
De todos modos he probado el mismo codigo en otro proyecto de mplab y si que me hace las multiplicaciones de modo coherente, asi que empiezo a pensar que se me habia corrompido el file, no se.
Muchas gracias por la sugerencia!!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: problemas con MULTIPLICACIONES EN CCS-- PIC18F452
« Respuesta #3 en: 02 de Agosto de 2011, 16:04:09 »
Es que no se como se maneja el comiplador,, por que para hacer una variable byte le hace esa AND con el 0xFF , y como te dije el solo hacerle shift seguis teniendo una variable long, mientras q el comando especifica que sea un byte.. pero como dije no se como actua por dentro el compilador...

De todas formas es algo asi seria el codigo en ASM , si queres probarlo con el #ASM y #ENDASM , creo q eran asi xD jejej.. nada seguro lo mio :S

8x8
Código: [Seleccionar]
MOVF Cnt, W ;
MULWF Valor0 ; Cnt * Valor0 -> PRODH:PRODL

Aunque sorprendentemente recien veo el set de instrucciones de los 18F y tiene una funcion multiplicar :O ,, y encima te da lo codigos para multiplicar 8x8 16x16 sea U*U o S*S . jeje muy buena xD mira lo que veo recien xD jeje

Y para mover lso datos a los puertos:

Código: [Seleccionar]
movff PRODH,LATB
movff PRODL,LATD

« Última modificación: 02 de Agosto de 2011, 16:16:47 por KILLERJC »


 

anything