Autor Tema: +problemas compilador!!  (Leído 2886 veces)

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

25javier

  • Visitante
+problemas compilador!!
« en: 21 de Marzo de 2006, 10:15:00 »
Hoy me encuentro con una simple multiplicacion anda mal en 16f628 y 16f648 y el mismo programa grabado en 18f452 anda bien...me da como resultado 208 en vez de 2000 en los pic chicos...ya me estoy desesperando..no sera la version del compilador que uso??es el 3.227 ,alguien tubo lo mismos problemas?
gracias por adelantado
javier

#include "16f628A.h"
#fuses INTRC_IO,NOLVP,NOWDT,NOPROTECT,NOCPD,NOMCLR
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_A7, rcv=PIN_A0)
#DEFINE LED1 PIN_B3
#DEFINE LED2 PIN_B0


void main() {
int registros;
long valor;
registros=40;
valor=registros * 50 ;
printf("valor %lu
", valor);   //en pic 18f452 da 2000,en 16f648 y16f628 da 208!!
delay_ms(3000);
sleep();

           }  

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: +problemas compilador!!
« Respuesta #1 en: 21 de Marzo de 2006, 14:04:00 »
Escrito originalmente por 25javier
Hoy me encuentro con una simple multiplicacion anda mal en 16f628 y 16f648 y el mismo programa grabado en 18f452 anda bien...me da como resultado 208 en vez de 2000 en los pic chicos...ya me estoy desesperando..no sera la version del compilador que uso??es el 3.227 ,alguien tubo lo mismos problemas?
gracias por adelantado
javier

#include "16f628A.h"
#fuses INTRC_IO,NOLVP,NOWDT,NOPROTECT,NOCPD,NOMCLR
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_A7, rcv=PIN_A0)
#DEFINE LED1 PIN_B3
#DEFINE LED2 PIN_B0


void main() {
int registros;
long valor;
registros=40;
valor=registros * 50 ;
printf("valor %lu
", valor);   //en pic 18f452 da 2000,en 16f648 y16f628 da 208!!
delay_ms(3000);
sleep();

           }  


Te está truncando el valor.  

Fijate lo siguiente:

2000 = 11111010000
   208 = 11010000

Notas que la parte inferior es exactamente igual?

No uso el CCS pero fijate si es algo al respecto.
Tal vez "long valor" no sea una variable de 16 bits o bien %lu solo tome 1 byte cuando se usan en micros de 14 bits.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado EARC

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 35
RE: +problemas compilador!!
« Respuesta #2 en: 21 de Marzo de 2006, 14:06:00 »
A mi mepaso lo mismo una vez y lo solucione declarando las 2 varibles del mismo tipo, es decir, declara las 2 como long (registros y valor)

25javier

  • Visitante
RE: +problemas compilador!!
« Respuesta #3 en: 21 de Marzo de 2006, 19:54:00 »
Si EARC!!probe declarando las dos como long y andubo,debo reconocer que me defrauda bastante el compilador,yo le tenia mas fe,tenia entendido que era usado a nivel profesional,pero veo que si falla en una simple multiplicacion..y hay que empezar a hacer malabarismos para que salga andando...no se..estoy teniendo un dolor de cabeza barbaro tambien con kbhit() y fgetc() y no se como solucionarlo...ya postee el problema...no se que pensar...yo programe en assembler,me pase al picbasic(problemas como estos cientos) y pense que con CCS se iva a terminar pero veo que nada que ver...alguien ha tenido una experiencia parecida con kbhit() y fgetc()?(kbhit detecta el dato y fgetc no recibe nada)
Saludos y gracias
Javier

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: +problemas compilador!!
« Respuesta #4 en: 22 de Marzo de 2006, 09:36:00 »
Javier, desde mi humilde criterio, no creo que ese "error" sea culpa del CCS. Es más, no considero que sea un error, sino un funcionamiento normal de las conversiones de tipos.
Mira lo que dice la ayuda de CCS respecto a las operaciones matemáticas con números de distinto tipo:

The result is then the same as the operands.  Each operator in an expression is evaluated independently.  For example:

 

i32 = i16 - (i8 + i8)

 

The + operator is 8 bit, the result is converted to 16 bit after the addition and the - is 16 bit, that result is converted to 32 bit and the assignment is done.  Note that if i8 is 200 and i16 is 400 then the result in i32 is 256.  (200 plus 200 is 144 with a 8 bit +)

 

Explicit conversion may be done at any point with (type) inserted before the expression to be converted.  For example in the above the perhaps desired effect may be achieved by doing:

 

i32 = i16 - ((long)i8 + i8)

 

In this case the first i8 is converted to 16 bit, then the add is a 16 bit add and the second i8 is forced to 16 bit.

 

A common C programming error is to do something like:

 

i16 = i8 * 100;

 

When the intent was:

i16 = (long) i8 * 100;


Para que tu programa funcionase bien sin necesidad de declarar de tipo LONG todas tus variables, podrías haber incluido conversiones implícitas de tipo en tu fórmula, tal que así:

valor=(long)registros * 50;

25javier

  • Visitante
RE: +problemas compilador!!
« Respuesta #5 en: 22 de Marzo de 2006, 15:29:00 »
Tenes razon nocturno,yo tengo una version del manual en castellano donde no tenia toda esa explicacion,lo que me mareo mas y todavia no entiendo es como funciona el mismo codigo en el 18f452....
Estoy leyendo una explicacion que hay sobre el uso de kbhit()para cuando rs232 es usado por software(la explicacion tampoco esta en el manual en castellano!!)
se ve que lo que me pasa de perder el dato tampoco es un problema del compilador..dice:
If the RS232 is under software control this function returns TRUE if the start bit of a character is being sent on the RS232 RCV pin.
Note that in the case of software RS232 this function should be called at least 10 times the bit rate to ensure incoming data is not lost.
No estoy seguro de entender esto..la funcion debe ser llamada por lo menos 10 veces la tasa de datos para asegurar que el dato no se pierde..pero..si yo llamo a esta funcion para ver si el dato llego..(?)..esta hablando del tiempo entre esta funcion y el fgetc??
graciasss a todoss!
Saludos
Javier