obteniendo la frecuencia correcta en XMEGA

1

He escrito un pequeño programa que se ejecuta en un XMEGA:

    #include <avr/io.h>
    #include <stdio.h>

    #ifndef F_CPU
    #define F_CPU 32000000UL
    #endif
    void system_clock_init(void){
        CCP = CCP_IOREG_gc;  /* allow changing CLK.CTRL */
        OSC.CTRL = OSC_RC32MEN_bm; /* Enabling the 32MHz RC oscillator */
        while (!(OSC.STATUS & OSC_RC32MRDY_bm)); /* wait for ready */
        CCP = CCP_IOREG_gc;/* allow changing CLK.CTRL */
        CLK.CTRL = CLK_SCLKSEL_RC32M_gc ;/* system clock is internal 32MHz RC */

    }

  int main (void)
    {
        // Insert system clock initialization code here (sysclk_init()).
       system_clock_init();
       PORTR.DIR = 0x02;

     while(1) {

        PORTR.OUTTGL = PIN1_bm;
    }
  }

el programa debería encender un LED, pero cuando uso el alcance, mido una señal de 2 ms, lo que significa que el reloj de la unidad es: 1 MHz? ¿Qué me sorprende porque creo que el programa es correcto?

y la idea de lo que me estoy perdiendo aquí?

    
pregunta Engine

2 respuestas

1

Verifique el código de ensamblaje generado; cuando habilita los cambios en el sistema de reloj, tiene un total de 4 ciclos de CPU para realizar las escrituras necesarias (consulte la guía del usuario de su dispositivo XMEGA en particular). En mi experiencia personal, he visto que el compilador, sin ninguna optimización, producirá un código que requiere más de 4 CPU para hacer que el sistema de escritura del reloj registre. Intente habilitar las optimizaciones en el código o realice los cambios en el sistema de reloj utilizando el ensamblaje en línea.

    
respondido por el Kvegaoro
0

Bueno, veo un par de posibles problemas aquí. La primera es que puede estar apagando el oscilador interno de 2 MHz. Debes usar | = en lugar de solo = cuando habilitas eso. El chip puede estar retrocediendo en un oscilador interno de 32 kHz como resultado. Puede que este no sea el problema, pero eso es lo que uso en mi código de inicio 'estándar' xmega ( enlace ).

El otro problema posible es que su código de inicio realmente funciona bien, pero el código de medición de frecuencia no funciona de la manera que espera. Es posible que el bucle tome varios ciclos de reloj para ejecutarse y esto está eliminando sus mediciones. Lo que recomendaría es usar las funciones _delay_ms o _delay_us para hacer un retraso mucho mayor, por ejemplo, 500 ms, por lo que es muy obvio de qué fuente de reloj se está ejecutando. Con esta configuración, intente comentar el cambio de 32 MHz y ver si la frecuencia de parpadeo cambia.

    
respondido por el alex.forencich

Lea otras preguntas en las etiquetas