xmega cristal externo no se estabiliza

1

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

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

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

Adición

El código que he publicado arriba es de la ASF, para asegurarme de saber qué estoy ejecutando, escribí el siguiente código y pude ver que el código se atasca en el bucle while que espera a 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 que se estabilice, deshabilite el bloqueo en el registro, cambio al oscilador externo, deshabilite el oscilador interno de 2MHz.

    
pregunta user34920

3 respuestas

0

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

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;
    
respondido por el user34920
1

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

Es la capacitancia total que el cristal debe "ver". Suponiendo una capacitancia perdida de 5pF, tendrías

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

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

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

El cristal de mayor frecuencia tiende a tener un ESR más bajo, así que prueba un cristal con 8 o 16MHz de esa serie.

    
respondido por el Rev1.0
0

Coloque la sonda de alcance, aislada por un billete de dólar (el grosor es de 3 mils, o 1/11 mm), contra el nodo de salida del oscilador (el voltaje más grande pero distorsionado). Esto implementa una sonda de alcance de divisor de voltaje, con poca C adicional en los capacitores XTAL + PI, por lo que cualquier amplitud no debe modificarse. La capacitancia a través del papel de la factura es $$ C = E0 * Er * Área / Distancia $$ $$ C = 9 * 10 ^ -12 * 2 (papel de algodón) * (área de punta de alcance de 1mm * 1mm) /0.075mm$$ $$ C ~ 2 * 10 ^ -11 * 0.013 = 0.26pF $$

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

Ponga el alcance en 20mV / división, y su sensibilidad real es 1volt / división. Con solo 0.26pF de carga en el oscilador.

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

Para divertirse, echa un vistazo a otros osciladores de MCU, ¿para ver la amplitud y el pecado y la distorsión?

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

(1) ganancia de voltaje > 1

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

Algunos osciladores de cristal solo logran EXACTAMENTE N * 360 grados, con cierta resistencia del pin Vout al capacitor de red de red. Prueba con 100_ohm o 1,000_ohm.

    
respondido por el analogsystemsrf

Lea otras preguntas en las etiquetas