IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Détection de front montant


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut 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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    void main ()
    {
    int Etat = 0;
    int EtatPrecedent = 0;
     
    securite ();
    }
     
    void securite ()
    {
    EtatPrecedent = Etat;
    Etat = Entrees.Logiques.Etat.NA.E_PARK;
     
    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

  2. #2
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Bonjour,

    - merci d'utiliser les balises codes.
    - je suis plutôt novice dans ce style de programmation, mais c'est normal que tu ne passes pas Etat et EtatPrecedent en paramètre à ta fonction sécurité ?
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    j ai bien déclaré etat et etatprecedent dans ma fonction securite

    ca compile, mais c est juste que ca ne rentre pas dans la boucle

    Merci pour ta réponse

  4. #4
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Nous manquerait-il une partie du code dans ce cas-là ? Je ne vois aucune déclaration de variable moi. Je te crois quand tu dis que ça compile, mais en l'état...
    Non parce que je suis intrigué en fait.
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    je comprend

    Au fait c est un code bcp plus lourd.

    Mais pour résumer j'ai choisit de faire une fonction qui traduit ce que je cherche a faire.

    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 :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    void securite ()
    {
    int Etat = 0;
    int EtatPrecedent = 0;
     
    EtatPrecedent = Etat;
    Etat = Entrees.Logiques.Etat.NA.E_PARK;
     
    if (Etat != EtatPrecedent)
    {
    if (Etat == 1)
    {
    TemporisationLance(TpParking, TEMPS_ATTENTE_PARKING);
    }
    }
    }
    ca seré plutt ca

  6. #6
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Ok merci, je vais pouvoir dormir tranquille.

    Bon, ta logique me semble globalement bonne, mais tu appelles ta fonction dans une boucle ?
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    oui je l appel dans une boucle, et je ne comprend vrmnt pas prk ca ne rentre pas !!!!

  8. #8
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Points : 2 502
    Points
    2 502
    Par défaut
    Bonsoir,

    Il n'est pas impossible que la lecture du registre matériel Entrees.Logiques.Etat.NA.E_PARK retourne plus de bit qu'attendu.

    Du coup le bit0 (de poid faible) vaut peut être bien 1, mais d'autres bits sont également à 1.
    Et par conséquent, le test == 1 ne sera jamais vrai.
    Il est également possible que E_PARK soit un registre à plusieurs bits.
    Et que le bit de indiquant le front ne soit pas le bit de poids faible. (décalage à faire).
    Ou bien le registre est à reseter pour qu'il mémorise un nouveau front.

    L'idéal est de vérifier dans une sortie de log ou au débugger la valeur de ce registre. (passage de 0 à 1, et de 1 à 0 ?)
    Et au besoin de forcer l'état avec un & binaire, comme dans l'exemple ci-dessous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool isUpFront ()
    {
         return Entrees.Logiques.Etat.NA.E_PARK & 0x00000001;  //lecture hardware.
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void securite ()
    {
          if (isUpFront())
          {
                TemporisationLance(TpParking, TEMPS_ATTENTE_PARKING); 
          }
    }

  9. #9
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par amine_34 Voir le message
    oui je l appel dans une boucle, et je ne comprend vrmnt pas prk ca ne rentre pas !!!!
    Et si tu montrais vraiment le code en cause, parce que dans ce que tu publies, il n'y a pas de boucles, ça simplifierait la résolution du problème !

    Il semble que ton code soit équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void securite ()
    {
       // int Etat  = 0;
       // int EtatPrecedent = 0; 
       // EtatPrecedent = Etat;   donc EtatPrecedent = 0
       int Etat = Entrees.Logiques.Etat.NA.E_PARK; 
       //if (Etat != EtatPrecedent)   EtatPrecedent vaut toujours 0 -> if(Etat !=0)
       //{
       if (Etat == 1)                 // donc Etat est bien != 0
       {
           TemporisationLance(TpParking, TEMPS_ATTENTE_PARKING);
       }
      //}
    }
    Une remarque : si la donnée à tester (Entrees.Logiques.Etat.NA.E_PARK) peut être modifiée par un évènement extérieur imprévisible par le programme, il est bon de la déclarer volatile pour éviter que le compilateur n'opère dessus des optimisations (en lui laissant la possibilité de supposer que sa valeur n'a pas changé) et le forcer à relire cette valeur à chaque fois qu'on en a besoin.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  10. #10
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Je vois des variables Etat et EtatPrecedent, ne serait-ce pas des variables à déclarer en tant que static ?

    Autre question : tu ne peux pas faire une interruption sur ton entrée logique ? Attendre un front dans une boucle, c'est de l'attente active, ça ne s'utilise que dans des situations où l'arrivée est nécessaire pour continuer le programme (genre de top départ).

  11. #11
    Membre éclairé
    Avatar de bpy1401
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2003
    Messages
    471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2003
    Messages : 471
    Points : 831
    Points
    831
    Par défaut
    Bonjour à tous

    Moi, je l'aurais codé comme ceci (mis à part les modifications faites pour être testé sur PC)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    int Etat = 0;
    int Etattest;
     
    void securite (void)
    {
      static int EtatPrecedent = 0;
     
       Etat = Etattest /*Entrees.Logiques.Etat.NA.E_PARK;*/;
     
      if (Etat != EtatPrecedent)
      {
        EtatPrecedent = Etat;
        if (Etat == 1)
        {
            printf("Temporisation lancee\n"); 
    		/*TemporisationLance(TpParking, TEMPS_ATTENTE_PARKING);*/
        }
      }
    }
     
    void main (void)
    {
     
      securite ();
      Etattest = 1;
      securite ();
      Etattest = 0;
      securite ();
      Etattest = 1;
      securite ();
    }
    Cordialement
    Page sur Developpez : http://pbriand.developpez.com

Discussions similaires

  1. Détection front montant sur un booléen
    Par Spyro29 dans le forum LabVIEW
    Réponses: 2
    Dernier message: 11/05/2012, 11h21
  2. Calcul temps de Marche sur front montant
    Par ARAGORN93 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/02/2008, 23h01
  3. front montant sur bit dans un mot
    Par Baxter67 dans le forum C++Builder
    Réponses: 0
    Dernier message: 23/01/2008, 23h08
  4. Capture de fronts montants avec un PIC16F876
    Par sylvain42 dans le forum C
    Réponses: 3
    Dernier message: 12/06/2006, 14h48
  5. [FW2.0][VB.net] évenement front montant
    Par grand_prophete dans le forum Windows Forms
    Réponses: 9
    Dernier message: 09/05/2006, 17h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo