Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

11/05/2009 #1


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.
11/05/2009 #2

Avatar de Ardogan

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
11/05/2009 #3


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 monitorisabled & 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)
{}

}
12/05/2009 #4

Avatar de Ardogan

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
12/05/2009 #5


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?
12/05/2009 #6
Moderador

Avatar de Chico3001

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);
12/05/2009 #7

Avatar de Ardogan

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
12/05/2009 #8


Muchas gracias por su tiempo, lo voy a mirar, y claro que voy a compartir lo que observe.
12/05/2009 #9


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...
12/05/2009 #10
Moderador

Avatar de Chico3001

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..
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.