Pages: [1]   Go Down
Author Topic: Programme s'arrête avant la fin !!  (Read 648 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 9
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Je débute avec les arduino et j'essai de faire un programme pour commander une lumière en SPI.
Je veux allumer la lumière progressivement donc j'envoi des commandes en boucle en augmentant la luminosité à chaque fois.
Seulement le problème c'est que pour pas que la lumière s'allume trop vite, j'ajoute un delay() entre chaque commande. Quand le delay est petit il n'y a pas de problème, mais passé une certaine limite (environ 20 ms), le programme n'effectue pas toutes les boucles et la suite de la méthode n'est pas exécutée non plus  smiley-sad
Voici une partie du code :
Code:
#include <EEPROM.h>
#include "init.h"
#include <avr/io.h>
#include <avr/pgmspace.h>
#include "convtab.h"

#define DATAOUT 11   //MOSI
#define DATAIN  12   //MISO
#define SCLK  13     //sck
#define CS 10        //cs

#define MIN3(x,y,z) ((y)<=(z)?((x)<=(y)?(x):(y)):((x)<=(z)?(x):(z)))
#define MAX3(x,y,z) ((y)>=(z)?((x)>=(y)?(x):(y)):((x)>=(z)?(x):(z)))

int i = 0;
int z = 0;
int j = 0;
int num = 0;
int itest = 0;

char mess[14];
char* message;
int mess_tab[5];

// Couleur
int red = 0;
int green = 0;
int blue = 0;

unsigned char r;
unsigned char g;
unsigned char b;

int h = 0;
int s = 0;
int v = 0;

int commande = 0;
unsigned char adresse[10];

int ledPin =  8;    // LED connected to digital pin 13
int ledPin2 = 5;
int BP = 2;

byte clr;

void setup()
{
  // start serial port at 9600 bps:
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(DATAOUT, OUTPUT);
  pinMode(DATAIN, INPUT);
  pinMode(SCLK,OUTPUT);
  pinMode(CS,OUTPUT);
  digitalWrite(CS,HIGH); //disable device
  
  // SPCR = 01010000
  //interrupt disabled,spi enabled,msb 1st,master,clk low when idle,
  //sample on leading edge of clk,system clock/4 rate (fastest)
  SPCR = (1<<SPE)|(1<<MSTR);
  clr=SPSR;
  clr=SPDR;
  initcc2500();
  
  delay(10);

}

void loop()
{

/*if(digitalRead(BP)==HIGH)
            GoLearnCodes();
  else {
  */
if (Serial.available() > 0) {
  for(i=0; i<14; i++)
{
            // read the incoming byte:
                if (Serial.available() > 0)
            {
                  mess[i] = Serial.read();
                }
delay(50);
}
if(!strncmp(mess, "init", 4))  init_mem();
else {
  message = strtok (mess,"/");
  z = 0;
  while (message != NULL)
  {
    mess_tab[z]=atol(message);
    message = strtok (NULL, "/");
    z++;
  }
  red = mess_tab[0];
  green = mess_tab[1];
  blue = mess_tab[2];
  if(!(red==0 & green==0 & blue==0))
  {
  EEPROM.write(0, red);
  EEPROM.write(1, green);
  EEPROM.write(2, blue);
 
  commande_lampe();
  
  }
    delay(300);
}

delay(100);
}

} // Fin loop

void init_mem() {

  for (int i = 0; i < 50; i++)
    EEPROM.write(i, 0);
  for(i=0; i<14; i++)
  {
    mess[i]=NULL;
  }
  delay(100);

}

void commande_lampe() { // 3 couleur, 7 éteindre, 5 allumer
    
    read_adress();
    delay(50);

    r = EEPROM.read(0);
    g = EEPROM.read(1);
    b = EEPROM.read(2);

    rgb_to_hsv(r,g,b);
    EEPROM.write(10, h);
    EEPROM.write(11, s);
    EEPROM.write(12, v);

    digitalWrite(ledPin, HIGH);
    envoi_commande(5, 0); // Allume la lampe
    digitalWrite(ledPin, LOW);
    
    // Augmente progressivement la luminosité
    for(v=0; v<256; v++)
    {
    envoi_commande(3, v);
    
    EEPROM.write(15, v);
    delay(15); // N'EXECUTE PAS LA SUITE NI LA FIN DE LA
                    // BOUCLE SI DELAY SUPERIEUR
    }

    digitalWrite(ledPin, HIGH);
    envoi_commande(7, 0); // Eteind la lampe
    EEPROM.write(16, (itest-200));
    digitalWrite(ledPin, LOW);

    delay(300);
}

