En primer lugar disculparme por responder tan tarde, no pude antes.
También decir que el pic que utilizo aquí es el 18F2520, me confundí con otro que también utilizo.
El proyecto en el que estoy trabajando trata sobre una red inalámbrica de sensores.
En esta red exite un dispositivo maestro y hasta 31 esclavos, es decir un total de 32 nodos.
La función en concreto se encarga de comprobar qué esclavos se encuentran en el área de cobertura de la red.
Para ello envía un mensaje de comprobación uno a uno, esto lo hace la rutina recibir_actividad, la que devuelve un 1 si el esclavo está activo y un 0 si no lo está.
El progreso de la comprobación lo muestro en una línea de un LCD de 2x16, mostrando cada dos comprobaciones el caracter 0xFF, al estilo de las barras que te muestran el progreso de instalación de un programa.
Finalmente devuelve un entero de 32 bits en el cual están a cero los bits correspondientes a las direcciones inactivas y a uno las que estan activas.
Este es mi código:
int32 comprobar_esclavos( int origen )
{
int32 esclavos = 0;
int destino, i;
destino = origen & 0xE0; // Se prepara la primera dirección a comprobar, conservando los bits de red (los 3 msb)
for( i = 0 ; i < 32 ; i++ ) // Se comprueba la actividad de los esclavos uno a uno, poniendo a 1 el bit
{ // correspondiente de "esclavos", indicando así su actividad.
if( destino != origen )
{
if( recibir_actividad( destino, origen ) )
bit_set( esclavos , i );
}
else
bit_set( esclavos , i );
if( i%2 ) // Sirve para mostrar en el lcd el progreso del test cada 2 comprobaciones (nums impares)
lcd_putc( 0xFF );
destino++;
}
return( esclavos );
}
El problema me ocurre cuando la dirección origen es 0x00, la dirección destino tomaba el valor 0x00 cada 2 comprobaciones, así que me quedaba la variable esclavos=0b10101010101010101010101010101010
Poniendo cualquier otra dirección origen, como 0x3F, ya no me ocurre.
Despues de hacer muuuchas pruebas, conseguí evitar esto simplemente borrando la línea:
if( i%2 )
lcd_putc( 0xFF );
En teoría no debería influir en nada, pero así sí que funciona
Ahora en vez de mostrar una barra de progreso, muestro el porcentaje del proceso, así:
n = i * 3.15;
printf( lcd_putc, "\n %02u%%", n );
Esto lo hago declarando n=0 al principio de la función, claro está.
Eso es todo, muchas gracias a todos los que me habeis intentado ayudar.
Ojalá este post le sirva a la gente para aclarar sus dudas acerca de las características de las variables.
De todos modos agradecería si alguien pudiera explicarme cual es la finalidad de la directiva #separate, no lo que hace, sino para que nos sirve.
De nuevo gracias a todos.
Un saludo