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?
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.
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.
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
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;
kevin blanco
usuario34920
Rdo
usuario34920