Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

[Programmation] La gestion de Fonction
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1653
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#31 Message par Gérard » sam. 20 août 2016 21:03

HVDifusion a écrit :Yop,

Voila j'ai pu faire des testes sur le programme.

Première chose ton ANSEL marche pas et le ANSELH non plus,je sais pas pourquoi.
...


Es-tu sûr que le registre ANSEL existe dans ton PIC?
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

[Programmation] La gestion de Fonction
HVDifusion
Débutant
Débutant
Messages : 43
Enregistré en : décembre 2015

#32 Message par HVDifusion » lun. 29 août 2016 11:20

Bonjour,

Désolé du retard,la semaine je travaille et donc pas trop le temp.

Voila mon rapport de teste :

-J'ai changé tous les nom "timer" par "compteur" qui aurais pu posé le problème.

-J'ai Mit (voir le code) la LED Debug dans le "IF" du compteur qui incrémente la variable "chrono" toute les seconde.

-J'ai mit une boucle "FOR" pour switch la LED a intervale dans la partie "Attente de 15 minutes".

Voici le code modifié :

Code : Tout sélectionner

// Definition PORTB Pin
#define VoltCheck PORTB.B2
#define Signal PORTB.B1
#define Debug PORTB.B4

// Set Variable
unsigned int compteur, chrono, pause1heure, pause15minutes, alarme3minutes , i ;

void interrupt()
{
 if (INTCON.T0IF == 1)  // If TMR0 Overflowing
    {
      INTCON.T0IF = 0;  // Réarmement du flag
      TMR0 = 100;        // Offset du timer0
      compteur++;           // 10ms time incrémente
      if (compteur >= 100)  // 1 seconde d'écoulée
         {
            Debug =~ Debug; // LED d'activitée
            chrono++;   // On icrémente le chrono
            compteur = 0;   // On raz time
            Debug = 0;
         }
    }
}

void main()
{
 PORTB = 0; // PORTB en digital
 TRISB = 0b00000100; // RB1 Out RB2 IN

 PCON.B3 = 1; // 4Mhz oscillator

 // configuration TIMER0
  OPTION_REG = 0b10000101; // pull up disable,presc 1:64
  TMR0 = 100;
  INTCON = 0x80;  // GIE activé,  l'INT timer0 n'est pas encore activée

// Initialisation Variable
pause1heure = pause15minutes = alarme3minutes = chrono = compteur = i = 0 ;

Signal = 0;

for (i=0; i<=5; i++)
 {
    Signal =~ Signal; // on inverse la led
    delay_ms (350);
 }

 while(1){

//------------------------------------------------------------------------------

    if (VoltCheck == 1)   // Contact maintenu
    {
       pause1heure = pause15minutes = alarme3minutes= chrono = compteur = 0 ;
       T0IE_bit = 0;  // On arrete le chrono
    }
    else
    {

     delay_ms(10);         // Pause antirebond

     if  (VoltCheck==0 && pause1heure==0 && pause15minutes==0)
         {
           delay_ms(200);         // Pause detection d'impulsion
           if  (VoltCheck == 1)   // C'était juste une impulsion
               {
                 pause1heure = 1;       // On fait une pause d'une heure
               }
               else              // Le contact est toujours pas maintenu
               {
                 pause15minutes = 1;   // On attend 15 minutes
               }
           chrono = 0;
           compteur = 0;
           T0IE_bit = 1;          // On lance le chrono
         }
    }
  }
//-------------------------   ATTENTE 1 HEURE   --------------------------------
  if ( pause1heure == 1 && chrono >= 60) // l'attente d'une heure est finie
  {
     pause1heure = 0;    // On arrete la pause d'une heure
     T0IE_bit = 0;  // On arrete le chrono
  }

//-------------------------   ATTENTE 15 MINUTES   -----------------------------
  if ( pause15minutes == 1 && chrono >= 15) // l'attente d'une heure est finie
  {
   for (i=0; i<=5; i++) // LED d'activitée clignotement
   {
    Debug =~ Debug;
    delay_ms (150);
   }
     pause15minutes = 0;    // On arrete la pause 15 minutes
     alarme3minutes = 1;    // On active l'alarme pour 3 minutes
     Signal = 1;            // On active l'alarme
     chrono = 0;            // RAZ du chrono
     compteur = 0;              // RAZ de l'offset
     T0IE_bit = 1;          // On lance le chrono
  }

//-------------------------   ATTENTE 3 MINUTES   ------------------------------
  if (alarme3minutes = 1 && chrono>=3) // au bout des trois minutes
     {
       alarme3minutes = 0; // On arrete l'alarme des 3 minutes
       Signal = 0 ;   // On éteint l'alarme
       T0IE_bit = 0;  // On arrete le chrono
     }
 }


