El cristal externo xmega no se estabiliza

Estoy usando un ATxmega64A3U, he conectado un cristal externo de 4MHz y dos tapas de carga de 18pF . Estoy usando el módulo ASF para la configuración del reloj, sin embargo, al iniciar puedo ver que el código cuelga en el siguiente lugar:

static inline void osc_wait_ready(uint8_t id)
{
    while (!osc_is_ready(id)) {
        /* Do nothing */
    }
}

Mientras tanto, espera a que la fuente del reloj se estabilice, pero eso nunca sucede. ¿Alguien tiene alguna sugerencia de por qué podría ser esto?

Suma

El código que publiqué anteriormente es del ASF, para asegurarme de que sé lo que estoy ejecutando, escribí el siguiente código y pude ver que el código se atasca en el ciclo while que espera que el oscilador se estabilice.

OSC_CTRL |= OSC_XOSCEN_bm;
while(!(OSC_STATUS & OSC_XOSCRDY_bm));
CCP = CCP_IOREG_gc;
CLK_CTRL = (CLK_CTRL & ~CLK_SCLKSEL_gm) | CLK_SCLKSEL_XOSC_gc;
OSC_CTRL &= ~OSC_RC2MEN_bm;

Habilito el oscilador externo, espero a que se estabilice, deshabilito el bloqueo en el registro, cambio al oscilador externo, deshabilito el oscilador interno de 2MHz.

¿Cómo llamas a la función? ¿Es "id" válido?
@KevinWhite Code es de ASF, debería estar bien. Agregué mi propio código a la pregunta original. Se queda atascado en el mismo lugar.
No es que sea realmente relevante, pero ¿no había algún tipo de modo de respaldo del oscilador RC interno en caso de que el cristal externo no se iniciara correctamente? Me pregunto si "simplemente se cuelga". Pero ha pasado mucho tiempo desde que usé eso.
@ Rev1.0 bueno, hay un respaldo de seguridad, sin embargo, debe habilitarlo en el registro XOSCFAIL. No hice.

Respuestas (3)

Tenga en cuenta que la capacidad de carga de 18pF de la hoja de datos no significa colocar dos condensadores de 18pF en la placa.

Es la capacitancia total que el cristal debería "ver". Suponiendo una capacitancia parásita de 5pF, tendría

CL = (18pF*18pF)/(36pF) + 5pF = 14pF

Es posible que desee probar algo como 24pF para los condensadores de carga.

Además, la ESR del cristal la eliges bastante alta. Esto puede convertirse en un problema si el circuito del oscilador no puede impulsar adecuadamente el cristal.

Los cristales de mayor frecuencia tienden a tener una ESR más baja, así que pruebe con un cristal de 8 o 16 MHz de esa serie.

De hecho, sé que ha agregado capacitancia de las pistas, sin embargo, estar un poco fuera de lugar debería afectar la frecuencia de operación. del oscilador no la estabilidad AFAIK. Sin embargo, dijiste algo que me perdí, el hecho de que una frecuencia más alta. ¡los cristales tienen una ESR más baja, lo que podría explicar por qué la placa está teniendo dificultades para manejar este! Creo que puedo desbloquear el xmega para suministrar más corriente al circuito y tal vez eso podría ayudar aquí. ¡Gracias!

Coloque la sonda del osciloscopio, aislada por un billete de un dólar (el grosor es de 3 milésimas de pulgada o 1/11 mm), contra el nodo de salida del oscilador (voltaje más grande pero distorsionado). Esto implementa una sonda de alcance divisor de voltaje, con poca C adicional en los capacitores XTAL+PI, por lo que cualquier amplitud debe permanecer sin cambios. La capacitancia a través del papel del billete es

C = mi 0 mi r A r mi a / D i s t a norte C mi
C = 9 10 12 2 ( C o t t o norte pag a pag mi r ) ( 1 metro metro 1 metro metro s C o pag mi t i pag a r mi a ) / 0.075 metro metro
C   2 10 11 0.013 = 0.26 pag F

Si su sonda de alcance, en modo 10X, es 13pF, tiene un divisor de 50:1.

Ponga el osciloscopio en 20 mV/división y su sensibilidad real es de 1 voltio/división. Con solo 0.26pF Cload en el oscilador.

Examine los dos pines XTAL. ¿Encontrar señales saludables de 1vpp, 2vpp, 3vpp? a 4.000MHz?

Por diversión, echa un vistazo a otros osciladores MCU, en busca de amplitud, pecado y distorsión.

Barkhausen nos da 2 requisitos para una oscilación exitosa:

(1) ganancia de tensión > 1

(2) EXACTAMENTE ------- exactamente ------- N*cambio de fase de 360 ​​grados.

Algunos osciladores de cristal solo alcanzan EXACTAMENTE N*360 grados, con algo de resistencia desde el pin Vout hasta el condensador PI_network. Prueba con 100_ohm o 1000_ohm.

¡Así que resultó ser un problema de software! Resultó que también es necesario establecer la cantidad de ciclos que el AVR espera para que el oscilador se estabilice. No configuré esto, lo que obviamente causó algún tipo de problema. Aquí está el código actualizado que espera 16k ciclos porque no necesito un despertar rápido y eso es alrededor de 4ms.

OSC_XOSCCTRL = ((OSC_XOSCCTRL & ~OSC_FRQRANGE_gm) | OSC_FRQRANGE_2TO9_gc) |
               ((OSC_XOSCCTRL & ~OSC_XOSCSEL_gm) | OSC_XOSCSEL3_bm | OSC_XOSCSEL1_bm | OSC_XOSCSEL0_bm);
OSC_CTRL |= OSC_XOSCEN_bm;
while(!(OSC_STATUS & OSC_XOSCRDY_bm));
CCP = CCP_IOREG_gc;
CLK_CTRL = (CLK_CTRL & ~CLK_SCLKSEL_gm) | CLK_SCLKSEL_XOSC_gc;
OSC_CTRL &= ~OSC_RC2MEN_bm;
Si está disponible, debe usar un osciloscopio para verificar el tiempo de inicio y la forma de onda de todos modos. Si se estabiliza solo después de, digamos, 15k ciclos, es posible que el "siguiente" cristal no funcione correctamente debido a características ligeramente diferentes.
@Rev1.0 Eso es cierto. Para la próxima compilación, usaré una frecuencia más alta. Xtal y dividirlo.