Usando el compilador pic32mx340F512H y XC32 y el depurador ICD3 en MPLAB.
Así que estoy trabajando en mostrar colores en una pantalla usando el protocolo VGA y, por lo tanto, necesito maximizar la velocidad del reloj. El estándar para un reloj de píxeles es de 25.175 Mhz, sin embargo, 20Mhz debería funcionar bien con algunos ajustes de tiempo.
Mi problema es: necesito una interrupción cada 1 / 20,000,000 segundos (20Mhz), PERO, he intentado todo (o todo lo que puedo pensar) pero no puedo obtener la velocidad suficiente.
(Máximo alrededor de 3 Mhz medidos en un pin con un multímetro y un while(1) {LATDbits.LATD1 ^= 1}
básico
Primero probé con casi todas las combinaciones, pero este "should" normalmente funciona (solo escribí las que importan):
#pragma config FPLLIDIV = DIV_2
#pragma config FPLLMUL = MUL_20
#pragma config FPLLODIV = DIV_1
#pragma config FNOSC = FRCPLL // Tried FRCPLL PRIPLL and multiple other possibilities
#pragma config FSOSCEN = ON
#pragma config IESO = OFF
#pragma config POSCMOD = HS // HighSpeed mode
#pragma config OSCIOFNC = ON
#pragma config FPBDIV = DIV_1 // Pb_Clock is Sys_Clock / 1
Y mis pruebas en donde con SYSTEMConfigPerformance(80000000)
, incluso busqué el código y me hice la función ya que en mi proyecto no puedo usar plib.h.
Se comporta exactamente como la función plib e incluso mejor, ya que SYSTEMConfigPerformance solo establece CHECON
a un valor submáximo.
También probé los registros de sombra, pero dado que incluso con una instrucción en el bucle principal while
, no puedo obtener la velocidad suficiente, no creo que el problema dependa de la interrupción o los módulos, pero en el sysclock no es rápido suficiente.
Para resumir: necesito una interrupción cada 1 / 20,000,000 de segundo y una velocidad de reloj adecuada, pero con muchos intentos y bastante investigación, no puedo acercarme a estos valores. Si alguien tiene una idea de cómo podría hacer que esto funcione, estaría muy contento y agradecido de escucharlo. Gracias :).