Autor Tema: Contador se resetea solo [Solucionado]  (Leído 2084 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Danicap

  • PIC10
  • *
  • Mensajes: 3
Contador se resetea solo [Solucionado]
« en: 24 de Marzo de 2017, 06:16:28 »
Hola a todos,

Estoy desarrollando una aplicación que comunica vía MODBUS con un dispositivo. Quiero detectar si hay una pérdida de comunicación entre ellos para que active una alarma. He implementado un timer con el TMR2 para que active la alarma si transcurren mas de 20 segundos aproximadamente sin comunicación. Funciona correctamente, la alarma se activa a los 20 segundos sin comunicación pero después de un rato el contador se resetea solo y desactiva la alarma hasta que vuelven a transcurrir otros 20 segundos sin comunicación.

Os adjunto el fragmento de código donde está implementado esto a ver si alguien tiene alguna idea de qué puede estar pasando porque no le encuentro ningún sentido....
 
TMR2_Interrupt

Código: C
  1. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2. //+INTERRUPT SERVICE ROUTINE
  3. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  4.  
  5. //-----------------------------------------------------------------------------
  6. //- HIGH INTERRUPT Addressing -
  7. //-----------------------------------------------------------------------------
  8. #pragma code HighInterruptVector = 0x0008
  9. void HighInterruptVector (void)
  10. {
  11.   _asm
  12.     goto HighInterruptRoutine
  13.   _endasm
  14. }
  15. //-----------------------------------------------------------------------------
  16. //- HIGH INTERRUPT Function -
  17. //-----------------------------------------------------------------------------
  18. #pragma interrupt HighInterruptRoutine
  19.  
  20. void HighInterruptRoutine (void)
  21. {
  22.  if (PIR1bits.TMR2IF)
  23.  {
  24.   if (TMR2_Counter <= 1250) //20 seconds
  25.   {
  26.    TMR2_Counter ++;
  27.   }
  28.   PIR1bits.TMR2IF = 0; //CLEAR TMR2 flag
  29.  }
  30. }

Yo reseteo manualmente el TMR2_Counter a 0 únicamente al recivir algún dato por la interrupción serie. He comprobado y ésta no se activa en ningún momento, por lo que el reseteo del contador no viene dado por esto.

Alarm managing

Código: C
  1. if(Alarm1 != 0 | Alarm2 !=0)
  2.  {
  3.   if (Alarm1 == 0x0003 & Alarm2 == 0x0000) //Loss of synchronism with the motor Alarm
  4.   {
  5.    alarmCounter = 0; //Reset Alarm counter
  6.    syncAlarmCounter_Aux ++;
  7.    if (syncAlarmCounter_Aux > 32000) //1 second
  8.    {
  9.     syncAlarmCounter_Aux = 0;
  10.     syncAlarmCounter ++;
  11.     if (syncAlarmCounter > 15) //Seconds of Time Out for loss of synchronism alarm
  12.     {
  13.      PORTCbits.RC0 = 0; //Activate Relay if loss of synchronism alarm detected while x period of time (Negative Logic)
  14.      PORTCbits.RC1 = 0;
  15.     }
  16.    }
  17.   }
  18.   else //For any other alarm activate Relay
  19.   {
  20.    alarmCounter_Aux ++;
  21.    syncAlarmCounter = 0; //Reset the loss of synchronism Alarm counter
  22.    if (alarmCounter_Aux > alarmTimeOut_Aux)
  23.    {
  24.     alarmCounter_Aux = 0;
  25.     alarmCounter ++;
  26.     if (alarmCounter > alarmTimeOut)
  27.     {
  28.      PORTCbits.RC0 = 0; //Activate Relay if alarm detected (Negative Logic)
  29.      PORTCbits.RC1 = 0;
  30.     }
  31.    }
  32.   }
  33.   if (TMR2_Counter > 1250) //20s without RS485 communication
  34.   {
  35.    PORTCbits.RC0 = 0; //Activate Relay if alarm detected (Negative Logic)
  36.    PORTCbits.RC1 = 0;
  37.   }
  38.  }
  39.  else
  40.  {
  41.   alarmCounter = 0;
  42.   syncAlarmCounter = 0; //Reset the loss of synchronism Alarm counter
  43.   if (TMR2_Counter > 1250 ) //20s without RS485 communication
  44.   {
  45.    PORTCbits.RC0 = 0; //Activate Relay if alarm detected (Negative Logic)
  46.    PORTCbits.RC1 = 0;
  47.   }
  48.   else
  49.   {
  50.    PORTCbits.RC0 = 1; //Desactivate Relay if no alarm detected
  51.    PORTCbits.RC1 = 1;
  52.   }
  53.  }

Si necesitáis mas info preguntadme sin miedo. Espero que alguien pueda darle luz a este asunto porque me está volviendo loco... Gracias!!!




EDITO:

Ya está solucionado, el problema era el WathcDog que llegaba al overflow y reseteaba el micro completo, me habia olvidado completamente del chucho guardian  :D, ahor aya funciona todo perfectamente, gracias!!
« Última modificación: 24 de Marzo de 2017, 07:15:53 por Danicap »


 

anything