Bonjour,

J'ai un projet a faire pour quelqu'un.

Je vais expliqué son but en bref et de façons compréhensible car c'est pas si facile.

Je doit créer un module qui doit check un contacte libre de potentielle qui est actionné via du 24V d'une chaîne de production.

Le module doit remplir certaine condition :

-Si le contacte est maintenu,le programme est en veille.

-Si le contacte n'est plus détecté,il temporise 15 min avant d'enclenché une alarme qui va durée 3 min.

-Si le contacte ne fait qu'une impulsion,le programme se met en pause 1h,mais si il il se maintien a nouveau ben sa repasse en veille permanente bien sur.

J'ai commencé a faire le début qui consiste a faire la tempos de 15 minute puis 3 minute avec l'alarme.Ici dans le programme il n'est question que de détecté le contacte ou non (je programmerais l'impulsion plus tard).

Code:
// Definition PORTB Pin
#define VoltCheck PORTB.B2
#define Signal PORTB.B1

// Set Variable
bit alarme;
unsigned long int time;
unsigned int seconde;

void interrupt()
{
 if (INTCON.T0IF == 1)  // If TMR0 Overflowing
 {
  INTCON.T0IF = 0;  // Set Flag 0
  time++; // 10ms time incrémente
  TMR0 = 98; // Set TMR0 98 start value
 }
}

void Time15min()
{
 seconde = 0;
 time = 0;
 
 while(seconde <= 3)
 {
  if (time == 100 ) // set 1000ms
  {
   time = 0;
   seconde++;
  }
 }
}

void Time3min()
{
 seconde = 0;
 time = 0;
 
 while(seconde <= 3)
 {
  if (time == 100) // set 1000ms
  {
   time = 0;
   seconde++;
  }
 }
}

void main()
{
 // Set Register Bank
 INTCON = 0b10110000; // Enable all INT and INT TOIE,INTE
 PORTB = 0; // Initialisation 0V
 TRISB = 0b00000101; // Set RB0 and RB2 Input
 OPTION_REG = 0b11001101; // Pull-up Off,rising,Presc ON select 1:64
 PCON.B3 = 1; // 4Mhz oscillator

// Initialisation Variable
alarme = 0;
time = 0;
seconde = 0;

TMR0 = 98; // Set TMR0 98 start value

 while(1)
 {
  if (VoltCheck == 1)
  {
   Signal = 0;
   alarme = 0;
   seconde = 0;
   time = 0;
  }
  
  if (VoltCheck == 0)
  {
   Time15min();
   alarme = 1;
   
   if (alarme == 0)
   {
    Signal = 0;
   }
   
   if (alarme == 1)
   {
    Signal = 1;
    Time3min();
    alarme = 0;
   }
  }
 }
}
On remarque que j'ai activé le TIMER0 et je l'ai régler comme suit.Fosc/4=1us * 157 (TMR0 débute a 98 et non de 0),celas donne 157 us * un prescal de 64 donc 1048 us soit 10ms par débordement du TMR0.

J'ai créer 2 fonction qui sont sensée gérer chaque tempos différente.Je note une while tant que la variable Seconde est inférieure ou égale a 3.

Dans cette while vous remarquer l'incrémentation de la variable Seconde grâce a la variable timer qui est elle incrémentée toute les 10ms par le TMR0.

Pour infos j'ai mit 300 pour 3000ms car c'est plus rapide pour voir si sa fonctionne en teste,que d'attendre les 15 min ect.

Dans le main j'utilise des condition suivant l'étant de la broche d'entrée RB1 (VoltAlert) qui permet suivant son état d'appeler la fonction 15 minute et ensuite d'incrémenter la variable alarme qui suivant son état active RB2 (Signal) pour activé la sirène pendant 3 minute.

Sauf que la sirène s'enclenche tous de suite après que le contacte soit rompu.J'ai cherche je ne vois pas ce que je fait de mal,j'ai l'impression que ma méthode de la fonction n'est pas possible a faire comme je l'ai fait.

Qu'en pensez vous.

Ceci est assez long donc prenez votre temps pour me répondre,pas de soucis.

Cordialement.