Estos #pragma configs
configuran las configuraciones que viven en su propia sección de memoria flash que está fuera de su código de programa. Están disponibles tan pronto como el PIC obtiene energía, independientemente de dónde estén escritas en su código. Esto es importante porque a veces se necesitan antes de ejecutar el programa.
Por ejemplo, hay configuraciones para seleccionar una fuente de reloj y convertirla al reloj real de su PIC. Esto no se puede hacer en su código de programa porque el reloj debe configurarse correctamente antes de que su código pueda ejecutarse.
Otro ejemplo es la configuración de protección de código. Si está habilitado, no es posible leer la memoria del programa del PIC con un programador. Esto desalienta a otros a copiar la memoria del programa y aplicar ingeniería inversa a su código. Esto no se puede hacer con el código del programa porque es posible poner su PIC en el modo de programación antes de que se ejecute el código del programa, evitando todo lo que permita la protección del código. De esta manera, #pragma config
s es esencial porque permite que las configuraciones se establezcan antes de que se ejecute su código.
No todos los ajustes establecidos por #pragma config
s son necesarios antes de que se ejecute su código. Algunas son sólo conveniencias. Por ejemplo, es posible usar #pragma config
s para configurar los pines como entrada analógica digital de entrada / salida o al inicio. Esto podría hacerse fácilmente en el código de su programa.
Entonces, ¿por qué esta configuración se establece con #pragma config
s? ¿No son todavía el código C? Lo son, pero son especiales. Son una directiva de compilación. (Las directivas de compilación comienzan con un #
). Las directivas de compilación son algunas de las primeras cosas que maneja su compilador. ¿Sabes #include foo
, que le indica al compilador que pegue el archivo foo aquí? El compilador interpreta todos los #pragma configs
al mismo tiempo, antes de que incluso vea su otro código C. Esto le da al compilador la oportunidad de asegurarse de que su #pragma config
s se escribirá en las ubicaciones apropiadas, separadas del código de su programa.
Acerca de cómo saber qué configuraciones se deben establecer:
Como ahora sabes que existen tales configuraciones, lee la lista de configuraciones, para que tengas una idea de para qué sirven. No es necesario que los conozca, solo necesita saber que una tarea en la que está trabajando puede verse afectada por ellos.
EDITAR: explicación de tus configuraciones
Las configuraciones que enumera en su pregunta están completamente relacionadas con el reloj. Para comprender, debe comprender cómo funciona la generación y distribución del reloj. Consulte la página 3 de este documento que muestra un gráfico al respecto.
#pragma config FNOSC = PRIPLL //Primary Osc w/PLL (XT+,HS+,EC+PLL)
Esto selecciona el oscilador primario como fuente del reloj, y se utilizará el PLL para convertir más el reloj. También puede haber elegido NO utilizar el PLL. O otra fuente como el oscilador secundario, un oscilador interno, etc.
#pragma config POSCMOD = HS //HS osc mode
Aquí, seleccionas lo que está conectado a los pines del oscilador primario. por lo general, puede conectar la señal de limpieza de un módulo de oscilador (EC), o conectar un resonador de cristal por debajo de 4MHz (XT) o superior (HS). Tenga en cuenta que los resonadores necesitan algún circuito adicional, que es proporcionado (y seleccionado) por esta configuración.
#pragma config FPLLIDIV = DIV_2 //PLL Input Divider 2x Divider
#pragma config FPLLMUL = MUL_18 //PLL Multiplier 18x Multiplier
Ahora, tiene su reloj inicial, pero por lo general, desea que el PIC se ejecute con una frecuencia diferente. El PLL permite multiplicar su frecuencia de reloj por un cierto factor, pero solo acepta una frecuencia de entrada limitada (4-5MHz en este documento). Entonces, divide la frecuencia por 2 antes de pasarla al PLL (¿entonces tienes un cristal de 8-10MHz?) Y permites que el PLL multiplique la frecuencia por 18 (lo que da como resultado 4Mhz * 18 = 72Mhz?).
#pragma config FPLLODIV = DIV_1 //System PLL Output Clock Divider: PLL
Divide entre 1
La frecuencia de salida del PLL se puede dividir de nuevo para obtener frecuencias más bajas o intermedias. Pero aquí, no lo divides (= divídelo entre 1).
Entonces, obtienes la frecuencia final con la que se ejecuta tu PIC. Todo esto parece un poco extraño, pero permite muchas opciones de entrada y frecuencias del sistema.
La frecuencia final se utiliza como reloj del sistema.
Todo esto parece un poco extraño, pero permite ejecutar el PIC en muchas frecuencias diferentes.
#pragma config FPBDIV = DIV_1 //Peripheral Clock Divisor: Pb_Clk is Sys_Clk/2
El reloj del sistema se divide una vez más para obtener la frecuencia de reloj de los periféricos como I²C / UART / ...
No sé por qué el comentario dice división por 2 mientras que el código dice división por 1 ...
Mi hoja de datos también muestra un reloj de referencia con SPI, pero también observa que no todos los PIC tienen esta función.
Finalmente, eche un vistazo a la sección de osciladores de su PIC real sobre qué configuraciones están disponibles.