Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 11 sur 11
  1. #1
    Invité de passage
    Profil pro amine boujab
    Inscrit en
    juillet 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Nom : amine boujab

    Informations forums :
    Inscription : juillet 2010
    Messages : 6
    Points : 0
    Points
    0

    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 :
    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 chevronné
    Avatar de Kirilenko
    Homme Profil pro Lucas Pesenti
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Nom : Homme Lucas Pesenti
    Âge : 17
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2011
    Messages : 234
    Points : 762
    Points
    762

    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
    Invité de passage
    Profil pro amine boujab
    Inscrit en
    juillet 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Nom : amine boujab

    Informations forums :
    Inscription : juillet 2010
    Messages : 6
    Points : 0
    Points
    0

    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 chevronné
    Avatar de Kirilenko
    Homme Profil pro Lucas Pesenti
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Nom : Homme Lucas Pesenti
    Âge : 17
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2011
    Messages : 234
    Points : 762
    Points
    762

    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
    Invité de passage
    Profil pro amine boujab
    Inscrit en
    juillet 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Nom : amine boujab

    Informations forums :
    Inscription : juillet 2010
    Messages : 6
    Points : 0
    Points
    0

    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 :
    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 chevronné
    Avatar de Kirilenko
    Homme Profil pro Lucas Pesenti
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Nom : Homme Lucas Pesenti
    Âge : 17
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2011
    Messages : 234
    Points : 762
    Points
    762

    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
    Invité de passage
    Profil pro amine boujab
    Inscrit en
    juillet 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Nom : amine boujab

    Informations forums :
    Inscription : juillet 2010
    Messages : 6
    Points : 0
    Points
    0

    Par défaut

    oui je l appel dans une boucle, et je ne comprend vrmnt pas prk ca ne rentre pas !!!!

  8. #8
    Membre Expert
    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 222
    Points
    2 222

    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 :
    1
    2
    3
    4
    bool isUpFront ()
    {
         return Entrees.Logiques.Etat.NA.E_PARK & 0x00000001;  //lecture hardware.
    }
    Code :
    1
    2
    3
    4
    5
    6
    7
    void securite ()
    {
          if (isUpFront())
          {
                TemporisationLance(TpParking, TEMPS_ATTENTE_PARKING); 
          }
    }

  9. #9
    Responsable Modération
    Avatar de diogene
    Homme Profil pro Patrick Gonord
    Enseignant Chercheur
    Inscrit en
    juin 2005
    Messages
    5 664
    Détails du profil
    Informations personnelles :
    Nom : Homme Patrick Gonord
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2005
    Messages : 5 664
    Points : 12 539
    Points
    12 539

    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 :
    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
    Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    2 644
    Détails du profil
    Informations personnelles :
    Âge : 27
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2009
    Messages : 2 644
    Points : 6 315
    Points
    6 315

    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).
    Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a

    Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

    Pour vos problèmes d'embarqué, utilisez le forum dédié !

  11. #11
    Membre chevronné
    Avatar de bpy1401
    Homme Profil pro Patrick
    Ingénieur développement logiciels
    Inscrit en
    mars 2003
    Messages
    449
    Détails du profil
    Informations personnelles :
    Nom : Homme Patrick
    Âge : 53
    Localisation : France, Eure (Haute Normandie)

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

    Informations forums :
    Inscription : mars 2003
    Messages : 449
    Points : 723
    Points
    723

    Par défaut

    Bonjour à tous

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


    Code :
    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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •