Alternative à delay() (Fonctionne pas?)[resolu]

(deleted)

Pourquoi ne pas utiliser millis() tout simplement.
Voir dans les exemples installés avec l'IDE BlinkWithoutDelay

Ou une bibliothèque spécialisée dans le 'multitasking' à la arduino ?

(deleted)

bonsoir,
comme tu n'as pas publié tes paramétrages de timer, j'ai dû faire avec.
j'ai utilisé le même timer que toi, prescaler à 1/64, avec int sur overflow donc toutes les 1.024ms, ainsi que les mêmes structures que toi : fonction/appel/ISR.

#include <avr/io.h>
#include <avr/interrupt.h>

volatile uint16_t Tempo;

void cligno(uint16_t,uint8_t);

int main(void)
{
  DDRB=32;
  PORTB=223;
  TCCR2B=4;
  TIMSK2=1;
  sei();
  
  for(;;)
  {
    cligno(500,1);
    cligno(200,5);
    cligno(100,10);
  }
}

ISR(TIMER2_OVF_vect)
{if(Tempo)Tempo--;}

void cligno(uint16_t duree, uint8_t repet)
{
  while(repet)
  {
    PINB=32;
    Tempo=duree;
    while(Tempo){};
    PINB=32;
    Tempo=100;
    while(Tempo){};
    repet--;
  }
}

la DEL clignote bien au rythme demandé, sans blocage : ça reboucle bien après le 1er cycle, donc tout fonctionne.

ton erreur est située certainement ailleurs que dans ces petites portions de code.


MAIS
tu ne fais ici que réinventer delay, ta tempo est toujours aussi bloquante que la fonction Arduino !

ta solution est délirante ... et fausse (cf le message de ci-avant)
Utilise millis() comme tout le monde.
Si tu en trouves l'utilisation trop compliquée ... tu n'iras pas bien loin.
Désolé.

(deleted)

(deleted)

pepit:
La fonction delay() est trop instable et provoque des bugs.

Voilà une assertion ben péremptoire. Tu es sur que ce n'est pas plutôt ton programme qui provoque des bugs. :grin:
Cette affirmation confirme le post de biggil.

tempo est bien déclaré en volatile?

delay() a une résolution à la milliseconde pour des temporisations plus précises tu peux utiliser delayMicroseconds().
En même temps tu n'expliques pas en quoi delay() provoque des bugs que jusqu'ici personne n'a noté. Et pourtant c'est l'une des fonctions les plus utilisées puisqu'elle est dans les exemples de base de l'environnement.

salut pepit,

pepit:
un cylindre supplémentaire est largement mérité

merci, depuis que je ne roule plus qu'en 4, je regrette la rondeur du 5 ... et aimerais bien en avoir 1 de + !
mais on n'est pas là pour causer méca ...

j'aime bien ta démarche de construire tes propres fonctions : au moins tu sais où tu vas.
je trouve ta solution simple et efficace, mais elle comporte (à mes yeux) 2 défauts :

T2 tourne en permanence : ta 1ère ms est donc "tronquée", puisque l'appel à ta tempo ne remet pas T2 à zéro.
je sais : ce sont des cycles en plus ...

T2 tourne à 1.024ms : tu n'as donc pas la ms voulue, mais peut-être seule la régularité t'intéresse ?
pour une ms "parfaite" il faudrait changer de mode, mais pas CTC car l'OVF ne se produira pas : il a lieu à 0xFF, pas à 0x00.

pour en revenir aux remarques des autres :
pour du "multitâche" millis() (ou toute autre méthode utilisant un timer "libre", donc utilisable par plusieurs fonctions qui se chevauchent dans une boucle) est plus appropriée, mais d'accord avec toi son utilisation reste fastidieuse, même si je te pense (contrairement à certain) capable de la maîtriser.

mais ... je suis comme les autres :
je ne comprends pas ces perturbations lors de l'utilisation de delay() ?
à part une ISR trop longue ? qui lui ferait sauter un (ou des) cycle(s).
ou un intervention sur T1 ? qui perturberait son fonctionnement, ainsi que celui de millis() et de micros().
en tout cas, ça ne ferait qu'affecter la régularité, mais ça ne provoquerait pas de blocage ...

bon courage pour trouver l'erreur, ta fonction n'est pas en cause, "la vérité est ailleurs".

(deleted)

pepit:
Alors, je souhaite te remercier pour tes encouragements!
Pourtant du haut de ton "perchoir" il semble que tu n'a pas très bien compris le sens de mes propos....

...Par contre le "comme tout le monde" me gène au plus haut point, les "bêlants" malheureusement trop nombreux font comme ça.

Je ne vois pas trop ce qui dans les propos de Biggil permettent de dire qu'il est sur son perchoir...

Il donne sont avis et effectivement ton sujet donne l'impression que tu veux réinventer la roue.

Comme décrit dans la charte un sujet avec le problème bien exposé et documenté permet de mieux cerner les enjeux et aurait certainement évité ces dérapages.

Donc maintenant la partie morale: tu viens ici pour chercher de l'aide et de ce fait c'est à toi d'arrondir les angles pour que ça passe.
Certains sont ici depuis pas mal d'années et à titre bénévole, rien que pour ça ils méritent tout le respect même si parfois les propos dérangent car ils nous remettent devant notre "ignorance".

pepit:
Pourtant du haut de ton "perchoir" ..... Par contre le "comme tout le monde" me gène au plus haut point, les "bêlants" malheureusement trop nombreux font comme ça.

Uh uh uh.
Passe ton temps à réinventer la roue si tu veux.
Nous autres les bêlants préférons bêler ... tant pis pour toi si tu ne comprends pas pourquoi.

pepit:
Lors de mes diverses recherches sur le net, j'avais lu quelque part, que la fonctions delay() n'était pas fiable lorsque utilisée en sous routine, ce qui est le cas dans mon programme.

Non pas tout à fait.
delay() ne fonctionne pas dans une ISR car les interruptions étant masquées le compteur de delay() n'avance plus.
Par contre tu peux l'utiliser ailleurs sans problème.

(deleted)

(deleted)

pepit:
Biggil: Tes connaissances et capacités en programmation surclassent probablement la moyenne dont je ne fait certainement même pas partie, mais ça ne t'autorise pas a me tenir des propos vexant.
"ta solution est délirante ... tu n'iras pas bien loin" etc...

Il me semblait avoir été clair et je n'accepte pas que tu mettes une surenchère.

Aussi je te mets un e ban d'un mois à dater d'aujourd'hui.

jfs:
Il me semblait avoir été clair et je n'accepte pas que tu mettes une surenchère.

Aussi je te mets une ban d'un mois à dater d'aujourd'hui.

Heu... c'est quoi un ban.

jfs:
Il me semblait avoir été clair et je n'accepte pas que tu mettes une surenchère.

Aussi je te mets une ban d'un mois à dater d'aujourd'hui.

@jfs : une fois de plus tu prêches dans la mauvaise paroisse, mais ce n'est pas nouveau

les propos péjoratifs (et répétitifs) de biggil ne t'ont jamais incité à le bannir, pourquoi le ferais-tu pour quelqu'un qui ne fait que défendre son point de vue ? que je partage, d'ailleurs ... dans ce cas, bannis-moi également ...