Y a t'il un moyen par #if d'identifier l'IDE utilisé ?
Si on pouvait faire çà de manière automatique ?
Je m’aperçois aussi que j'ai laissé par défaut le #define TIMER_DEBUG
Dans SoftTimer.h
#define TIMER_DEBUG 1
Ce define permet d'activer 2 méthodes utiles pour le debug :
void SoftTimer::printActive()
void print()
En le mettant en commentaire, on gagne le code en question ce qui peut être utile quand la flash commence à être bien remplie.
Description rajoutée dans le début du post.
Fait. Posté en 1.0a
Ajouté une section historique en fin de post avec les liens de téléchargements.
Bon, comme je découvre le Playground, je m'apperçois que cela a déjà été réalisé 25 fois minimum XD
Bonjour
Tu parles de l'exemple fournis ou d'un programme a toi ?
Le sketch d'exemple montre exactement comment faire une fonction périodique pour faire clignoter une led et un one-shot pour une action retardée.
Et sur ma UNO, le fonction de debug print() et printActive() marchent.
Ton programme fonctionne bien sûr sauf l'affichage qui refuse obstinément de fonctionner chez moi
Ma question portait simplement sur comment intégrer ton programme dans un programme utilitaire afin d'enclencher le clignotement ou le single-shot sur une condition
ex: if (digitalRead(A0) == HIGH) : devrait enclencher le clignotement, mais je ne vois pas quelle commande appeler dans le loop
C'est exactement le genre de librairie que je cherchait pour mon projet ! Merci
J'ai fait quelques essais en me basant sur l'exemple et cela fonctionne bien. Par contre je me demandais si il était possible, a l'instar de la méthode setpreriod, de modifier un paramètre de la classe dérivée, cela reviendrai par rapport à la démo à changer de "ledPin" alors que le timer est en cours ?
Peut être en ajoutant une méthode à la classe dérivée ?
Désolé je ne possède que des connaissances de bases en programmation.
casper22:
Ma question portait simplement sur comment intégrer ton programme dans un programme utilitaire afin d'enclencher le clignotement ou le single-shot sur une condition
ex: if (digitalRead(A0) == HIGH) : devrait enclencher le clignotement, mais je ne vois pas quelle commande appeler dans le loop
Pour un single-shot tu as dans mon exemple le déclenchement d'un single-shot sur appui sur un bouton. Je le fait sur interruption mais tu peut le faire aussi dans loop de la façon suivante :
Comme tu peut le constater, je ne lance le timer que s'il est arrêté. Car si le signal est toujours HIGH quand on repasse une 2nde fois, il ne faut pas relancer le timer qui coure déjà.
Et bien sur il faut TOUJOURS continuer a appeller SoftTimer::manage() dans la boucle puisque c'est là que ce fait le vrai boulot.
darkio03:
Peut être en ajoutant une méthode à la classe dérivée ?
Exactement, tu peux ajouter à la classe dérivée ce qui est nécessaire pour changer la pin de la led dynamiquement si tu en as besoin.
Je cherche un moyen de déclencher un code d'interruption 5ms précisément après la surevenue d'une PINinterruption, tout ceci hors du main loop, lancé directement pas ma PINinterruption.
Voici le résultat souhaité en image, la précision devra être de 4µs :
Penses-tu que je puisse utiliser ta librairie ? as-tu une autre idée plus "légère" ?
Sev
EDIT : Plus de précision sur mon projet ici, mais en anglais :
Ma lib est entièrement soft et repose sur la boucle loop() sans laquelle il faut appeller la fonction SoftTimer.manage();
Donc elle ne peut pas garantir une précision que si ton code lui garantie de s'exécuter suffisamment souvent.
La solution la plus fiable c'est d'utiliser un timer que tu armes depuis la routine d'interruption de l'entrée et qui déclenche un nouvelle interruption 5ms plus tard pour positionner ta sortie.
Si les 6 signaux d'entrée sont asynchrones, alors il te faut 6 entrées interruptions (ça c'est faisable) mais tu n'aura pas 6 timers.
Tu doit pouvoir t'en sortir avec un en faisant des calculs de dates pour régler le registre OC1
bonjour barbudor,
très bien la lib,
je suis débutant dans la prog de l'arduino.
et j'ai du mal à comprendre la mise en action d'un timer.
d’après ce que j'ai compris il faut faire une class de ce qu'on veut retarder ou faire clignoter ?
mais pour remplacer la fonction delay() on doit faire tout ce travail ou y a t il d'autre approche?
j'ai deux routines qui doivent arriver l'une après l'autre ( Routine 1 , Routine 2)seulement elles tournent en parallèle et bien sur ( Routine 2 va plus vite que Routine 1, j'ai bien tenté avec delay mais rien de bon.
Avec ta lib est ce possible de simuler une Fc° delay et que celle-ci ne paralyse pas le système?
merci de ta lecture.
barbudor:
...La solution la plus fiable c'est d'utiliser un timer que tu armes depuis la routine d'interruption de l'entrée et qui déclenche un nouvelle interruption 5ms plus tard pour positionner ta sortie.
Si les 6 signaux d'entrée sont asynchrones, alors il te faut 6 entrées interruptions (ça c'est faisable) mais tu n'aura pas 6 timers.
Tu doit pouvoir t'en sortir avec un en faisant des calculs de dates pour régler le registre OC1...
Merci Barbudor, je compte réutiliser le même timer puisque je n'ai jamais 2 canaux de sortie montés en simultanés.
Où puis-je trouver l'utilisation qui est faite des timer/counter par l'environnement Arduino ?
Je ne trouve pas cette info sur le site arduino, pourtant, les commandes micros() & millis() doivent bien utiliser un compteur avec le timer0...
Gardons ce topic pour parler de la lib SoftTimer.
Crée un nouveau topic dans le forum général - si tu ne l'as pas déjà fait - sur l'utilisation des timers hard.