LOCODUINO

Les Timers (V)

L’unité de capture d’entrée

. Par : Christian

Structure du timer1 La figure 1 montre le schéma synoptique du timer1 ; dans cette figure, la lettre n qui est le numéro du timer vaut 1. On remarque tout d’abord une grande ressemblance avec la figure 1 de l’article Les Timers (IV). Figure 1Architecture du bloc timer à l’intérieur du microcontrôleur ATmega328P Le signal d’horloge clkTn (…)

Retourner à l'article

Vous répondez à :

Les Timers (V) Calcul du temps d’appuis d’un BP 16 juin 2017 15:26, par Anoyme

Bonjour et merci pour les cours, qui m’ont permis de presque tout comprendre sur les TImers. J’essaie de calculer a l’aide du Timer1 le temps qu’un bouton poussoir est appuyé comme vous le dites dans le cours, mais je suis bloqué.
En effet je n’arrive pas a avoir une aquisition sur front montant puis sur front descendant. J’ai soit l’un ou l’autre.

#define poussoirPin 8
unsigned long duree = 0;
float event = 0;
int nombre = 0;

void setup() {

  pinMode (poussoirPin, INPUT_PULLUP);
  Serial.begin(115200);
  noInterrupts();
  TCCR1A = 0;
  TCCR1B = 0b00000010; // prediviseur 8  table 16-5 doc atmegaICES1 front descendant =06emebit 7eme bit noise cancel
  TIMSK1 = 0b00100001; // autorisation interruption TOV et Input Capture
  TCNT1 = 0;
  ICR1 = 0;
  interrupts();
}


ISR(TIMER1_CAPT_vect) {
  TCCR1B = 0b00000010;   //front descendant
  Serial.println("Appuye");
  /*duree = millis();
  event = nombre * 32.7675 + ICR1 * 0.0000005;
  Serial.println(nombre);
  Serial.println(duree);
  Serial.println(event);*/
  TIFR1 = 0b00100000;            //reset du flag 
  TCCR1B = 0b01000010;          //front montant
  Serial.println("Relache");
}

void loop() {

}

Voici mon code, pouvez m’éclairer ? Je suppose que c’est l’endroit ou je demande au Timer de passer en front montant qui est pas au bon endroit. Mais je ne vois pas comment faire.

Merci de votre aide :)

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.

Lien hypertexte

(Si votre message se réfère à un article publié sur le Web, ou à une page fournissant plus d’informations, vous pouvez indiquer ci-après le titre de la page et son adresse.)

