LOCODUINO

Aide
Forum de discussion
Dépôt GIT Locoduino
Flux RSS

mercredi 24 avril 2024

Visiteurs connectés : 57

Les Timers (III)

Comparaisons et interruptions

. Par : Christian

Rôle d’un registre OCR On peut charger un nombre dans le registre OCR2A ; lorsque le timer 2, en comptant, devient égal à OCR2A (les deux valeurs correspondent, ce qui se dit Match en anglais), cela provoque la mise à 1 d’un flag appelé OCF2A , qui est le bit 1 du registre TIFR2 (Timer/Counter 2 Interrupt Flag Register) et si on a autorisé (...)

Retourner à l'article

Vous répondez à :

Initialisation valeur TOP du TIMER 1 en mode CTC .... 29 septembre 2019 23:18, par Michel RIAZUELO

Bonjour à tous,

Je me préparais à faire un petit retour pour remercier les rédacteurs des articles sur les timers qui m’ont permis de découvrir et d’explorer leur monde merveilleux et présenter pour exemple un sujet sur lequel je travaille.

Il s’agit de commander 4 servos de RC (en fait les 4 ESC d’un drone) dans le temps le plus court possible. La durée maxi si on les commande les uns après les autres est de 8 ms (4 x 2) ce qui pour mon application est trop long.
J’ai donc imaginé un système qui réalise les commandes (sur 4 pins de l’ARDUINO) en décalant leurs débuts de 1 ms.

Ainsi la durée maxi de transmission est de 5 ms (3 + 2, 3 pour le début du 4ème créneau et 2 étant la durée maxi d’un créneau de commande d’un servo et donc du dernier)
J’ai donc fait un proto (qui marche fort bien) en utilisant le TIMER 1 en mode CTC et dont l’interruption réalise l’intégralité du travail en 7 passes, les actions sur le PORTD (pins qui commandent les servos) et l’enchainement.
Cela se réalise en changeant à chaque passe la valeur de comparaison pour le déclenchement de l’interruption suivante.
En "pistant" les différentes actions avec le moniteur, les choses semblent se passer comme attendu, un servo connecté à une des 4 sorties se comporte aussi comme attendu et l’oscilloscope confirme aussi que les broches de sorties évoluent comme attendu.

C’est de ceci que je voulais parler mais patatras, en retrouvant mon post du 11 Mai, j’ai relu l’article sur le mode CTC et HORREUR, je me suis rendu compte que j’avais considéré que le TIMER continuait à compter après avoir lancé l’interruption. Ce comportement m’allait bien pour cadencer mon enchainement depuis le moment initial (avec RAZ de TCNT1) ou la "salve" des 4 créneaux est lancée.

Hors il est dit qu’EN MÊME TEMPS que l’interruption est lancée il se remet à ZERO AUTOMATIQUEMENT ....

J’ai donc refait toute une série de vérifications et il semble bien qu’avec mon code, ce n’est pas le cas.

Cela me plonge évidemment dans un abime de réflexion. J’ai fait une version du code en considérant cette RAZ automatique en modifiant en conséquence les valeurs successives de OCR1A et j’obtiens n’importe quoi. Avec ce code, en forçant la RAZ de TCNT1 à chaque occurence de l’interruption, ça remarche !
J’ai aussi constaté qu’à la fin du cycle, après le déclenchement des 7 interruptions, la valeur TCNT1 montre bien qu’il ne s’est pas remis à 0 !

 ?????
Est-ce que ma façon de paramétrer le TIMER1 n’est pas orthodoxe ? Est-ce que je me laisse aveugler par une évidence ?

Le code peut être récupéré ICI :

Merci par avance aux curieux qui prendront le temps de chercher à comprendre. Je sais, c’est un souhait déraisonnable :-)

Bien cordialement,
Michel

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.)

32 Messages

Rubrique Programmation

Le monde des objets (1)

Le monde des objets (2)

Le monde des objets (3)

Le monde des objets (4)

Les pointeurs (1)

Les pointeurs (2)

Les Timers (I)

Les Timers (II)

Les Timers (III)

Les Timers (IV)

Les Timers (V)

Bien utiliser l’IDE d’Arduino (1)

Bien utiliser l’IDE d’Arduino (2)

Piloter son Arduino avec son navigateur web et Node.js (1)

Piloter son Arduino avec son navigateur web et Node.js (2)

Piloter son Arduino avec son navigateur web et Node.js (3)

Piloter son Arduino avec son navigateur web et Node.js (4)

Démarrer en Processing (1)

L’assembleur (9)

Comment gérer le temps dans un programme ?

L’assembleur (8)

Processing pour nos trains

L’assembleur (7)

L’assembleur (6)

Arduino : toute première fois !

TCOs en Processing (1)

L’assembleur (5)

L’assembleur (4)

L’assembleur (3)

L’assembleur (2)

L’assembleur (1)

TCOs en Processing (2)

Calculer avec l’Arduino (1)

La programmation, qu’est ce que c’est

Types, constantes et variables

Installation de l’IDE Arduino

Répéter des instructions : les boucles

Les interruptions (1)

Instructions conditionnelles : le if ... else

Instructions conditionnelles : le switch ... case

Comment concevoir rationnellement votre système

Comment gérer l’aléatoire ?

Trucs, astuces et choses à ne pas faire !

Calculer avec l’Arduino (2)

Les structures

Systèmes de numération

Les fonctions

Trois façons de déclarer des constantes

Transcription d’un programme simple en programmation objet

Ces tableaux qui peuvent nous simplifier le développement Arduino

Les chaînes de caractères

Les derniers articles

L’assembleur (9)


Christian

L’assembleur (8)


Christian

L’assembleur (7)


Christian

L’assembleur (6)


Christian

L’assembleur (5)


Christian

L’assembleur (4)


Christian

L’assembleur (3)


Christian

L’assembleur (2)


Christian

L’assembleur (1)


Christian

TCOs en Processing (2)


Pierre59

Les articles les plus lus

Les Timers (I)

Les interruptions (1)

Instructions conditionnelles : le if ... else

Ces tableaux qui peuvent nous simplifier le développement Arduino

Comment gérer le temps dans un programme ?

Les chaînes de caractères

Piloter son Arduino avec son navigateur web et Node.js (1)

Bien utiliser l’IDE d’Arduino (1)

Calculer avec l’Arduino (2)

Calculer avec l’Arduino (1)