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
HVDifusion
Débutant
Débutant
Messages : 43
Enregistré en : décembre 2015

#21 Message par HVDifusion » mer. 17 août 2016 11:07

Salut,

J'ai testé ton programme.

Alors tu avais configuré RB0 et RB2 en entrée,c'étais RB1 en sortie et RB2 en entrée,je n'utilisais pas RB0.

J'ai modifier les temps de chaque partie a 3s pour le (15min et 3min) et 10s pour le (1h) juste pour tester si tous fonctionnais bien pour éviter d'attendre le temps complet lol.

Mais le programme ne fonctionne pas,quand j'alimente tous RB2 est bien polarisé avec une fil de pontage relié au 5V et quand je débranche le fils du RB0 est tiré a la masse avec une résistance de 10K.Donc configuration en pull-down de la pin RB2 qui sert de VoltCheck.

Une led avec résistance de 470E est placée sur la pin RB1 pour simulé l'alarme.

Voici le code fournis avec les modifications :

Code : Tout sélectionner

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

// Set Variable
unsigned int time, chrono, pause1heure, pause15minutes, alarme3minutes ;

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

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

 PCON.B3 = 1; // 4Mhz oscillator

 // configuration TIMER0
  OPTION_REG = 0x85;
  TMR0 = 100;
  INTCON = 0x80;  // GIE activé,  l'INT timer0 n'est pas encore activée

// Initialisation Variable
pause1heure = pause15minutes = alarme3minutes= chrono = time = 0 ;

delay_ms (1000);

 while(1){

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

    if (VoltCheck == 1)   // Contact maintenu
    {
       pause1heure = pause15minutes = alarme3minutes= chrono = time = 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;
           time = 0;
           T0IE_bit = 1;          // On lance le chrono
         }
    }
  }
//-------------------------   ATTENTE 1 HEURE   --------------------------------
  if ( pause1heure == 1 && chrono >= 10) // l'attente d'une heure est finie
  {
     pause1heure = 0;    // On arrete la pause d'une heure
     // action à faire
     T0IE_bit = 0;  // On arrete le chrono
  }

//-------------------------   ATTENTE 15 MINUTES   -----------------------------
  if ( pause15minutes == 1 && chrono >= 3) // l'attente d'une heure est finie
  {
     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
     time = 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
     }
 }


A mon avis tu a oublier de désactivé les pull-up sur le PORTB ce qui fait que celas ne fonctionnerais pas,mais je suis pas sur.

Cordialement.

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

#22 Message par Jérémy » mer. 17 août 2016 17:39

salut,

Content d'avoir de tes nouvelles, même si cela ne fonctionne pas encore !

A mon avis tu a oublier de désactivé les pull-up sur le PORTB ce qui fait que celas ne fonctionnerais pas,mais je suis pas sur.

J'a iun doute aussi, seul un test lèvera le doute . Je ne me suis jamais servi des pull-up interne encore !! Mais qu'il sont désactivé par defauts ma parait normal donc pas besoin de le faire.
Sinon tu image si une personne oublié de les désactivé ça fou le bordel !

Par contre tu peux déjà remplacé
PORTB = 0; // PORTB en digital
par
ANSELB = 0; //PORTB en digital

Le mot PORTB affecte une valeur c'est ANSEL qu'il faut utilisé !

Pour les branchements, il faut que tu fasse un schéma de ce que tu as fais exactement comme branchement sinon on va galérer !

Je t'ai rajouter un petit test en faisant clignoter 3 fois ta led au départ pour voir que tout ce passe bien au niveau de tes temporisations.

Code : Tout sélectionner

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

// Set Variable
unsigned int time, chrono, pause1heure, pause15minutes, alarme3minutes ;

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

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

 PCON.B3 = 1; // 4Mhz oscillator

 // configuration TIMER0
  OPTION_REG = 0x85;
  TMR0 = 100;
  INTCON = 0x80;  // GIE activé,  l'INT timer0 n'est pas encore activée

// Initialisation Variable
pause1heure = pause15minutes = alarme3minutes = chrono = time = 0 ;

delay_ms (1000);

for (i=0; i<=3; i++)
 {
    signal = ~signal; // on inverse la led
    delay_ms (500);
 }

 while(1){

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

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

     delay_ms(10);         // Pause antirebond

     if  (VoltCheck==&& pause1heure==&& 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;
           time = 0;
           T0IE_bit = 1;          // On lance le chrono
         }
    }
  }
//-------------------------   ATTENTE 1 HEURE   --------------------------------
  if ( pause1heure == 1 && chrono >= 10) // l'attente d'une heure est finie
  {
     pause1heure = 0;    // On arrete la pause d'une heure
     // action à faire
     T0IE_bit = 0;  // On arrete le chrono
  }

//-------------------------   ATTENTE 15 MINUTES   -----------------------------
  if ( pause15minutes == 1 && chrono >= 3) // l'attente d'une heure est finie
  {
     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
     time = 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
     }
 }
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

#23 Message par HVDifusion » sam. 20 août 2016 09:50

Salut,


"ANSEL" ça passe pas quand je compile,c'est de l'assembleur ça pas du C donc microC me dit qu'il veut pas.

Voici le schéma : http://prntscr.com/c820nz

Voici le code que j'ai modifier car il y avais quelque erreur :

Code : Tout sélectionner

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

// Set Variable
unsigned int time, 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
      time++;           // 10ms time incrémente
      if (time >= 100)  // 1 seconde d'écoulée
         {
            chrono++;   // On icrémente le chrono
            time = 0;   // On raz time
         }
    }
}

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 = time = 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 = time = 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;
           time = 0;
           T0IE_bit = 1;          // On lance le chrono
         }
    }
  }
