¿Es posible llamar al temporizador ISR cuando queremos que se ejecute?

0

Estoy usando PIC32 y estoy haciendo un ejemplo de temporizador. Estoy utilizando el ejemplo de Timer1 proporcionado en documentos de microchip. Mi entendimiento con los temporizadores es cuando nuestro programa principal se inicia, el temporizador también comienza con un tiempo determinado. Entonces su ISR comienza a funcionar con el tiempo dado. ¿Es posible iniciar el ISR cuando queramos? Por ejemplo, si se presiona un botón, se debe llamar al temporizador ISR.

#include <plib.h>
#pragma config FNOSC = FRCPLL, FPLLMUL = MUL_20
#pragma config FPLLODIV = DIV_1, FPBDIV = DIV_8
#pragma config POSCMOD = OFF, FWDTEN = OFF

#define FOSC 80000000
#define PB_DIV 8
#define PRESCALE 256
#define TICKS_PER_SEC 4
#define T1_TICK_RATE (FOSC/PB_DIV/PRESCALE/TICKS_PER_SEC)
int main(void)
{

  OpenTimer1(T1_ON | T1_SOURCE_INT | T1_PS_1_256, T1_TICK_RATE);
  ConfigIntTimer1(T1_INT_ON | T1_INT_PRIOR_3);
  INTEnableSystemMultiVectoredInt();
  while(1)
  {
    //... do something useful here ...
  };
 }
 void __ISR(_TIMER_1_VECTOR, ipl3) Timer1Handler(void)
{
  mT1ClearIntFlag();
}

Cómo llamar a __ISR(_TIMER_1_VECTOR, ipl3) Timer1Handler(void) cuando queremos en nuestro programa.

    
pregunta user007

3 respuestas

3

Puedes lograr lo que quieres de dos maneras. La segunda forma debe considerarse como "mejor práctica".

Primera forma: cree una función que llamará su ISR y llame a esa misma función en otras partes de su código. Dependiendo de cómo se defina __ISR (), Timer1Handler () podría llamarse directamente en main (), pero no estoy 100% seguro de ello.

void myFunction()
{
  // ... do what you want as Timer1Handler ...
}

void __ISR(_TIMER_1_VECTOR, ipl3) Timer1Handler()
{
  myFunction();
}

int main()
{
  // ... main application calling myFunction() ...
}

Segunda forma: ha dicho "si se presiona un botón, se debe llamar al ISR". Entonces, lo que debe hacer aquí es crear un ISR diferente para una interrupción externa con respecto a ese botón. Esto podría llamar a la misma función que el temporizador ISR.

void myFunction()
{
  // ... do what you want ...
}

void __ISR(_TIMER_1_VECTOR, ipl3) Timer1Handler()
{
  myFunction();
}

void __ISR(_EXTERNAL_0_VECTOR, ipl3) External0Handler()
{
  myFunction();
}

int main()
{
  // ... do what you want ...
}

Pensamientos finales: como regla general, las interrupciones de los manipuladores no deberían hacer mucho "trabajo". Quieres que tengan la ejecución más corta posible. En mis proyectos, ISR normalmente solo establece algunas variables lógicas volátiles marcadas en otras partes del código o alteran algunos GPIO. Asegúrate de mantener tus manejadores simples.

    
respondido por el Vicente Cunha
1

Creo que está malinterpretando el propósito del temporizador ISR.

El ISR se ejecuta por hardware cuando el temporizador se desplaza. Esto continuará sucediendo cada vez que el temporizador se desplace.

Puede desactivar el temporizador y luego habilitarlo cuando se presiona un botón, pero solo el hardware debe llamar directamente a la interrupción. No olvide borrar el registro TMR antes de habilitar el temporizador.

    
respondido por el vini_i
1

En PIC32, el software puede generar cualquier interrupción. Es decir, si por cualquier motivo desea ejecutar el ISR, todo lo que necesita hacer es establecer el indicador para esta interrupción. No sé si una función (similar a 'mT1ClearIntFlag ()') está disponible, pero los bits de configuración / borrado son bastante triviales: busque en el archivo de cabecera de su dispositivo, es probable que encuentre un #define _T1IF... en algún lugar. . Después de eso, configurar la bandera es tan fácil como codificar '_T1IF = 1;'.

    
respondido por el Oleg Mazurov

Lea otras preguntas en las etiquetas