Pic32MX El reloj es demasiado lento

0

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 :).

    
pregunta Ronàn Choquert

2 respuestas

1

ya que la pic32mx340F512H se ejecuta a una velocidad de reloj de 80 MHz como máximo, eso significa que solo tiene cuatro ciclos de instrucción para que la CPU interrumpa el flujo del programa, salte al controlador de interrupciones, lo ejecute y vuelva al flujo del programa. Eso simplemente no funcionará. Sin mencionar el hecho de que me pregunto qué haría con los cuatro ciclos que tiene en cada interrupción si no hubiera sobrecarga y latencia de interrupción.

Su aplicación definitivamente no debe ser activada por interrupciones, sino simplemente como un bucle que hace algo útil en 3 ciclos de CPU y vuelve al principio en 1. No estoy seguro si el núcleo PIC32 tiene un salto de un solo ciclo instrucciones en absoluto, lo que hace que sea aún más improbable que funcione, incluso en casos perfectos y sin gastos generales

    
respondido por el Marcus Müller
0

Como la otra respuesta sugiere que estás pidiendo mucho por la velocidad de reloj del mcu. Aunque puedes probar un par de cosas.

Primero, use las instrucciones atómicas en lugar de la lectura-modificación-escritura que está haciendo para cambiar el pin:

LATDINV = (1 < < 1); // invertir d1 en una sola instrucción

También puede intentar configurar uno de los módulos spi en modo enmarcado y usar esa salida de reloj, que debe ser continua y puede funcionar para su aplicación. O prueba un módulo pwm.

    
respondido por el justing

Lea otras preguntas en las etiquetas