//-------------------------   ATTENTE 1 HEURE   --------------------------------
  if ( pause1heure == 1 && chrono >= 10) // l'attente d'une heure est finie
  {
     pause1heure = 0;    // On arrete la pause d'une heure
     // action à faire
     T0IE_bit = 0;  // On arrete le chrono
  }

//-------------------------   ATTENTE 15 MINUTES   -----------------------------
  if ( pause15minutes == 1 && chrono >= 3) // l'attente d'une heure est finie
  {
     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
     time = 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
     }
 }



La led clignotais 2 fois,maintenant elle clignote 3x.

Si tu veut j'ai juste mit un pontage entre le +5V et RB2 pour faire contacte ou non manuellement.

Quand je le retire la pin est a 0V donc après 3s la led devrais s'allumée 3s et s'éteindre.

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

#24 Message par Jérémy » sam. 20 août 2016 11:56

Hello,

"ANSEL" ça passe pas quand je compile,c'est de l'assembleur ça pas du C donc microC me dit qu'il veut pas.

Non non ce n'est pas de l'assembleur, mais bien du "C" , c'est juste ton PIC qui ne l'a comprends pas !

Peux-tu essayer avec ANSEL = 0;, dans un premier temps puis ANSELH = 0 ; dans un second temps ( si le premier fonctionne).

J'ai verifié le programme je ne vois pas d'erreur . Soit elle est toute petite , une erreur à la con comme je les apellent....., soit je suis une bille ! :furieux:

Malheuresement c'est à toi de jouer, pour trouver le probléme.

AS-tu d'autre led ? Il faut placer des témoins visuels dans le programme pour voir ce qui se passe et débugger.

Dans ton cas précis, tu place ton pontage, donc RB2 = 1 , donc Voltcheck = 1 . On tourne en boucle en mettant tout à zéro et en arrêtant le compteur.

Si tu retire ton strap ( et que tu le laisse retiré) . Voltcheck passe à zéro , comme avant tout était remis à zéro, on rentre dans cette boucle :

Code : Tout sélectionner

     if  (VoltCheck==&& pause1heure==&& 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;
           
time 0;
           
T0IE_bit 1;          // On lance le chrono
         


On attend 200ms pour voir si c'est une petite impulsion . Mais tu as complétement retiré le strap, docn au bout des 200ms voltcheck est toujours à 0.
On signale donc que pause15minutes = 1; que l'on souhaite faire une pause de 15 minutes .
Par sécurité on RAZ le chronomètre, le time et on active l'interruption sur TMR0 pour lancer le chrono.

On as donc voltcheck toujours à 0 , pause15minutes à 1 et le chrono qui tourne ( il compte les secondes). A cet instant précis le programme ne peut rentrer donc aucune boucle.

Jusqu’à ce que le chrono soit égal à 3 ( >= 3 secondes), car Pause15minutes = 1 et chrono >=3, La il rentre ici :

Code : Tout sélectionner

if ( pause15minutes == && chrono >= 3// l'attente d'une heure est finie
  
{
     
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
     
time 0;              // RAZ de l'offset
     
T0IE_bit 1;          // On lance le chrono
  


Tu pourrais faire clignoter un truc pour voir si le programme rentre bien ici ? Si tu as une autre led ce serait parfait , sinon tu fais une combinaison de clignotement .

J'attends de tes nouvelles .

A+
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

#25 Message par HVDifusion » sam. 20 août 2016 16:19

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 : 2722
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#26 Message par Jérémy » sam. 20 août 2016 17:02

Ok nickel ca . Il y a donc un probléme avec le timer !
Je regarde ca et te tiens au jus .

De ton coté essaye de tester si le chrono tourne ou non ? avec la led qui change d'état a chaque seconde par exemple
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

#27 Message par HVDifusion » sam. 20 août 2016 17:20

Apparemment non.

J'ai mit le changement d'états de ma LED (Debug =~ Debug;) dans la section qui incrément la variable chrono.

Quand je retire le pontage,rien ne se passe.

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

#28 Message par Jérémy » sam. 20 août 2016 17:23

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


dans la routine d'INTerruption place la led debug, faire en sorte qu'elle clignote . En remplace le mot "time" par "temps" , c'est peut être un mot interdit ! ( la flemme de chercher.
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 : 2722
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#29 Message par Jérémy » sam. 20 août 2016 17:23

Ok donc c'est l'INT qui foire. j'attends que tu changes le mot time de partout pour voir et je regarde l'INT

remplace

Code : Tout sélectionner

 // 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  


Par

Code : Tout sélectionner


 
// configuration TIMER0
  OPTION_REG = 0b10000101; // pull up disable,presc 1:64
  INTCON.GIE = 1;
  INTCON.T0IF = 0;
  INTCON.T0IE = 1;
  TMR0 = 100;
  INTCON.T0IE = 0;


Si la fonctionne pas, on fera seulement clignoter une LED par le Timer0, car j'en perds mon latin
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 : 2722
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#30 Message par Jérémy » sam. 20 août 2016 18:42

A tester directement :

Code : Tout sélectionner

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

// Set Variable
unsigned int tempschrono;

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

void main()
{
 
TRISB 0b00000100// RB1 Out RB2 IN
 
PORTB 0// PORTB en digital
 
 
PCON.B3 1// 4Mhz oscillator

// configuration TIMER0
 
OPTION_REG 0b10000101// pull up disable,presc 1:64
 
INTCON.GIE 1;
 
INTCON.T0IF 0;
 
INTCON.T0IE 1;
 
TMR0 100;
 
INTCON.T0IE 0;

// Initialisation Variable
chrono time ;


 while(
1){
    
    if ((
chrono%2) == 0)
        {
           
Signal 1;        
        }
        else
        {
           
Signal 0;
        }
  }
 } 
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 62 invités