Go Down

Topic: raz de delay() sur interrupt (Read 1 time) previous topic - next topic

Artouste

bonjour à tous
pour les bons connaisseurs du coding

soit :

un code loop (pas beau, mais là n'est pas la question  :smiley-mr-green:  )
qui ne fait  structurellement que du

Code: [Select]
led on
delay(valeur1)
led off
delay (valeur2)


sur appel d'interrupt et surtout en sortie
est il possible facilement en code de faire une RAZ du delai "restant à courir"
en gros "squizzer" l'execution du delai restant apres  l'entrée en interruption ?
valeur1 valeur2 mis à 0 dans l'interrupt affectera t'il le delai restant à courir avant l'entrée dans l'interrupt ?

je sais bien que la methode n'est pas la plus adequate, mais c'est pour simplement faire un test "de faisabilité"  sur un code déjà pondu  tapé :smiley-mr-green:

je n'ai pas de base de test avant demain soir




B@tto

Je ne pense pas; l'argument étant stocké au lancement de la fonction tu l'auras dans l'os. Mais rien ne t'empêche de faire ton propre delay dépendant d'un flag  globale que tu pourras modifier :

Code: [Select]
void Mondelay(unsigned long Attente){
unsigned long Depart=millis();
Flag=1;
while(millis()<Depart+Attente && Flag==1); // Flag en global, modifier dans l'interruption
}
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

Artouste


Je ne pense pas; l'argument étant stocké au lancement de la fonction tu l'auras dans l'os. Mais rien ne t'empêche de faire ton propre delay dépendant d'un flag  globale que tu pourras modifier :

Code: [Select]
void Mondelay(unsigned long Attente){
unsigned long Depart=millis();
Flag=1;
while(millis()<Depart+Attente && Flag==1); // Flag en global, modifier dans l'interruption
}



bonjour B@tto
c'est intuitivement aussi ce que je pense

mais là j'ai des contraintes  8)

un code qui est ce qu'il est (du delay() )

la seule (quasi) option que j'ai est de "tripoter/RAZ" dans l'interrupt le delay() courant
j'imagine bien un petit tour par qq registres ou autre astuce(s) dans l'interrupt , mais là tres humblement par mauvaise connaissance (et faignantise   :smiley-mr-green: ) j'en appelle aux bons tripoteurs  :smiley-mr-green:

fdufnews

#3
Jan 10, 2014, 03:30 pm Last Edit: Jan 10, 2014, 03:35 pm by fdufnews Reason: 1
Je plusoie la proposition de B@tto.
Il n'y a pas à proprement parler d'interruption pour Delay().
Delay() s'appuie sur micro() et si tu ajoutes du codes dans micros() je te laisse imaginer l'impact.

D'autant que si tu regardes le code de millis (dans le fichiers wiring.c) c'est juste une stupide boucle while qu'il n'est pas très difficile de modifier pour lui faire prendre en compte un flag supplémentaire.
Code: [Select]
void delay(unsigned long ms)
{
uint16_t start = (uint16_t)micros();

while (ms > 0) {
yield();
if (((uint16_t)micros() - start) >= 1000) {
ms--;
start += 1000;
}
}
}

Une modification sur Delay aurait moins d'impact puisque le test est réalisé toute les millisecondes. et tu pourrais même le compenser en modification la constante pour le calcul de la nouvelle échéance de temps.


Artouste

merci pour vos reponses
la solution de facilité pas belle, pas satisfaisante intellectuellement mais efficace  :smiley-mr-green: a été
de passer par une boucle FOR de X fois un delay fixe de 100 ms (valeur choisie arbitrairement et satisfaisante)
le testeur distant ayant testé  :smiley-mr-green:

Go Up