Avoir 2 boucles (ou plus)

Bonjour,

J'aimerais avoir 2 boucles:
-La première qui va me chercher les info ici et là
-La deuxième qui aurait une fonction de PWM (mais qui n'utiliserai pas la fonction analogwrite) par exemple et qui devrai s'exécuter en permanence même lorsque les programme exécute des fonctions de la première boucle.
Comment faire (en gros dans le principe...)?
Est-ce possible?

Si ca n'est pas très clair, je tenterais à nouveau d'expliquer,..

Merci

Fais une nouvelle tentative.... je plaisante ;D

Tu ne peux pas avoir deux fonctions en parallèle, elles se feront l'une après l'autre.

Par contre rien ne t'empêche de faire un appel pour une fonction plus fréquemment que pour une autre...

Du coup y a pas moyen de faire une PWM "maison" à partir des ports DIGITAUX.
Ca soulève une question: Comment fonctionnent les PWM de la carte?

oui, moi aussi j'ai découvert que si voulais faire un PWM "maison" comme tu dis, cela occupera ma carte et elle ne pourra rien faire d'autre! à part si c'est une PWM basse fréquence, c'est a dire de période de plusieurs dizaines de millisecondes au moins, et là on peut tenter d'utilser micros() à la place de delay() et ainsi la carte peut faire d'autres choses.

Les PWM de l'arduino sont gérées différemments, c'est poiur cela que seuls certains ports sont compatibles PWM ^^

C'est possible d'écrire deux boucles en parallèle. Bien sûr les deux ne seront pas exécutées en même temps, elles devront laisser la main régulièrement à l'autre.

La bibliothèque Timer2 va vous y aider :
http://www.arduino.cc/playground/Main/MsTimer2

On programme les PWM de commande des moteurs de nos robots de cette manière là : http://vimeo.com/3801580

LujO6 a raison, le module TimerOne (ou Timer2) fonctionne très bien pour ce genre de chose.

Voici un exemple d'utilisation du module.

Tu verras que la Led 13 cligne au 500 milliseconde et que le port sériel est examiné au 10 milliseconde.

La fonction "Loop" ne fait strictement rien, comme c'est souvent le cas en programmation par événements.

#include <TimerOne.h>

// exemple d'utilisation de TimerOne
// référence: http://www.arduino.cc/playground/Code/Timer1

void SerialHandler(void)
// renvoie le car recu
// appel au  10 millisecondes
{
  char car ;
  if (Serial.available())
    {
      car = Serial.read() ;
      Serial.write(car) ;  
    }  
}

void BlinkHandler(void)
// cligne led 13
// appel au 500 milliseconde
{
  static bool flag ;
  
  flag = !flag ;
  digitalWrite(13,flag) ;  
}  


void TimerHandler(void)
// appelé tous les 10 milliseconde
{
  static int ticks = 0 ;
  
  SerialHandler() ;
  ticks++ ;
  if (ticks == 50) // 50 * 10 ms = 500 milli écoulé
     {
       BlinkHandler() ;
       ticks = 0 ;
     }   
}  

void setup()
{
  pinMode(13, OUTPUT);
  Serial.begin(9600) ;
  Timer1.initialize(10000);         // initialise Timer1 période 10 milliseconde
  Timer1.attachInterrupt(TimerHandler);  // attache TimerHandler
}

void loop()
{
  // Fait rien
}