Mantén la atención ya que en este artículo encontrarás la contestación que buscas.
Solución:
Lo que no dice es cuál es la precisión de este oscilador interno. Me tomó un tiempo encontrarlo en la hoja de datos, en la página 369.
10%. ¡Diez porciento! ¿Y eso para un oscilador calibrado? esto es horrible No es irrazonable esperar un error tan bajo como 1% para esto. Microchip/Atmel proporciona un documento para calibrar el oscilador usted mismo con una precisión del 1%.
I2C es un sincrónico protocolo, y la precisión de tiempo no es relevante siempre que se respeten los tiempos de pulso mínimo y máximo.
UART por otro lado es asincrónico, y entonces la precisión del tiempo es realmente importante. La mayoría de los UART permiten un error de medio bit en el último bit (el bit de parada), por lo que es un 5 % para una transmisión de 10 bits.
El oscilador calibrado de fábrica no funcionará aquí. Tendrá que pasar por el procedimiento de calibración para llegar al 1%. En ese caso puedes usar el oscilador interno. De lo contrario, tendrás que usar un cristal.
Como está utilizando un UART, sería recomendable un oscilador de cristal. Si no fuera por eso, podrías usar el oscilador interno. Algunas MCU tienen osciladores internos recortados de fábrica, que pueden ser adecuados para la operación UART.
“No sensible al tiempo”. UART es muy sensible al tiempo. Obtendrá basura completa si no está sincronizado adecuadamente.
Opción 1: Usa un cristal normal. Cambie el fusible de selección de reloj de forma adecuada. La selección de cristal depende de qué baudios desea usar / qué tan rápido desea que vaya. Hay “cristales mágicos” que le darán un error del 0% para las tasas estándar (si se fabrican perfectamente). Ver las tablas en la Sección 20 [USART0] para obtener más información (ha leído la hoja de datos…. ¿¿verdad???) :).
Opción 2: puede calibrar el oscilador interno con un cristal de 32 khz si le preocupa la potencia. Con 32khz puede obtener corrientes de uA en modo de suspensión (las he reducido a ~ 2uA). Sin embargo, debe configurar una rutina de calibración que implique iniciar / detener los temporizadores y alternar el temporizador 2 al modo asíncrono.
El código 328P puede diferir… esta función actualmente funciona en 48/88 (con las definiciones de F_CPU/baud apropiadas. Es un poco feo/no está refactorizado por completo, pero he aprendido que es mejor no jugar con cosas que funcionan cuando estás en una fecha límite. Busque en el foro de AVRFreaks “tune 32khz crystal” algo así. Esto es solo una muestra de lo que se estará metiendo… No necesariamente lo que va a funcionar.
char OSCCAL_calibration(char starting_cal, int cal_value) (1<
Aquí tienes las comentarios y puntuaciones
Nos puedes confirmar nuestra faena dejando un comentario o dejando una puntuación te estamos agradecidos.