11 Messages

  • Les Timers (V) Calcul du temps d’appuis d’un BP 16 juin 2017 15:26, par Anoyme

    Bonjour et merci pour les cours, qui m’ont permis de presque tout comprendre sur les TImers. J’essaie de calculer a l’aide du Timer1 le temps qu’un bouton poussoir est appuyé comme vous le dites dans le cours, mais je suis bloqué.
    En effet je n’arrive pas a avoir une aquisition sur front montant puis sur front descendant. J’ai soit l’un ou l’autre.

    #define poussoirPin 8
    unsigned long duree = 0;
    float event = 0;
    int nombre = 0;
    
    void setup() {
    
      pinMode (poussoirPin, INPUT_PULLUP);
      Serial.begin(115200);
      noInterrupts();
      TCCR1A = 0;
      TCCR1B = 0b00000010; // prediviseur 8  table 16-5 doc atmegaICES1 front descendant =06emebit 7eme bit noise cancel
      TIMSK1 = 0b00100001; // autorisation interruption TOV et Input Capture
      TCNT1 = 0;
      ICR1 = 0;
      interrupts();
    }
    
    
    ISR(TIMER1_CAPT_vect) {
      TCCR1B = 0b00000010;   //front descendant
      Serial.println("Appuye");
      /*duree = millis();
      event = nombre * 32.7675 + ICR1 * 0.0000005;
      Serial.println(nombre);
      Serial.println(duree);
      Serial.println(event);*/
      TIFR1 = 0b00100000;            //reset du flag 
      TCCR1B = 0b01000010;          //front montant
      Serial.println("Relache");
    }
    
    void loop() {
    
    }

    Voici mon code, pouvez m’éclairer ? Je suppose que c’est l’endroit ou je demande au Timer de passer en front montant qui est pas au bon endroit. Mais je ne vois pas comment faire.

    Merci de votre aide :)

    Répondre

  • Les Timers (V) 17 juin 2017 10:54, par Jean-Luc

    Bonjour,

    Dans votre ISR, vous n’avez aucun code pour distinguer si l’ISR était appelée sur un front descendant ou sur un front montant. Et quoiqu’il en soit vous terminez en programmant la sensibilité sur front montant. Donc, à part la première fois, et pendant le court intervalle de temps entre le début et la fin de l’ISR, ce n’est jamais sensible au front descendant.

    Il faut que vous teniez compte de la sensibilité qui a déclenché l’ISR afin de la reprogrammer à l’inverse. Quelque chose comme ça :

    ISR(TIMER1_CAPT_vect) {
      TIFR1 = 0b00100000; // reset du flag 
      if (TCCR1B & 0x40) {
        // l'ISR a été déclenchée par un front montant
        TCCR1B = 0b00000010; // programme sensibilité front montant
        Serial.println("Appuye");
      }
      else {
        // l'ISR a été déclenchée par un front descendant
        TCCR1B = 0b01000010;   // programme sensibilité front descendant
        Serial.println("Relache");
      }
    }

    C’est non testé.

    Par ailleurs vous n’avez pas mis ICNC1 à 1.

    Répondre

  • Les Timers (V) 20 juin 2017 11:22, par Anoyme

    Bonjour, après pas mal d’essais j’ai réussi a compter le temps ou mon BP reste enfoncé. Je transmets le code des fois que cela serve a quelqu’un. Comme vous pouvez le voir j’ai abandonné l’idée d’utiliser le Timer1, et je me suis rabattus sur le timer millis(). Merci de l’aide apportée :)

    const byte btnPin = 2;        // Bouton sur pin 2...
    const byte btnIrq = 0;       // Bouton sur pin 2, soit INT0 sur arduino UNO.
    unsigned long tFall = 0;     // Valeur de millis() lors du front descendant
    unsigned long tRise = 0;    // Valeur de millis() lors du front montant
    unsigned long tDiff = 0;    //Valeur appuie Bp
    
    void onRise(void);
    void onFall(void);
    void setup(void);
    void loop(void);
    
    void onFall() {                                     // Interruption lors d'un front descendant
      tFall = millis();                                // On sauvegarde la valeur de millis dans tFall
      attachInterrupt(btnIrq, onRise, RISING);        // Puis on passe la détection d'interruption sur front montant
    }
    
    void onRise() {                                     // Interruption lors d'un front montant
      tRise = millis();                                // On sauvegarde la valeur de millis dans tRise
      attachInterrupt(btnIrq, onFall, FALLING);       // Puis on passe la détection d'interruption sur front descendant
    }
    
    void setup(void) {                                  // Setup:
      attachInterrupt(btnIrq, onFall, FALLING);        // Détection d'interruption sur front descendant au départ
      Serial.begin(9600);                           // Serial à 11500 bauds
    }
    
    void loop(void) {
    
      if ( ( tRise != 0 ) && ( tFall != 0 ) ) {
        tDiff = tRise - tFall;
        Serial.println(tDiff);
        tFall = 0; tRise = 0;                       // on connait maintenant le temps que notre Bp a était appuyé.
      }
      
    }

    Répondre

    • Les Timers (V) 27 octobre 2019 22:43, par ANDRE

      Bonsoir, votre programme m’intéresse beaucoup je l’ai copié et téléversé dans mon arduino uno (officiel) mais j’ai des valeurs qui ne correspond à rien. J’ai fait un copier collé des résultats que je trouve :

      22:08:58.250 -> valeur bas 146725 valeur haute 146525 total 200
      22:08:58.296 -> valeur bas 146731 valeur haute 146741 total 0
      22:09:13.366 -> valeur bas 161842 valeur haute 161842 total 4294966646
      22:09:13.413 -> valeur bas 161846 valeur haute 161860 total 4294967293

      j’ai un résultat qui correspond bien à la différence entre les deux valeurs ; mais j’ai fait beaucoup d’essai mais pratiquement que des valeurs incohérente.

      J’aimerai avoir un programme qui me permettrai de calculer le temps de fonctionnement d’un appareille électrique ; additionner toutes les périodes quand il fonctionne comme un compteur horaire mais pour créer un programme pour moi s’est presque impossible.

      Donc votre programme correspond mais il doit y avoir un problème de compatibilité ou autres.

      J’ai fait quelque recherche mais je ne trouve pas.

      Pouvez-vous m’aider

      Répondre

      • Les Timers (V) 30 octobre 2019 01:25, par Christian

        Bonjour ANDRE,
        De quel programme parlez-vous : celui de mon article ou bien celui posté par un lecteur et situé au-dessus de votre question ?
        Christian

        Répondre

        • Les Timers (V) 30 octobre 2019 22:14, par andreyves@neuf.fr

          Bonjour Christian,

          Je parle du programme juste au-dessus de mon commentaire car il correspond à ce que je cherche. Je cherche à Calculer le temps de fonctionnement d’un appareil électrique avec mon ARDUINO UNO. On va dire un compteur qui additionne les temps de fonctionnement et grasse au temps je peux déterminer une consommation. Et donc dans son programme il parle de connaitre le temps d’appui sur un bouton poussoir , je me suis dis super ; mais j’ai des valeurs qui ne corresponds pas.

          Le programme de votre article je ne l’ai pas trop compris et je sais pas si je peux connaitre le temps d’appui pour après en faire un compteur.

          Voila ma demande n’est peut-être pas prise en charge sur votre site, mais je voulais poser la question.

          Bonne soirée.

          Monsieur ANDRE

          Répondre

          • Les Timers (V) 31 octobre 2019 12:19, par Christian

            Dans ce cas, je ne vais rien pouvoir faire, n’étant pas l’auteur de ce programme. De plus, il y a peu de chance que celui qui l’a écrit ait pu voir votre commentaire sauf s’il revient périodiquement sur le site.
            En plus, votre projet n’étant pas du modélisme ferroviaire, nous n’y donnerons pas suite.
            Bonne chance tout de même dans la réalisation de ce projet.
            Cordialement.
            Christian

            Répondre

  • Les Timers (V) 6 mars 2018 22:25, par stéphane

    Bonjour,
    vraiment génial ce tuto sur le timer1.
    j’ai enfin remplacé mon programme utilisant pulsin par l’utilisation d’une interruption sur front montant de l’entrée 8.
    Je lui entre avec un générateur de fonction un signal carré à fréquence fixe ça fonctionne a 1.675 microseconde près.
    Dès que je change la fréquence le programme plante, je dois faire un reset pour le relancer.
    avez vous une idée de ce qui peut se passer ?
    par avance merci.
    ci dessous mon code :

    //-------------------------------------------------------------------------------
    #define VolantMoteur 8
    int16_t dureeTotale = 0;
    
    void setup()
    {
    pinMode (VolantMoteur, INPUT_PULLUP);
    Serial.begin(115200);
    noInterrupts();
    // registre A
    //-bits 0 et 1 (WGM10 et WGM11)wave form generation
    //-bits 0 a 4 pour le mode de comparaison de sortie
    TCCR1A = 0;
    
    // registre B:
    //-bits 0,1 et 2 : selection source horloge ici 101-->sortie du prescaleur a 1024 duree de pas 64 µs
    //-bits 3 et 4 : WGM12 et WGM13 wave form generation
    //-bit 6 : ICES1 (Input Capture Edge Select), ICES1==0 front descendant/ICES1==1 front montant
    //-bit 7: ICNC1: Input Captur Noise Canceler: 1-->actif
    TCCR1B = 0b01000001; 
    
    //Timer counter Interrupt Mask Register:
    //-bit 5 :(Input Capture Interrupt Enable) qui, positionné à 1, permet de déclencher une interruption lorsqu’un événement a provoqué la recopie du timer1 dans le registre ICR1.
    //-bit 0 est le bit TOIE  (Timer Overflow Interrupt Enable) qui permet de déclencher une interruption lorsqu’il y a débordement du timer1.
    TIMSK1 = 0b00100001;
    
    TCNT1 = 0; 
    ICR1 = 0; 
    interrupts();
    }//fin setup
    
    ISR(TIMER1_CAPT_vect)
    {
    dureeTotale = ICR1;//lecture de la valeur du timer dans le registre ICR1
    TCNT1=0;//remise a zero du timer
    }
    
    void loop()
    {
    Serial.println(1000000/(dureeTotale*0.0625)); 
    } 

    Répondre

    • Les Timers (V) 9 mars 2018 17:40, par Christian

      Bonjour,

      Pour obtenir de l’aide sur la mise au point d’un programme, je vous invite à ouvrir un fil dans le forum de Locoduino.
      L’espace après les articles est plutôt réservé au signalement de passages peu clairs ou bien d’erreurs, donc à ce qui concerne l’article lui-même.
      Merci de votre compréhension.

      Christian

      Répondre

  • Les Timers (V) 19 décembre 2019 16:44, par Aurélien

    Bonjour, auriez vous des exemples d’utilisations concrète du TC 1 ?
    Merci

    Répondre

    • Les Timers (V) 20 décembre 2019 18:16, par Christian

      Les programmes donnés dans cette série d’articles sont déjà des exemples.
      Après, c’est à votre imagination de faire le reste, sachant qu’un timer n’est rien d’autre qu’un compteur de temps.
      Enfin, le choix d’utiliser le timer 0, 1 ou 2 dépend de ce que vous voulez faire avec ce timer et aussi de ce que votre programme fait en dehors : en effet, il est important de ne pas interférer avec les timers utilisés par certaines fonctions ou bibliothèques d’Arduino.

      Répondre

Rubrique Programmation

Les derniers articles

Les articles les plus lus