Les Timers (V)
L’unité de capture d’entrée
. Par : Christian
Vous répondez à :
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
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 :)
-
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.
-
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é. } }
-
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 4294967293j’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
-
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-
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
-
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
-
-
-
-
-
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)); }
-
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
-
-
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-
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.
-