Alguien que me ayude con el siguiente "warning" de MPLAB C30?

mcomparator.c: In function 'main':
mcomparator.c:27: warning: control reaches end of non-void function


Ha y otra cosita, estoy probando un ejemplo de configuración de osciladores, pero no entiendo para qué la siguiente línea:

/ Wait for Clock switch to occur
while (OSCCONbits.COSC != 0b011)
{}

Agradezco toda ayuda y comentario.
 
mcomparator.c:27: warning: control reaches end of non-void function

Ese error salta cuando definís una función que tiene que devolver un valor, y no devolvés nada (no hay un return valor al final de la función).

Es decir, seguro tenes algo del estilo

int Funcion(parametros){
bla;
bla;
bla;
}

cuando deberías tener:

int Funcion(parametros){
bla;
bla;
bla;
return valor; //esto tiene que estar sí o sí si la función no es void-> void Funcion(parametros){---}
}

/ Wait for Clock switch to occur
while (OSCCONbits.COSC != 0b011)
{}

Aca da la impresión de que estás trabajando con dos o más fuentes de oscilador distintas (puede ser interno, externo, de baja potencia...) entonces es algo que se ejecuta mientras la fuente de oscilador no sea 0b011. Ese 0b011 tendrá su significado de acuerdo al pic de que se trate, como no incluiste esa información no se a cual fuente de oscilador se traduce el 0b011.
Si el while está vacío, no va a hacer nada (no se ejecuta ninguna instrucción) hasta que se produzca un cambio de fuente de oscilador.

Saludos
 
Muchas gracias por su tiempo, lo que pasa es que estoy aprendiendo a manejar el dsPIC y estoy haciendo apenas la configuración del oscilador el código es el siguiente:

#include "p33FJ64GP802.h"


_FOSCSEL(FNOSC_PRIPLL & IESO_ON); // Primary oscillator (XT, HS, EC) w/ PLL, Two-speed Oscillator Startup : Enabled

_FOSC(FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMD_XT); // Clock switching and clock monitor:Disabled & OSC2 is clock O/P & XT oscillator

_FWDT(FWDTEN_OFF); // Turn off Watchdog Timer



int main(void)
{
// Configure PLL prescaler, PLL postscaler, PLL divisor for XT 10MHz for 40MIPS
PLLFBD=30; // M=32
CLKDIVbits.PLLPOST=0; // N1=2
CLKDIVbits.PLLPRE=0; // N2=2
CLKDIVbits.DOZEN=0; // Processor clock and peripheral clock ratio forced to 1:1

// Initiate Clock Switch to Primary Oscillator with PLL (NOSC=0b011)
// Wait for Clock switch to occur
while (OSCCONbits.COSC != 0b011)
{}

}
 
Guau, lindo microcontrolador eh?.

El tema de los osciladores al parecer es porque al arrancar el micro, pasa un cierto tiempo hasta que el oscilador externo (el principal) se estabiliza. A mayor frecuencia más tiempo tarda en estar estable.
Entonces lo que se hace es arrancar con un oscilador de menor velocidad (el RC interno está estable prácticamente ni bien se energiza el pic) y darle tiempo al oscilador de alta velocidad a que se estabilice.

Fuente: Section 07. Oscillator - dsPIC33F FRM, sección 7.12 y 7.11

Saludos
 
Muchas gracias por su tiempo, pero siempre hay que hacer esa conmutación de osciladores? o se puede comenzar de una vez con el oscilador primario? qué efectos puede tener?
 
Tambien puede deberse a que el compilador esta buscando un loop infinito al final de main() como medida de seguridad para que no se desborde el programa

intenta añadiendo esta funcion justo al final de main()

while (1);
 
Muchas gracias por su tiempo, pero siempre hay que hacer esa conmutación de osciladores? o se puede comenzar de una vez con el oscilador primario? qué efectos puede tener?

Al parecer no usar la característica "two speed oscillator start-up" solo hace que tengas que esperar un tiempo mayor al arrancar el micro (algunos milisegundos según dice acá).

No puedo decir más en este punto porque no experimenté con eso para ver como funciona. Eso te lo vamos a dejar a vos stai para que nos cuentes .

Saludos
 
Muchas gracias por su tiempo, lo hice y me quito el warning. Pero me queda la duda, pues no sabía que tocaba hacer eso, sera por qué mi programa no tenía ningún while?

Muchas gracias...
 
No.... casi todos los compiladores de C para microcontroladores piden un loop infinito al final del programa como medida de seguridad para evitar que el micro se siga de largo por si hay algun error... este loop se puede hacer de 2 maneras while(1); o for(;;); en lo personal me gusta mas el while por que es un poco mas entendible..
 
Atrás
Arriba