Résultat du teste :

-La LED Debug ne clignote pas dans le IF du compteur.

-La LED Debug ne clignote pas dans la partie "Attente de 15 minutes"

Donc il semblerais que le programme ne rentre pas dans la partie 15 minutes quand le pontage est retiré (voltcheck = 0) et que le décompte de la variable compteur via le timer0 ne se fait pas.

Cordialement.

[Programmation] La gestion de Fonction
Jérémy
Administrateur du site
Administrateur du site
Messages : 2725
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#33 Message par Jérémy » lun. 29 août 2016 11:37

Bonjour ,

Je penche pour un probléme de Timer0 !
A mon avis l'Interruption ne fonctionne pas ou mal .

On va juste faire clignoter une led avec le compteur pour voir !

Code : Tout sélectionner

// Definition PORTB Pin
#define VoltCheck PORTB.B2
#define Signal PORTB.B1
#define Debug PORTB.B4

// Set Variable
unsigned int compteurchronopause1heurepause15minutesalarme3minutes ;

void interrupt()
{
 if (
INTCON.T0IF == 1)  // If TMR0 Overflowing
    
{
      
INTCON.T0IF 0;  // Réarmement du flag
      
TMR0 100;        // Offset du timer0
      
compteur++;           // 10ms time incrémente
      
if (compteur >= 100)  // 1 seconde d'écoulée
         
{
            
Debug =~ Debug// LED d'activitée
            
chrono++;   // On icrémente le chrono
            
if (chrono>1)chrono=0;
            
compteur 0;   // On raz time
            
Debug 0;
         }
    }
}

void main()
{
 
PORTB 0// PORTB en digital
 
TRISB 0b00000100// RB1 Out RB2 IN

 
PCON.B3 1// 4Mhz oscillator

 // configuration TIMER0
  
OPTION_REG 0b10000101// pull up disable,presc 1:64
  
TMR0 100;
  
INTCON 0x80;  // GIE activé,  l'INT timer0 n'est pas encore activée

// Initialisation Variable
pause1heure pause15minutes alarme3minutes chrono compteur ;

Signal 0;

for (
i=0i<=5i++)
 {
    
Signal =~ Signal// on inverse la led
    
delay_ms (350);
 }
 
     
T0IE_bit 1;          // On lance le chrono

 
while(1){
           
    if (
chrono==1)
        {
         
Debug=1;
        }
    else
        {
         
Debug=0;
        }
        
  }
 }
 
C'est en faisant des erreurs, que l'on apprend le mieux !!!

[Programmation] La gestion de Fonction
HVDifusion
Débutant
Débutant
Messages : 43
Enregistré en : décembre 2015

#34 Message par HVDifusion » lun. 29 août 2016 13:38

La LED clignote bien donc c'est pas le timer0.

[Programmation] La gestion de Fonction
Jérémy
Administrateur du site
Administrateur du site
Messages : 2725
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#35 Message par Jérémy » lun. 29 août 2016 13:49

Ok, nickel c'est déjà une bonne chose.
Alors on va y aller étape par étape et rajouter les fonctions unes à une !

Avec ceci, la led devrait clignoter quand voltchechk = 0 et s'arreter ( allumée ou éteinte) quand voltcheck = 1

