Bonjour, cliquez-ici pour vous inscrire et participer au forum.
  • Login:



+ Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 15 sur 22

Détection de front montant

  1. Amine_34

    Date d'inscription
    juillet 2010
    Messages
    53

    Détection de front montant

    Bonsoir,

    Je voudrais lancer une temporisation sur un front montant.
    Donc pour expliquer d'avantage, je surveille l'état d'une entrée logique, donc dés qu'elle passe à 1, je lance une temporisation.

    Le code que j'utilise actuellement est :

    void main ()
    {
    int Etat = 0;
    int EtatPrecedent = 0;

    EtatPrecedent = Etat;
    Etat = Entrees.Logiques.Etat.NA.E_PAR K;

    if (Etat != EtatPrecedent)
    {
    if (Etat == 1)
    {
    TemporisationLance(TpParking, TEMPS_ATTENTE_PARKING);
    }
    }
    }

    Le problème est que la temporisation ne se lance jamais, et donc il ne rentre jamais dans la boucle ( méme quand l'entrée logique passe de 0 à 1)

    Je ne sais pas si ca viens de l'initialisation de "etat" et "etatprecedent" ou ...

    Merci de me répondre car je n'arrive vrmnt pas a savoir d ou ca peut venir et ca fait un petit moment que je bloque dessus.

    merci


     


    • Publicité



  2. lucas.gautheron

    Date d'inscription
    décembre 2011
    Localisation
    Quelque part dans la voie lactée
    Âge
    19
    Messages
    1 228

    Re : Détection de front montant

    je ne suis pas sur de bien cerner ton problème.
    Ici, tu assignes comme valeur 0 à EtatPrecedent et la valeur d'entrée à Etat.
    Puis ton compares Etat à Etatprecedent (pourquoi faire), et s'ils sont différents, tu compares Etat à 1.
    Ok.
    Mais tu ne fais ce test qu'une fois, autrement dit si à l'instant ou tu veux le test, Etat != 1, (ou Etat == EtatPrecedent) alors c'est foutu, la tempo sera pas lancée et le test ne sera plus jamais effectué.
    Ne manquerait-il pas une boucle ? Ou alors je n'ai pas compris ou tu voulais en venir.

    PS : utilise la balise code
     

  3. Amine_34

    Date d'inscription
    juillet 2010
    Messages
    53

    Re : Détection de front montant

    au fait je fais appel a cette fonction dans la fonction main ().

    Cette fonction en vrai s appel securite ()

    donc ca se reboucle

    mais ca ne rentre jamais dans la boucle if ...

    ???
     

  4. lucas.gautheron

    Date d'inscription
    décembre 2011
    Localisation
    Quelque part dans la voie lactée
    Âge
    19
    Messages
    1 228

    Re : Détection de front montant

    et si tu nous montrais le vrai code code ?
     

  5. Amine_34

    Date d'inscription
    juillet 2010
    Messages
    53

    Re : Détection de front montant

    c est un code très lourd !!

    Mais pour résumer je me propose de bien montrer ou cette fonction intervient :

    Voila, j'ai deux fichiers : un <main.c> et un <securite.c>

    dans le main.c on a :

    int main ()
    {
    SecuritesInitialise ();

    EtatSysteme.PremiereBoucle = 1; // cette variable est déja déclarée dans le .h

    for ( ; ; EtatSysteme.PremiereBoucle = 0)
    {
    SecuritesGere();
    }
    }

    dans la fonction securiites.c on a :

    int etat = 0;
    int etatprecedent = 0;

    void SecuritesInit()
    {

    // La je ne met rien qui soit en rapport avec ma fonction "detection de front montant"

    }

    void SecuriteGere ()
    {
    EtatPrecedent = Etat;
    Etat = Entrees.Logiques.Etat.NA.E_PAR K;

    if (Etat != EtatPrecedent)
    {
    if (Etat == 1)
    {

    TemporisationLance(TpParking, TEMPS_ATTENTE_PARKING); // fonction déclarée au préalable

    }
    }

    donc voila tout.

    et avec ca, je ne rentre jamais dans le if () et donc ma tomporisation ne se lance pas


    }
    }
     


    • Publicité



  6. lucas.gautheron

    Date d'inscription
    décembre 2011
    Localisation
    Quelque part dans la voie lactée
    Âge
    19
    Messages
    1 228

    Re : Détection de front montant

    Il aurait été mieux que tu suives le premier conseil (càd utiliser la balise code :P) mais bon déjà maintenant on en sait un peu plus...

    Avec ce que tu as mis là, comme ça, à première vue, je ne vois pas l'origine du problème. As tu essayé, avec un code réduit au minimum, de détecter ce front montant ? (passage de Entrees.Logiques.Etat.NA.E_PAR K à 1 ?)
     

  7. Amine_34

    Date d'inscription
    juillet 2010
    Messages
    53

    Re : Détection de front montant

    Il y auré une autre méthode pour détecter un front montant ??

    Si oui j aimerais bien savoir comment, ca m aiderai a avancer

    Et merci d avance
     

  8. Amine_34

    Date d'inscription
    juillet 2010
    Messages
    53

    Re : Détection de front montant

    il ya une autre methode pour faire une detection de front montant ??
     

  9. Jack

    Date d'inscription
    avril 2003
    Localisation
    Metz
    Messages
    13 601

    Re : Détection de front montant

    Il faudrait faire un effort au niveau de la présentation du code car ça ne donne vraiment pas envie de te lire.
    Code:
    void SecuriteGere ()
    {
       EtatPrecedent = Etat;
       Etat = Entrees.Logiques.Etat.NA.E_PAR  K;
     
       if (Etat != EtatPrecedent)
       {
       if (Etat == 1)
       {
     
          TemporisationLance(TpParking, TEMPS_ATTENTE_PARKING); // fonction déclarée au préalable
     
       }
    }
    Ces trois lignes ne conviennent pas pour détecter un front
    Code:
       EtatPrecedent = Etat;
       Etat = Entrees.Logiques.Etat.NA.E_PAR  K;
     
       if (Etat != EtatPrecedent)
    ou alors, il faut jouer au loto

    Code:
       EtatPrecedent = Etat;
       Etat = Entrees.Logiques.Etat.NA.E_PAR  K;
     
       if (Etat != EtatPrecedent)
    il ne faut pas rafraichir EtatPrecedent à chaque entrée dans la fonction sinon, en imaginant que l'entrée vient juste de changer avant d'exécuter cette ligne, tu auras lou^é ce changement.
    Il faut que EtatPrécédent soit une variable globale, ou mieux une variable statique mise à jour uniquement à un changement d'état.

    A+
     

  10. JPL

    Date d'inscription
    septembre 2003
    Localisation
    Banlieue bordelaise
    Messages
    54 767

    Re : Détection de front montant

    Citation Envoyé par lucas.gautheron Voir le message
    Il aurait été mieux que tu suives le premier conseil (càd utiliser la balise code :P)
    Balise Code ou non le programme n'est pas indenté (j'ai vérifié). Mauvaise habitude.
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac
     

  11. Amine_34

    Date d'inscription
    juillet 2010
    Messages
    53

    Re : Détection de front montant

    Bonjour,

    Merci pour les informations.

    J'ai modifié mon code en mettant EtatPrecedant en variable statique.

    ca donne ca :

    Code:
    static EtatPrecedent;
    
    EtatPrecedent = 0;
    
    void SecuriteParking()
    {
    Etat = Entrees.Logiques.Etat.NA.E_PARK;
    
    if (Etat != EtatPrecedent)
       {
        if (Etat == 1)
           {
           TemporisationLance(TpParking, TEMPS_ATTENTE_PARKING);
           }
        EtatPrecedent = Etat;
        }
    }
    ca ne rentre toujours pas, et je ne sais pas si j'ai bien saisit ton explication

    Merci
     

  12. photon57

    Date d'inscription
    septembre 2011
    Messages
    2 055

    Re : Détection de front montant

    Hello,

    Si je comprends bien ton problème, tu cherches dans une fonction à vérifier si une variable (sur laquelle tu n'as pas vraiment la main) change de valeur et dans ce cas prend un valeur précise.
    Utiliser des variables globales est mal (dans le sens croiser les effluves, il ne faut pas sauf en dernier recours si tu n'as plus aucune autre solution). Le C offre une alternative intéressante : déclarer une variable locale static, sa durée de vie sera celle du programme mais sa visibilité sera locale et seulement initialisée une fois. Regarde cet exemple :

     Cliquez pour afficher


    Dans le main je teste la variable truc deux fois après chaque changement de valeur. La programme provoque cette sortie :

    Code:
    main   : truc=0
    tester : premier appel,initialiasation avec 0 comme ancienne valeur
    tester : aucun changement
    main   : truc=1
    tester : var a changé de 0 à 1
    tester : aucun changement
    main   : truc=3
    tester : var a changé de 1 à 3
    tester : aucun changement
    main   : truc=2
    tester : var a changé de 3 à 2
    tester :        var==2 : Je me déclenche
    tester : aucun changement
    main   : truc=8
    tester : var a changé de 2 à 8
    tester : aucun changement
    main   : truc=2
    tester : var a changé de 8 à 2
    tester :        var==2 : Je me déclenche
    tester : aucun changement
    Remarques :

    * Tu ne détectes les changements que lors d'appel à la fonction tester, tu n'as pas le comportement désiré dans un cas de figure comme :
    Code:
      ...
      truc=0;
      truc=3;
      tester(truc);
      truc=2;
      truc=4;
      tester(truc);
      ...
    Si ton code modifie la valeur de la variable, alors tu peux (dois) tester à chaque affectation.

    * Pièce jointe 168746 et évidemment à l'indentation de ton code
     

  13. Amine_34

    Date d'inscription
    juillet 2010
    Messages
    53

    Re : Détection de front montant

    J'ai bien compris le code que tu m'a présenté et je t en remercie

    pour bien expliquer ma situation

    Je me propose de bien montrer ou cette fonction intervient :

    Voila, j'ai deux fichiers : un <main.c> et un <securite.c>

    dans le main.c j'ai :

    Code:
    int main ()
    {
    SecuritesInitialise ();
    
    EtatSysteme.PremiereBoucle = 1; // cette variable est déja déclarée dans le .h
    
    for ( ; ; EtatSysteme.PremiereBoucle = 0)
        {
        SecuritesGere();
        }
    }
    dans la fonction securiites.c j'ai :

    Code:
    int etat = 0;
    static int etatprecedent = 0;
    
    void SecuritesInit()
    {
    
    // La je ne met rien qui soit en rapport avec ma fonction "detection de front montant"
    
    }
    
    void SecuriteGere ()
    {
    EtatPrecedent = Etat;
    Etat = Entrees.Logiques.Etat.NA.E_PAR K;
    
    if (Etat != EtatPrecedent)
       {
       if (Etat == 1)
           {
           TemporisationLance(TpParking, TEMPS_ATTENTE_PARKING); // fonction déclarée au préalable
           }
       }
    
    }
    donc voila tout.

    et avec ca, je ne rentre jamais dans le if () et donc ma tomporisation ne se lance pas
     

  14. photon57

    Date d'inscription
    septembre 2011
    Messages
    2 055

    Re : Détection de front montant

    Tu as passé ton code au debuger en mettant un break en entrée de SecuriteGere puis en faisant du pas à pas en inspectant la valeur des variables ?


    ... ou à défaut en insérant des printf ????
     

  15. Amine_34

    Date d'inscription
    juillet 2010
    Messages
    53

    Re : Détection de front montant

    Je n'ai pas de debuger pour l'instant, c'est pour ca que je n'arrive pas a faire une verification pas a pas !

    donc je dois me debrouiller sans ca !

    mais pour Etatprecedent, je ne sais pas si je dois la déclarer comme je l'ai fait
     


    • Publicité




Poursuivez votre recherche :




Sur le même thème :




 

Discussions similaires

  1. Transformer un front descendant à un front montant!!
    Par hissokaaaa dans le forum Électronique
    Réponses: 8
    Dernier message: 15/02/2010, 16h20
  2. Détecteur de front montant et front descendant
    Par sbooby dans le forum Électronique
    Réponses: 3
    Dernier message: 17/03/2009, 17h52
  3. détection de front montant sous Quartus
    Par mokermann dans le forum Électronique
    Réponses: 7
    Dernier message: 23/07/2008, 22h07
  4. front montant
    Par frenchy dans le forum Électronique
    Réponses: 12
    Dernier message: 21/01/2007, 19h24
  5. Detecter un front montant
    Par Nickyo dans le forum Électronique
    Réponses: 1
    Dernier message: 11/04/2005, 23h40