Error generando un retardo de 1 seg usando temporizadores en PIC32

3

Tengo un PIC32MX795F512l y como XC32 no proporciona una función de retardo incorporada, estoy usando Timer1 para generar un retardo de 1 segundo, pero hay un problema porque genera más de un retardo de 1 segundo. ¿Alguien puede ayudar a obtener un retraso de 1 segundo en PIC32?

CÓDIGO:

#define SYSTEM_FREQUENCY        72000000L
void Delayms(unsigned t)
{
    OpenTimer1(T1_ON | T1_PS_1_256, 0xFFFF);
    while(t--)
    {
        WriteTimer1(0);
        while(ReadTimer1() < SYSTEM_FREQUENCY/256/1000);
    }
    CloseTimer1();
}

y usándolo en while (1)

int main()
{
 SYSTEMConfigPerformance(SYSTEM_FREQUENCY);
while(1)
  {
    PORTDbits.RD0 = 1;
    Delayms(1000);
    PORTDbits.RD0 = 0;
    Delayms(1000);

  }
 }
    
pregunta Aircraft

4 respuestas

3

Finalmente diseñé una lógica usando temporizadores que me está demorando 1 ms:

#define FCY 72000000L
#define FPB 36000000L
#pragma config POSCMOD=XT, FNOSC=PRIPLL
#pragma config FPLLIDIV=DIV_2, FPLLMUL=MUL_18, FPLLODIV=DIV_1
#pragma config FPBDIV=DIV_2, FWDTEN=OFF, CP=OFF, BWP=OFF

void Delayms( unsigned t)
{
   T1CON = 0x8000; 
   while (t--)
   { 
      TMR1 = 0;
       while (TMR1 < FPB/1000);
   }
}
    
respondido por el Aircraft
1

No estoy familiarizado con los dispositivos PIC32 y la biblioteca provista por el microchip, pero por lo que leí en guía de la biblioteca de periféricos la llamada a SYSTEMConfigPerformance(SYSTEM_FREQUENCY); no establece los relojes reales a 72MHz, sino que simplemente selecciona todas las demás funciones importantes para brindar un rendimiento máximo de 72MHz (por ejemplo, estados de espera, cachés, divisor previo del reloj periférico ).

Entonces, en su código, la MCU se ejecutará con los ajustes de restablecimiento predeterminados que son (si entiendo correctamente) el reloj FRC interno de 8MHz con un divisor de 2, por lo tanto, de 4MHz. Podría intentar verificar esto si define SYSTEM_FREQUENCY a 4000000L y vea si obtiene un retraso de 1s. (actualmente debería ser de 18 segundos en lugar de 1)

Si no me equivoco y realmente quiere que su dispositivo funcione a 72MHz, primero debe configurar sus osciladores:

OSCConfig(OSC_FRC_PLL, OSC_PLL_MULT_18, OSC_PLL_POST_1, OSC_FRC_DIV_2);

Tenga en cuenta que la frecuencia de entrada de PLL no debe exceda de 5 MHz (si Lo entendí bien) así que usarás la división FRC de 8MHz que por 2 ( OSC_FRC_DIV_2 ), la introducirás en el PLL ( OSC_FRC_PLL ) y la multiplicarás por 18 ( OSC_PLL_MULT_18 ) sin divisor posterior ( OSC_PLL_POST_1 ). Con un resultado de 72MHz +/- 2% a 25 ° C (ya que la FRC se calibra de esa manera).

Como realmente no estoy familiarizado, por favor revise esas cosas y no me haga responsable si mata su chip, la primera sugerencia (definir la frecuencia del sistema a un nivel más bajo) debería ser segura.

    
respondido por el Arsenal
0

No soy un programador PIC pero estoy seguro de la demora debido a:

  1. 1000 bucles al generar un retraso de 1 segundo (disminuyendo la variable t, comparar, saltar, etc.)
  2. Tiempo para abrir y cerrar el temporizador.

Puedes hacer algunos experimentos (como hice en AVR o MCS-51):

  1. Crea una función para retrasar un segundo, llámala delay_s. Puede ser delay_ms (1000)
  2. Ejecutar delay_s (1000). Use su cronómetro (muchos teléfonos inteligentes lo tienen) para medir la duración requerida en el segundo. Registre esta duración como T. Para el primer experimento, T debe ser aproximadamente 1000 (> 1000) pero no exactamente 1000

  3. Reemplace SYSTEM_FREQUENCY / 256/1000 en su código con SYSTEM_FREQUENCY / 256 / T

  4. Repita el paso 2 & 3 con T variable (si es necesario) para obtener el temporizador exacto.
respondido por el Oka
0

Si el retraso total es de poco más de 1 segundo, es simplemente que el tiempo extra se toma realizando el bucle calculado 1000 veces. ¿No podría calcular el número exacto de tics del reloj durante 1 segundo y tener un solo bucle?

Después de que la actualización indique que está tomando más de 10 segundos, sugeriría que compruebes que el reloj esté funcionando a la velocidad que crees.

Está calculando los tics del reloj (después del prescaler) para 1 ms - SYSTEM_FREQUENCY / 256/1000, multiplicando eso por 1000 se darán tics durante 1 s, por lo que SYSTEM_FREQUENCY / 256

    
respondido por el HandyHowie

Lea otras preguntas en las etiquetas