Il faut que tu avacne comme ca, petit à petit.

Code : Tout sélectionner

// Definition PORTB Pin
#define VoltCheck PORTB.B2
#define Signal PORTB.B1
#define Debug PORTB.B4

// Set Variable
unsigned int compteurchronopause1heurepause15minutesalarme3minutes ;

void interrupt()
{
 if (
INTCON.T0IF == 1)  // If TMR0 Overflowing
    
{
      
INTCON.T0IF 0;  // Réarmement du flag
      
TMR0 100;        // Offset du timer0
      
compteur++;           // 10ms time incrémente
      
if (compteur >= 100)  // 1 seconde d'écoulée
         
{
            
Debug =~ Debug// LED d'activitée
            
chrono++;   // On icrémente le chrono
             
if (chrono>1)chrono=0;
            
compteur 0;   // On raz time
            
Debug 0;
         }
    }
}

void main()
{
 
PORTB 0// PORTB en digital
 
TRISB 0b00000100// RB1 Out RB2 IN

 
PCON.B3 1// 4Mhz oscillator

 // configuration TIMER0
  
OPTION_REG 0b10000101// pull up disable,presc 1:64
  
TMR0 100;
  
INTCON 0x80;  // GIE activé,  l'INT timer0 n'est pas encore activée

// Initialisation Variable
pause1heure pause15minutes alarme3minutes chrono compteur ;

Signal 0;

for (
i=0i<=5i++)
 {
    
Signal =~ Signal// on inverse la led
    
delay_ms (350);
 }

 while(
1){

//------------------------------------------------------------------------------

    
if (VoltCheck == 1)   // Contact maintenu
    
{
       
pause1heure pause15minutes alarme3minuteschrono compteur ;
       
T0IE_bit 0;  // On arrete le chrono
    
}
    else
    {
      
T0IE_bit 1;          // On lance le chrono
        
    
}
    
     if (
chrono==1)
        {
         
Debug=1;
        }
    else
        {
         
Debug=0;
        }
        
        
  
 }
 
C'est en faisant des erreurs, que l'on apprend le mieux !!!

[Programmation] La gestion de Fonction
HVDifusion
Débutant
Débutant
Messages : 43
Enregistré en : décembre 2015

#36 Message par HVDifusion » lun. 29 août 2016 14:25

Salut,

Oui ça marche aussi mais ça m'étonne pas j'avais déjà fait ce teste.

J'avais tous tester en déplaçant ma LED debug dans chaque section pour voir si le programme rentrais bien dedans.

Référence a ceci :

HVDifusion a écrit :Yop,

Voila j'ai pu faire des testes sur le programme.

Première chose ton ANSEL marche pas et le ANSELH non plus,je sais pas pourquoi.

Ensuite j'ai rajouté une LED qui s'appel dans le programme (Debug) et je l'ai branché sur RB4 qui étais libre.

J'ai mit la LED dans les différente sections du programme et voici le rapport :

-Voltcheck = 1 (ok)
-Voltcheck = 0 (ok)
-Teste Voltcheck = 0 (impulsion/coupure ?) impulsion (ok),coupure (ok)
-ATTENTE 3 MINUTES , ATTENTE 15 MINUTES et ATTENTE 1 HEURE (aucune réaction de la led)
-Teste T0IF TMR0 (décompte ok)


Voila j'ai voulus faire simple et court pour évité toute confusion.

[Programmation] La gestion de Fonction
Jérémy
Administrateur du site
Administrateur du site
Messages : 2725
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#37 Message par Jérémy » lun. 29 août 2016 15:09

Plus complexe :

J'ai créer une fonction qui fait clignoter la led, suivant la valeur du chrono.

Maintenant on rentre dans la fonction 15minutes ( qui dure en fait 15 secondes) pendant les 15 secondes la led doit clignoter a la fin des 15secondes elle s’arrête.
Je travaille sans filet , il peut y avoir des petites erreurs de compilateur ( je suis avec notepad la)

Code : Tout sélectionner

// Definition PORTB Pin
#define VoltCheck PORTB.B2
#define Signal PORTB.B1
#define Debug PORTB.B4

// Set Variable
unsigned int compteurchronopause1heurepause15minutesalarme3minutes ;

//------------------------------------------------------------------------------
void interrupt()
{
 if (
INTCON.T0IF == 1)  // If TMR0 Overflowing
    
{
      
INTCON.T0IF 0;  // Réarmement du flag
      
TMR0 100;        // Offset du timer0
      
compteur++;           // 10ms time incrémente
      
if (compteur >= 100)  // 1 seconde d'écoulée
         
{
            
Debug =~ Debug// LED d'activitée
            
chrono++;   // On icrémente le chrono
            
compteur 0;   // On raz time
            
Debug 0;
         }
    }
}

//------------------------------------------------------------------------------
void clignotement()
   {    
     if ((
chrono%2)==)
        {
         
Debug=0;
        }
    else
        {
         
Debug=1;
        }
   }
   
   
//------------------------------------------------------------------------------   
void main()
{
 
PORTB 0// PORTB en digital
 
TRISB 0b00000100// RB1 Out RB2 IN

 
PCON.B3 1// 4Mhz oscillator

 // configuration TIMER0
  
OPTION_REG 0b10000101// pull up disable,presc 1:64
  
TMR0 100;
  
INTCON 0x80;  // GIE activé,  l'INT timer0 n'est pas encore activée

// Initialisation Variable
pause1heure pause15minutes alarme3minutes chrono compteur ;

Signal 0;

for (
i=0i<=5i++)
 {
    
Signal =~ Signal// on inverse la led
    
delay_ms (350);
 }

 
//------------------------------------------------------------------------------
 
while(1){

    if (
VoltCheck == 1)   // Contact maintenu
    
{
       
pause1heure pause15minutes alarme3minuteschrono compteur ;
       
T0IE_bit 0;  // On arrete le chrono
    
}
    else
    {
     
delay_ms(10);         // Pause antirebond

     
if  ((pause1heure==0) && (pause15minutes==0))
         {
           
delay_ms(200);         // Pause detection d'impulsion
           
if  (VoltCheck == 1)   // C'était juste une impulsion
               
{
                 
pause1heure 1;       // On fait une pause d'une heure
               
}
               else              
// Le contact est toujours pas maintenu
               
{
                 
pause15minutes 1;   // On attend 15 minutes
               
}
           
chrono 0;
           
compteur 0;
           
T0IE_bit 1;          // On lance le chrono
         
}
    }
 

//-------------------------   ATTENTE 15 MINUTES   -----------------------------
      
if ( pause15minutes == 1
        if (
chrono >= 15)
           {
              
pause15minutes 0;    // On arrete la pause 15 minutes
              
alarme3minutes 1;    // On active l'alarme pour 3 minutes
              
Signal 1;            // On active l'alarme
              
chrono 0;            // RAZ du chrono
              
compteur 0;              // RAZ de l'offset
           
}
        else
           {
             
clignotement ();
           }
  }
 } 
C'est en faisant des erreurs, que l'on apprend le mieux !!!

[Programmation] La gestion de Fonction
HVDifusion
Débutant
Débutant
Messages : 43
Enregistré en : décembre 2015

#38 Message par HVDifusion » lun. 29 août 2016 15:26

Celas fonctione bien.

Je retire le pontage,la LED debug clignotement bien 15s puis active Signal.

Sauf que Signal n'a pas son délais mais ça tu la pas programmé donc normale.

[Programmation] La gestion de Fonction
Jérémy
Administrateur du site
Administrateur du site
Messages : 2725
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#39 Message par Jérémy » lun. 29 août 2016 15:28

Bon ben ca avance bien .

Je suis désolé, je dois y aller . je te filerais un autre programme ce soir. mais tu peux essayer en rajoutant les éléments au fur et à mesure !

A ce soir
C'est en faisant des erreurs, que l'on apprend le mieux !!!

[Programmation] La gestion de Fonction
Jérémy
Administrateur du site
Administrateur du site
Messages : 2725
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#40 Message par Jérémy » lun. 29 août 2016 18:45

En introduit la notion d'appui court !

Regle la sensibilité en changeant les 200ms de pause si tu n'as pas le temps de remettre le straps en place. Le but est de simuler un appui bref sur Voltchek.

Code : Tout sélectionner

// Definition PORTB Pin
#define VoltCheck PORTB.B2
#define Signal PORTB.B1
#define Debug PORTB.B4

// Set Variable
unsigned int compteurchronopause1heurepause15minutesalarme3minutes ;

//------------------------------------------------------------------------------
void interrupt()
{
 if (
INTCON.T0IF == 1)  // If TMR0 Overflowing
    
{
      
INTCON.T0IF 0;  // Réarmement du flag
      
TMR0 100;        // Offset du timer0
      
compteur++;           // 10ms time incrémente
      
if (compteur >= 100)  // 1 seconde d'écoulée
         
{
            
Debug =~ Debug// LED d'activitée
            
chrono++;   // On icrémente le chrono
            
compteur 0;   // On raz time
            
Debug 0;
         }
    }
}

//------------------------------------------------------------------------------
void clignotement()
   {    
     if ((
chrono%2)==)
        {
         
Debug=0;
        }
    else
        {
         
Debug=1;
        }
   }
   
   
//------------------------------------------------------------------------------   
void main()
{
 
PORTB 0// PORTB en digital
 
TRISB 0b00000100// RB1 Out RB2 IN

 
PCON.B3 1// 4Mhz oscillator

 // configuration TIMER0
  
OPTION_REG 0b10000101// pull up disable,presc 1:64
  
TMR0 100;
  
INTCON 0x80;  // GIE activé,  l'INT timer0 n'est pas encore activée

// Initialisation Variable
pause1heure pause15minutes alarme3minutes chrono compteur ;

Signal 0;

for (
i=0i<=5i++)
 {
    
Signal =~ Signal// on inverse la led
    
delay_ms (350);
 }

 
//------------------------------------------------------------------------------
 
while(1){

    if (
VoltCheck == 1)   // Contact maintenu
    
{
       
pause1heure pause15minutes alarme3minuteschrono compteur ;
       
T0IE_bit 0;  // On arrete le chrono
    
}
    else
    {
     
delay_ms(10);         // Pause antirebond

     
if  ((pause1heure==0) && (pause15minutes==0))
         {
           
delay_ms(200);         // Pause detection d'impulsion
           
if  (VoltCheck == 1)   // C'était juste une impulsion
               
{
                 
pause1heure 1;       // On fait une pause d'une heure
               
}
               else              
// Le contact est toujours pas maintenu
               
{
                 
pause15minutes 1;   // On attend 15 minutes
               
}
           
chrono 0;
           
compteur 0;
           
T0IE_bit 1;          // On lance le chrono
         
}
    }
 
//-------------------------   ATTENTE 1 HEURE   --------------------------------
  
if ( pause1heure == )
      {
        if (
chrono >= 60// l'attente d'une heure est finie
          
{
             
pause1heure 0;    // On arrete la pause d'une heure
             
T0IE_bit 0;  // On arrete le chrono
          
}
          else
          {
            
clignotement();
           }    
      }

//-------------------------   ATTENTE 15 MINUTES   -----------------------------
      
if ( pause15minutes == 1)
        {
            if (
chrono >= 15)
               {
                  
pause15minutes 0;    // On arrete la pause 15 minutes
                  
alarme3minutes 1;    // On active l'alarme pour 3 minutes
                  
Signal 1;            // On active l'alarme
                  
chrono 0;            // RAZ du chrono
                  
compteur 0;              // RAZ de l'offset
               
}
        }   
  }
 }  
C'est en faisant des erreurs, que l'on apprend le mieux !!!


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 42 invités