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

Arduino Discussion :

2 impulsions sur front montant


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 31
    Par défaut 2 impulsions sur front montant
    Bonjour à tous , je suis électronicien et je débute dans l'arduino .
    Mon projet est basé sur un ATtiny85 Digispark .
    J'ai réussi à le programmer donc l'IDE fonctionne !
    Maintenant je ne sais pas comment générer 2 impulsions de 15 secondes sur la sortie (P3) si sur l'entrée ( P2) j'ai un front montant qui est plus long que les sorties.
    voir chronogramme joint

    PS c'est mon premier post soyez indulgents et pédagoguesNom : chrono.png
Affichages : 344
Taille : 7,0 Ko

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 921
    Par défaut
    Salut
    si sur l'entrée ( P2) j'ai un front montant qui est plus long que les sorties
    je ne comprends pas, c'est pas possible... au moment du front vous ne pouvez pas savoir si le signal sur P2 va être plus long ou pas que votre sortie..

    au mieux vous pourrez générer les 2 impulsions "au bout d'un certain temps" et éventuellement si P2 est toujours HIGH... mais les fronts ne peuvent pas être simultanés à moins que vous ne considériez que c'est OK d'interrompre un des fronts de sortie si P2 tombe.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 31
    Par défaut
    Je sais que ce qui arrive sur P2 dure 1 minute.
    il faut que P3 tombe 15 sec monte 15 secondes et retombe 15 secondes puis remonte c'est pour modifier le fonctionnement d'un appareil existant donc les durées sont imposées

  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 921
    Par défaut
    Si vous êtes dans ce dernier cas, le code se résume à une simple machine à états qu'on pourrait décrire comme cela (code absolument non testé, tapé ici)
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    const byte pin2 = 2;
    const byte pin3 = 3;
     
    enum : byte {waitingp2Low, p2LOW, p3Pulse1, p3Pulse2, p3Pulse3} etat = waitingp2Low;
    unsigned long chrono;
     
    void gestionEtat() {
      switch (etat) {
     
        case waitingp2Low: // attente repos
          if (digitalRead(pin2) == LOW) etat = p2LOW; break;
     
        case p2LOW: // attente du front montant
          if (digitalRead(pin2) == HIGH) {
            digitalWrite(pin3, LOW); // lancement du front
            chrono = millis();
            etat = p3Pulse1;
          }
          break;
     
        case p3Pulse1: // si pin2 tombe on arrête, sinon on attend 15s
          if (digitalRead(pin2) == LOW) {
            digitalWrite(pin3, HIGH);
            etat = p2LOW;
          } else if (millis() - chrono >= 15000) { // on a atteint 15s
            digitalWrite(pin3, HIGH);
            chrono = millis();
            etat = p3Pulse2;
          }
          break;
     
        case p3Pulse2: // si pin2 tombe on arrête, sinon on attend 15s
          if (digitalRead(pin2) == LOW) {
            digitalWrite(pin3, HIGH);
            etat = p2LOW;
          } else if (millis() - chrono >= 15000) {
            digitalWrite(pin3, LOW);
            chrono = millis();
            etat = p3Pulse3;
          }
          break;
     
        case p3Pulse3: // si pin2 tombe on arrête, sinon on attend 15s
          if (digitalRead(pin2) == LOW) {
            digitalWrite(pin3, HIGH);
            etat = p2LOW;
          } else if (millis() - chrono >= 15000) {
            digitalWrite(pin3, HIGH);
            etat = waitingp2Low;
          }
          break;
      }
    }
     
    void setup() {
      pinMode(pin2, INPUT);
      pinMode(pin3, OUTPUT);
      digitalWrite(pin3, HIGH);
    }
     
    void loop() {
      gestionEtat();
    }
    (ici pour simplifier et rendre plus lisible, j'ai mis 3 états pour les 2 impulsions de la pin 3, on pourrait traiter cela avec une variable qui compte le nombre d'impulsion)

    On aura les 2 impulsions de 15s si le signal P2 dure plus de 30 secondes, mais on ne sait pas s'il va durer 60s. S'il fait 35 secondes on aura eu les impulsions.
    Si P2 fait 20 secondes on aura eu la première impulsion de 15 secondes et on interrompt

  5. #5
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 921
    Par défaut
    PS/ et bien sûr si vous voulez rester synchrone, il suffit d'utiliser delay(15000); pour attendre 15 secondes et "fabriquer" le signal de sortie.

  6. #6
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 253
    Par défaut
    Bonjour,
    Une autre solution consisterait à user des interruptions du Attiny85.

    La broche PB2 est interruptible sur changement d'état, voir datasheet PCINT2: Pin Change Interrupt 0, Source 2 ça veut dire qu'on peut créer une fonction d'interruption lorsqu'il y a un changement d'état de PB2 (un front montant ou descendant).

    Dans cette fonction d'interruption on peut régler le Timer interne 1, car il est connecté à PB3 voir datasheet OC1B: Complementary Timer/Counter1 Compare Match B Output pour qu'il créait des impulsions précises de 15s comme sur ton schéma.

    A+

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

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. Action sur front montant
    Par Stooo dans le forum Simulink
    Réponses: 1
    Dernier message: 27/04/2012, 20h52
  3. compteur sur front montant d'un contact sec
    Par boettez dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 28/08/2009, 12h52
  4. Calcul temps de Marche sur front montant
    Par ARAGORN93 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/02/2008, 23h01
  5. front montant sur bit dans un mot
    Par Baxter67 dans le forum C++Builder
    Réponses: 0
    Dernier message: 23/01/2008, 23h08

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