Estoy intentando descifrar un código C en el que se está utilizando Timer1
para medir el período de una señal digital, usando dsPIC33EP256MC506. La interrupción del temporizador no se está habilitando y no hay una rutina de servicio de interrupción para este temporizador. Publicaré solo las partes relevantes del código, ya que el código real es enorme! El programa simplemente está inicializando el temporizador de la siguiente manera en la rutina main()
:
volatile unsigned int ContinueTimeStep __attribute__ ((near)) = 0;
int main() {
PR1 = 0xFFFF; /* Period */
T1CON = 0x8030; /* enable timer, 1:256 input clock prescaler */
/* Main Loop */
for (;;) {
while (!ContinueTimeStep) ;
asm("BCLR.b _ContinueTimeStep,#0");/* ContinueTimeStep--; */
MyFunction();
} /* End for(;;) */
}
En MyFunction()
no se está haciendo nada con el temporizador. La lectura del temporizador solo se utiliza en el cálculo del período en el flanco ascendente. Esto se hace dentro del ISR de notificación de cambios de la siguiente manera:
void __attribute__((__interrupt__,__auto_psv__)) _CNInterrupt(void)
{
/* Change Notification on Port F0*/
if (portF_Xor & 1) {
if (portF_Copy & 1) /* rising edge detection*/
{
CN80_RisingPeriode = Timer1 - TimerCN80_Old;
TimerCN80_Old = Timer1;
CN80_ChangeDetectedFlag++;
}
TimerCN80_Old = Timer1;
}
}
Como mencioné, miré a mi alrededor en el código, pero no pude encontrar un ISR Timer 1. Así que estoy bastante seguro de que no hay uno. Mi pregunta es, ¿es esto incluso válido? ¿El temporizador se desbordará automáticamente y comenzará desde cero, una vez que se alcance el período? ¿Qué sucede si la interrupción ocurre justo después de que el temporizador 1 se haya desbordado? ¿Se calculará el período como negativo? ¡Gracias por su valiosa aportación!