Go Down

Topic: Avoir 2 boucles (ou plus) (Read 1 time) previous topic - next topic

lagoethe

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

Jean-François

#1
Dec 03, 2010, 06:17 pm Last Edit: Dec 03, 2010, 06:20 pm by jfs Reason: 1
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...

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

lagoethe

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?


Hexa Emails

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 ^^
J'apprends tous les jours!

Luj06

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




Guyt

#5
Dec 04, 2010, 11:21 am Last Edit: Dec 04, 2010, 11:23 am by Guyt54 Reason: 1
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.

Code: [Select]

#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
}


Go Up