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 :

[PIC] Détecter un front montant et executer une tâche


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut [PIC] Détecter un front montant et executer une tâche
    Bonjour,

    Je cherche à écrire un code en C18 pour Pic, qui me permettrait d'exécuter une tâche spécifique lorsqu'une entrée (IN1) voit son niveau passer de 0 à 1 ( front montant ) :

    1er front montant:
    IN1 est l'entrée concernée __|------|__
    front montant détecté ici --->
    La tâche est exécutée

    2eme front montant:
    IN1 est l'entrée concernée __|------|__
    front montant détecté ici --->
    La tâche est exécutée

    etc ...


    Par contre aucune tâche ne devra pas s'exécuter si l'entrée IN1 passe de 1 à 0
    ---|___|---


    Pourriez vous m'aider à réaliser ce code ( je ne peux pas utiliser les interruptions du PIC )

    Merci à vous,

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    D'abord, il faut que la tâche à exécuter soir plus courte que le temps prévisible ou mini entre 2 fronts montants.

    Ensuite, si tu ne peux/veux pas utiliser les interruptions, tu vas être en pooling sur un font montant, c'est à dire que tu vas être en attente active sur ce front et donc tu vas consommer de la CPU pour rien (pas très cool pour les autres tâches).

    Autre chose, est ce que tu connais la durée mini d'établissement de ton signal ?

    Admettons que tu testes périodiquement ce front montant de manière active, il faudra poller à une fréquence supérieure à la durée mini d'établissement du signal sinon, tu vas manquer des fronts montants.

    Quelle est la fréquence de ton front et sa durée ?

    C'est marrant, mais je ne sens pas la solution active par polling. La meilleure solution reste les interruptions (c'est d'ailleurs fait pour cela).
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    Le front montant est généré par un bouton poussoir actionné par un humain, la durée du front sera d'environ 1 seconde.


    L'idée de venir scruter toutes les x ms l'état de l'entrée me semble une bonne idée, je pourrai ajouter cette fonction dans une boucle infinie déja existante.

    par contre je ne sais pas écrire le reste du code pour détecter le front montant

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par lcoulon Voir le message
    par contre je ne sais pas écrire le reste du code pour détecter le front montant
    Je t'ai mis le pseudo code pour les 4 états

    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
    if( (old_state == 0) && (new_state == 1) )
    {
       // traitement sur front montant
       old_state = 1;
    }
    else if( (old_state == 1) && (new_state == 0) )
    {
       // traitement sur front descendant
       old_state = 0;
    }
    else if( (old_state == 0) && (new_state == 0) )
    {
       // pas de changement d'état : front bas
    }
    else if( (old_state == 1) && (new_state == 1) )
    {
       // pas de changement d'état : front haut
    }
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    Merci,

    Pour utiliser ces conditions qui détectent l'état du front, il faut que l'entrée concernée IN1 puisse mettre à jour old_state et new_state, en fonction de son état , n'est ce pas ?

    C'est là ma difficulté

    Je peux dans mon programme, faire passer :

    new_state = 1 si IN1 =1

    mais si :
    IN1 = 0 je ne sais pas si je dois mettre old_state = 0 ou au contraire new_state = 0 ...

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Pseudo code:
    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
    int old_state = read(IN1);
    every (delay)
    {
       int new_state = read(IN1);
     
       if( (old_state == 0) && (new_state == 1) )
       {
          // traitement sur front montant
          old_state = 1;
       }
       else if( (old_state == 1) && (new_state == 0) )
       {
          // traitement sur front descendant
          old_state = 0;
       }
       else if( (old_state == 0) && (new_state == 0) )
       {
          // pas de changement d'état : front bas
       }
       else if( (old_state == 1) && (new_state == 1) )
       {
          // pas de changement d'état : front haut
       }
    }
    La principale difficulté est de lire la valeur de IN1 mais là, je dirais que c'est ton problème puisque c'est ton hardware (en gros, je ne sais pas t'en dire plus )

    L'autre difficulté est d'appeler régulièrement la fonction every()

    Au fait, tu dis que le changement d'état de IN1 est lié à un bouton poussoir pressé par l'utilisateur. J'espère qu'il y a quelque chose pour remettre en forme le signal en sortie de bouton poussoir pour avoir des changement d'état propres car le changement d'état d'un BP produit en général des oscillations du signal (regarde avec un oscillo)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Détecter un front montant?
    Par Rdorange dans le forum C#
    Réponses: 2
    Dernier message: 09/04/2009, 09h45
  2. Executer une application a partir d'un formulaire
    Par ibticeme dans le forum IHM
    Réponses: 36
    Dernier message: 26/10/2006, 22h16
  3. executer une application a distance : Sockets ? RPC ? CORBA?
    Par a_hic dans le forum Développement
    Réponses: 5
    Dernier message: 30/05/2006, 13h02
  4. [Debutant(e)][Système]Executer une commande DOS
    Par iceman dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 18/05/2004, 14h30
  5. Réponses: 2
    Dernier message: 23/03/2004, 12h23

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