Aide pour la fonction micros()

Bonjour/bonsoir !

Je souhaiterais créer un programme pour faire "clocker" un certain nombre de fois un compteur binaire (4040).
J'ai codé une petite partie

int horloge_4040 = 13;
int reset = 12;
long intervalle_horloge;
int etat_horloge;
void setup()
{
	pinMode(horloge_4040, OUTPUT);
        pinMode(reset, OUTPUT);
}

void loop()
{
  // Reset du 4040
   digitalWrite(reset, HIGH);
   delayMicroseconds(1);
   digitalWrite(reset, LOW);
   delayMicroseconds(1);
   
   // On fait "clocker" 199 fois le 4040
    for (int i=0;i<199;i++)
	{
          // Signal carré
          digitalWrite(horloge_4040, HIGH);
	  delayMicroseconds(1);
          digitalWrite(horloge_4040, LOW);
          delayMicroseconds(1);
         }
delay(1000);
}

Le code marche très bien, seulement, je dois éviter d'utiliser la fonction delay()/delayMicroseconds(). Je souhaite alors utiliser Micros(). J'ai crée ce code mais le résultat n'est absolument pas bon, les sorties du 4040 ne sont pas celles désirées =(

int horloge_4040 = 13;
int reset = 12;
long intervalle_horloge;
int etat_horloge;
void setup()
{
	pinMode(horloge_4040, OUTPUT);
        pinMode(reset, OUTPUT);
}

void loop()
{
  // Reset du 4040
   digitalWrite(reset, HIGH);
   delayMicroseconds(1);
   digitalWrite(reset, LOW);
   delayMicroseconds(1);
   
   // On fait "clocker" 199 fois le 4040
    for (int i=0;i<199;i++)
	{
          // Signal carré
         if((micros()-intervalle_horloge)>8)
			{
				etat_horloge=!etat_horloge;
				digitalWrite(horloge_4040, etat_horloge);
				intervalle_horloge = micros();
			}
         }
delay(1000);
}

Le "delay(1000);" en fin de code n'est pas à remplacer par micros(), il n'est pas génant.

Est ce que quelqu'un pourrait m'aider ? Merci d'avance, Adri

Dr_H2O2:
Bonjour/bonsoir !

Je souhaiterais créer un programme pour faire "clocker" un certain nombre de fois un compteur binaire (4040).
J'ai codé une petite partie
...
Est ce que quelqu'un pourrait m'aider ? Merci d'avance, Adri

Bonjour
rapide
etat_horloge ne devrait pas plutot etre un "boolean" plutot qu'un int ?

En effet, erreur de ma part, cependant ça n'améliore pas le problème... :grin:

Quelques remarques:

  • Dans le setup, l'état des broches n'est pas fixé donc clock et reset sont dans un état indéterminé
  • la variable intervalle_horloge n'est pas initialisée
  • Micros() est mal utilisée pour tester un hors temps
  • curieusement tu dis que delayMicroseconds(1) est un problème alors que delay(1000) n'en est pas un. Personnellement, j'aurais dis le contraire. en effet delayMicroseconds bloque le programme pendant un temps négligeable alors que delay(1000) bloque le programme pendant une seconde

Suggestion pour Micros()

    for (int i=0;i<199;i++)
	{
          // Signal carré
         intervalle_horloge = Micros();
         if((micros()> intervalle_horloge + 8)
			{
				etat_horloge=!etat_horloge;
				digitalWrite(horloge_4040, etat_horloge);
				intervalle_horloge = micros();
			}
         }

Maintenant, tu cherches à faire des impulsions de quelques µs et tu utilises digitalWrite qui est une fonction trèèèès inefficace. Tu devrais regarder de ce coté.
http://forum.arduino.cc/index.php/topic,46896.0.html
https://code.google.com/p/digitalwritefast/downloads/list

Salut !

J'ai essayé en déclarant reset et clock en tant que LOW, puis HIGH, rien ne change.
Qu'est ce que tu entends par initialiser intervalle_horloge ?

Pour ce qui est du delay(1000); il n'est pas important car il sert juste à laisser le temps pour vérifier que le code fonctionne (ce qui se fait visuellement avec des LED) . Par la suite il sera supprimé.

Autres soucis, le but serait de programmer des ATTiny avec l'Arduino ISP, donc les bibliothèques ne sont pas prises en charge (à moi que je me trompe ..), donc digitalWriteFast() ne fonctionnerait pas.

Dr_H2O2:
J'ai essayé en déclarant reset et clock en tant que LOW, puis HIGH, rien ne change.

Que cela ne change rien ne dispense pas de mettre une valeur par défaut sur les sorties. Ne serait-ce que pour être certain que le reset est dans le bon sens.

Dr_H2O2:
Qu'est ce que tu entends par initialiser intervalle_horloge ?

A la première itération de la boucle for cette variable ne contient rien puisqu'on ne lui a encore pas affecté de valeur et la première chose que tu fais c'est un test sur elle donc ????
il faudrait faire un:

intervalle_horloge = micros();

avant le for