void envoi_commande(int commande, int v)
{
  digitalWrite(ledPin2, HIGH);
      num++;
    desactivecs();
    while((spi_transfer(0xF5)&0x1F)>1) {
      desactivecs();
    }
    // Début de la trame
    spi_transfer(0x36);
    desactivecs();
    spi_transfer(0x7F);
    spi_transfer(0x0E);
    
    for(j=0;j<9;j++) {
      spi_transfer(adresse[j]);
    }
    
    spi_transfer(commande);
    spi_transfer(num++);
    //EEPROM.write((itest+15), commande);
    itest++;
    // Couleur
    spi_transfer(adjust_hue_for_livcol(h));
    spi_transfer(s);
    spi_transfer(v);
    
    desactivecs();
    spi_transfer(0x35);
    desactivecs();
    //delay(20);
    delayMicroseconds(100);
    digitalWrite(ledPin2, LOW);
}


Je ne comprend pas pourquoi il se stop si la méthode dure plus d'un certain temps. Il y a t'il un genre de timeout dans la boucle principale???

Merci

PS : le code est pas très propre dsl  :-[
Logged

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

Vous auriez pas une idée svp  :-/
il n'y aurait pas une limite de temps d'exécution quelque part?
le programme exécute environ 130 boucles sur les 255 quand le delay est à plus de 40 ms  smiley-sad
Logged

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

Après pas mal de test, j'ai pas trouvé de solution. J'ai pensé que le problème pouvais venir du SPI donc j'ai enlevé tout ce qui concerne le SPI et je l'ai remplacé par un petit delay. J'ai enlevé les méthodes pour tout mettre dans la boucle principale. La boucle for ne s'exécute toujours pas entièrement  >smiley-sad
Est-ce qu'il n'y aurait pas une sorte de timeout sur la boucle principale?
J'ai pensé que sa pouvait venir du watchdog mais il n'est pas activé.
Si vous avez une petite idée n'hésitez pas.
Merci  smiley-wink
Logged

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

je ne connais pas trop Arduino

en fait je decouvre (petit à petit) depuis deux à trois semaines ...

Comme manifestement, on ne peut pas faire du pas à pas ( un peu a la VB)

une solution consiste à metttre des flags dans ton code et à les faire sortir sur un lcd

Logged

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

Merci pour ton idée. Le fait de ne pas pouvoir faire de pas à pas est très gênant effectivement. Jusque là j'utilisais 2 leds que je faisais soit clignoter soit rester allumées un peu pour savoir à peu près où j'en suis mais ce n'est pas assez précis  smiley-sad
L'idée du lcd est très bonne, mais faut encore que j'en trouve un  smiley-razz
Enfin merci en tout cas, j'essairai de voir, et si quelqu'un d'autre à une idée... smiley-wink
« Last Edit: July 20, 2009, 04:35:01 pm by guigui » Logged

France
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3031
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Il faudrait peut être regarder du coté de EEPROM.write. Il semblerait que la librairie implémente un délai pour la gestion de l'écriture si on en croit la doc de référence http://file:///C:/temp/arduino-0012/reference/EEPROMWrite.html Peut être y a-t-il un effet de bord.

D'ailleurs au passage, tu fais des écritures dans l'EEPROM à tour de bras dans ton soft et il ne faut pas oublier que le nombre de cycles d'écriture en EPROM est limité à 100000
Logged

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

Merci pour ta réponse.
Effectivement la librairie intègre un delay à chaque écriture, sa allonge la durée du programme mais je ne vois pas pourquoi il s'arrêterai? Qu'entends tu par "effet de bord" (désolé je débute :s) ?
Sinon je sais que le nombre de cycle est limité mais c'est le seul moyen avec le matériel que j'ai pour vérifier le bon déroulement du programme  :-/

De toute façon j'ai trouvé une autre solution qui a l'air de marcher correctement et qui fait que la boucle principale loop() est beaucoup plus courte. Mais j'aimerai quand même comprendre, pour ne pas avoir le même problème sur un autre projet...
« Last Edit: July 25, 2009, 11:24:22 am by guigui » Logged

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

Il y a peut être un watchdog timer en route ? si la carte ne fait rien pendant x temps, elle reboote ?
Logged

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

la carte ne fait pas rien, elle est dans un boucle. J'ai pensé au Watchdog, donc j'ai fait ce qu'il faut pour le désactiver (même si je l'ai activé nulle part) mais ça n'a rien changé.
Merci quand même pour ta réponse  smiley-wink
Logged

Pages: [1]   Go Up
Jump to: