Go Down

Topic: Fonctionnement des timers pendant les routines d'interruptions sur l'Arduino Due (Read 1 time) previous topic - next topic

TheRealXav

Bonjour,

Je travaille avec un Arduino depuis peu, pour un projet de stage, et j'ai voulu utiliser le timer0 pendant une routine d'interruption.
En gros dans mon setup j'initialise le timer comme ça :
Code: [Select]

  TC0->TC_CHANNEL[0].TC_CMR = TC_CMR_TCCLKS_TIMER_CLOCK1;     //MCK / 128*/



et ma routine d'interruption ressemble à ça :

Code: [Select]

if(digitalRead(P_L[0]) == LOW){
  digitalWrite(P_L[0],HIGH);
  TC0->TC_CHANNEL[0].TC_CCR = TC_CCR_CLKEN | TC_CCR_SWTRG;
  int pulse_duration = TC0->TC_CHANNEL[0].TC_CV;
  while (pulse_duration <= 844800){
    digitalWrite(P_OUT[0],HIGH);
    pulse_duration = TC0->TC_CHANNEL[0].TC_CV;
  }
  digitalWrite(P_OUT[0],LOW);
  TC0->TC_CHANNEL[0].TC_CCR = TC_CCR_CLKDIS;
}
else if(digitalRead(P_L[0]) == HIGH){
  digitalWrite(P_L[0],LOW);
  TC0->TC_CHANNEL[0].TC_CCR = TC_CCR_CLKEN | TC_CCR_SWTRG;
  int pulse_duration = TC0->TC_CHANNEL[0].TC_CV;
  while (pulse_duration <= 844800){
    digitalWrite(P_OUT[1],HIGH);
    pulse_duration = TC0->TC_CHANNEL[0].TC_CV;
  }
  digitalWrite(P_OUT[1],LOW);
  TC0->TC_CHANNEL[0].TC_CCR = TC_CCR_CLKDIS;
}



L'idée c'est de faire un pulse de 20ms sur l'une ou l'autre des sorties en fonction de l'état d'une LED.
Ayant déjà trouvé une alternative, je poste ceci juste par curiosité, j'ai testé les commandes dans un autre code, malheureusement supprimé, pour créer un blink tout simple d'une LED et ça marchait.

Par contre quand je veux activer le timer dans mon interruption, je ne sors pas de la boucle, j'en déduis donc que le timer ne compte pas quand on est dans une routine d'interruption.

Qu'en pensez vous ? Je n'ai pas trouvé de sujet disant explicitement que le timer était activé ou désactivé durant les interruptions, mais de ce que j'ai lu il me semblait qu'il devrait fonctionner.

Le code ci dessus est tiré de ma mémoire parce que comme je l'ai dit j'ai trouvé une alternative et suis passé à autre chose, mais ça m'intrigue quand même.

Je sais que vouloir faire durer une interruption 20ms est probablement absurde et je pense que ça choquera certains, mais au delà de ça c'est le comportement du timer lui même qui est interessant, à savoir si effectivement il peut compter durant la routine d'interruption ou non, et sinon, si il est possible de le forcer à s'activer.

Merci pour votre attention

kamill

Bonjour,

Je ne connais pas la Due, mais ça m'étonnerai que le timer ne compte pas pendant les interruptions.

TheRealXav

Moi aussi ça m'étonne, je pense que j'ai peut-être oublié quelque chose dans mon code. A ce moment ma question deviendrait :"Sachant que les fonctions delay(), millis() et micros() ne peuvent être utilisées durant les interruptions, comment définir un délai quelconque durant une interruption ?"
Là encore je sais que les interruptions doivent être les plus courtes possible, mais l'idée c'est de savoir si c'est faisable, et ensuite réfléchir à ça porterait préjudice à mon code de le faire ou non.

En tout cas merci pour cette réponse rapide.

bilbo83

Bonjour,

Les possibilités des TC sur DUE sont nombreuses.
Au niveau des horloges, c'est très souple, donc très compliqué.
Les nombreux registres utilisateur permettent énormément de choses.
D'après ce que j'ai compris en lisant la doc du µP, selon le paramétrage, le compteur peut ou pas compter.

Je te conseille de lire en détail la doc du SAM, paragraphe 37.
Bon courage.

Roger.

Go Up