No se puede establecer la hora para los temporizadores PIC32

0

Estoy usando PIC32MX795F512L . Uso de la biblioteca de periféricos para generar la interrupción del temporizador. A continuación está el código que estoy usando:

//PIC32 is running at 72MHZ
#define FCY 72000000UL
#define FPB (FCY/2)
#define BAUDRATE    9600

#define PB_DIV 2
#define PRESCALE 256
#define TICKS_PER_SEC 4
#define T1_TICK_RATE (FCY/PB_DIV/PRESCALE/TICKS_PER_SEC)

#pragma config POSCMOD=HS,FNOSC=PRIPLL //FNOSC=PRIPLL
#pragma config FPLLIDIV=DIV_2, FPLLMUL=MUL_18, FPLLODIV=DIV_1
#pragma config FPBDIV=DIV_2, FWDTEN=OFF//, CP=OFF, BWP=OFF

#include <stdio.h>
#include <stdlib.h>
#include <plib.h>

int main(int argc, char** argv) 
{
TRISDbits.TRISD9 = 0;
OpenTimer1(T1_ON | T1_SOURCE_INT | T1_PS_1_256, T1_TICK_RATE);
ConfigIntTimer1(T1_INT_ON | T1_INT_PRIOR_3);
INTEnableSystemMultiVectoredInt();

while(1)
{

}
return (EXIT_SUCCESS);
}

void __ISR(_TIMER_1_VECTOR, ipl3) Timer1Handler(void)
{

mT1ClearIntFlag();
LATDbits.LATD9 = 1;
}

Este temporizador se ejecuta a una velocidad de 250ms pero no estoy seguro. Como soy principiante en temporizadores, no sé cómo calcular valores. Digamos que si quiero ejecutar el temporizador en 100ms , ¿qué valores debo usar para PRESCALE y TICKS_PER_SEC ? Por favor ayuda gracias.!

    
pregunta user007

2 respuestas

1

TICKS_PER_SECOND = 10;

Sin embargo, su resolución puede ser incorrecta, por lo que es posible que desee preescala en T1_PS_1_128 con PRESCALE = 128, o menor si es necesario para usar un número entero o una escala completa de bits de temporizador.

Todo es bastante básico matemático.

    
respondido por el Erik Friesen
1

Eric ya te ha dado algunos números para intentarlo. Siempre no estoy seguro de si tengo la configuración correcta de mi temporizador en varios chips, con las diversas inicializaciones de los periféricos del temporizador más la frecuencia del cristal a tener en cuenta, así que conecto un LED a uno de mis pines y ejecuto algo de código de esta manera:

do_timer_initialization();

void delay_500ms
{
    int i;
    for (i=0; i<5; i++)
    {
         wait_one_tick();    // wait 100 ms
    }
}

while(1)
{
    set_pin(LED_PIN,1);
    delay_500ms();
    set_pin(LED_PIN,0);
    delay_500ms();    
}

donde el bucle for en delay_500ms se ajusta de modo que el retraso sea de 500 ms según el recuento de tics.

El LED debe parpadear una vez por segundo, lo que es fácil de verificar contando el número de parpadeos en un minuto y comparando eso con 60.

    
respondido por el tcrosley

Lea otras preguntas en las etiquetas