TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Maria33 en 07 de Julio de 2009, 15:01:41

Título: Operación MÓDULO en C18
Publicado por: Maria33 en 07 de Julio de 2009, 15:01:41
Hola! estoy intentando realizar la operación módulo con el compilador C18 pero no sé por qué motivo no sale el resultado esperado.
Lo que hago es lo siguiente:

int Result;
int a;
BYTE b;
Result = a%b;

Gracias
Título: Re: Operación MÓDULO en C18
Publicado por: migsantiago en 07 de Julio de 2009, 15:18:30
Si lo haces así entonces:

0/0 = indeterminado.

Inicializa las variables para que la operación funcione.
Título: Re: Operación MÓDULO en C18
Publicado por: Maria33 en 07 de Julio de 2009, 15:23:43
las variables tiene su valor, pero no lo he puesto. La variable b pertenece a un byte de un array de bytes y a es un int.
Título: Re: Operación MÓDULO en C18
Publicado por: Maria33 en 07 de Julio de 2009, 15:44:42
¿Puede ser que para usar la operación módulo "a%b" tenga que ser uno de los valores a o b una constate?
Título: Re: Operación MÓDULO en C18
Publicado por: migsantiago en 07 de Julio de 2009, 18:09:43
¿Cuál es el ejemplo que no funciona entonces?

La operación módulo funciona para cualquier cosa mientras las variables tengan valores calculables.
Título: Re: Operación MÓDULO en C18
Publicado por: Maria33 en 07 de Julio de 2009, 18:49:12
Si pongo lo siguiente si funciona:

int result;
bool ;
result = 15887%4
if(result ==3)
{
      enciendeLed1();
}
else
{
      enciendeLed2();

}

En este caso se comprueba que la operación módulo funciona correctamente porque se enciende el Led1.
Pero si pongo lo siguiente no funciona:

int result;
BYTE a = 4;
int b = 15887;
result = ((unsigned char)b) % a;
if(result ==3)
{
      enciendeLed1();
}
else
{
      enciendeLed2();

}
En este caso se enciende el Led2.
Título: Re: Operación MÓDULO en C18
Publicado por: migsantiago en 07 de Julio de 2009, 20:50:33
El casting que haces destruye el int (16bits pasan a ser 8 bits):
15887 = 0x3E0F

haciendo el casting se truncan bits hasta quedar 8 bits (tamaño de unsigned char):
0x0F

Luego entonces... 0x0F % 0x04 = 0x03

pero por alguna razón no sale 0x03. Le di varias revisadas pero no encuentro el problema con el casting u otra cosa. ¿Qué valor queda en result después de la operación?

(http://img30.imageshack.us/img30/1622/datatypes.jpg)

Prueba con esta instrucción si lo anterior no ayuda...

Código: [Seleccionar]
result = (int) b % a;
Título: Re: Operación MÓDULO en C18
Publicado por: doppel en 07 de Julio de 2009, 22:45:20

int result;
BYTE a = 4;
int b = 15887;
result = ((unsigned char)b) % a;
if(result ==3)
{
      enciendeLed1();
}
else
{
      enciendeLed2();

}
En este caso se enciende el Led2.

prueba de cambiar la declaracion de a por int
Título: Re: Operación MÓDULO en C18
Publicado por: MLO__ en 08 de Julio de 2009, 01:41:39
Estas con C18???

BYTE es una declaracion de CCS mas no de C18 segun se.

saludos
Título: Re: Operación MÓDULO en C18
Publicado por: Suky en 08 de Julio de 2009, 01:54:37
Estas con C18???

BYTE es una declaracion de CCS mas no de C18 segun se.

saludos
MLO_ Seguramente tiene definido:
#define BYTE unsigned char

Sino el compilador indica error. Creo yo que, con lo indicado por migsantiago  se tiene que solucionar.
Título: Re: Operación MÓDULO en C18
Publicado por: micro_cadaver en 08 de Julio de 2009, 11:11:14

int result;
BYTE a = 4;
int b = 15887;
result = ((unsigned char)b) % a;
if(result ==3)
{
      enciendeLed1();
}
else
{
      enciendeLed2();

}
En este caso se enciende el Led2.

prueba de cambiar la declaracion de a por int
opino lo mismo que che doppel