Pages: [1]   Go Down
Author Topic: Avoir 2 boucles (ou plus)  (Read 1421 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 22
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Geneva
Offline Offline
Faraday Member
**
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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...

« Last Edit: December 03, 2010, 12:20:10 pm by jfs » Logged

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

0
Offline Offline
Newbie
*
Karma: 0
Posts: 22
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?

Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 104
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ^^
Logged

J'apprends tous les jours!

Sophia-Antipolis (06)
Offline Offline
God Member
*****
Karma: 4
Posts: 618
Rejoignez le club !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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à :



Logged

Montréal
Offline Offline
Newbie
*
Karma: 0
Posts: 48
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

« Last Edit: December 04, 2010, 05:23:38 am by Guyt54 » Logged

Pages: [1]   Go Up
Jump to: